J'utilise l'outil pratique de création de diagrammes de base de données dans SQL Server 2008 pour créer et gérer des relations. J'ai exporté la sourceDB vers la destinationDB mais le diagramme ne s'affiche pas.
Je cherche autour de moi en essayant de comprendre comment exporter uniquement le diagramme que j'ai dans une base de données vers une autre ... Ceci article de la base de connaissances en ligne échoue depuis select * from dtproperties
n'existe plus.
@Ash J'avais le même problème. Voici ce que nous avons fait pour le contourner ...
Il semble que les diagrammes système sont stockés dans la table "sysdiagrams". Donc, la première chose à faire est de déterminer le diagram_id du diagramme que vous souhaitez copier. Exécutez la requête suivante pour tous les lister. ** Notez que vous devez remplacer "SourceDB" par le nom de votre base de données.
-- List all database diagrams
SELECT * FROM [SourceDB].[dbo].sysdiagrams
Ensuite, vous pouvez utiliser INSERT pour dupliquer le diagramme d'une base de données à une autre comme suit. ** Notez à nouveau remplacer "SourceDB" par le nom de la base de données contenant le diagramme existant et "DestinationDB" par le nom de la base de données dans laquelle vous souhaitez copier. De plus, @SourceDiagramId doit être défini sur l'identifiant récupéré ci-dessus.
-- Insert a particular database diagram
DECLARE @SourceDiagramId int = 1
INSERT INTO [DestinationDB].[dbo].sysdiagrams
SELECT [name],diagram_id , version,definition from [SourceDB].[dbo].sysdiagrams
WHERE diagram_id = @SourceDiagramId
Ensuite, vous devez définir manuellement "principal_id" sur 1.
-- Update the principal id (no idea why, but it set the owner as some asp_Net User
UPDATE [DestinationDB].[dbo].sysdiagrams
SET principal_id = 1
Cela a fonctionné pour nous cela semble assez hacky d'autant plus que le diagramme est stocké entièrement dans un seul champ binaire "définition".
La réponse vient de:
http://www.dotnetspider.com/resources/21180-Copy-or-move-database-digram-from-for.aspx
Cela génère un chaîne d'importation:
SELECT
'DECLARE @def AS VARBINARY(MAX) ; ' +
'SELECT @def = CONVERT(VARBINARY(MAX), 0x' + CONVERT(NVARCHAR(MAX), [definition], 2) + ', 2) ;' +
' EXEC dbo.sp_creatediagram' +
' @diagramname=''' + [name] + ''',' +
' @version=' + CAST([version] AS NVARCHAR(MAX)) + ',' +
' @definition=@def'
AS ExportQuery
FROM
[dbo].[sysdiagrams]
WHERE
[name] = '' -- Diagram Name
Ensuite, vous exécutez la chaîne générée dans une autre base de données.
-- =============================================
-- Author: Eduardo Cuomo
-- Description: Export Database Diagrama to SQL Query
-- =============================================
CREATE PROCEDURE [dbo].[Sys_ExportDatabaseDiagram]
@name SYSNAME -- Diagram Name
AS
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SELECT
'DECLARE @def AS VARBINARY(MAX) ; ' +
'SELECT @def = CONVERT(VARBINARY(MAX), 0x' + CONVERT(NVARCHAR(MAX), [definition], 2) + ', 2) ; ' +
' EXEC dbo.sp_creatediagram' +
' @diagramname=''''' + [name] + ''''',' +
' @version=' + CAST([version] AS NVARCHAR(MAX)) + ',' +
' @definition=@def'
AS ExportQuery
FROM
[dbo].[sysdiagrams]
WHERE
[name] = @name
Vous pouvez vous débarrasser de l'instruction UPDATE
en corrigeant votre instruction INSERT
- en particulier la partie select. Vous insérez le diagram_id
dans la colonne principal_id
colonne (id_schéma est une identité).
Changez-le en:
DECLARE @SourceDiagramId int = 1
INSERT INTO [DestinationDB].[dbo].sysdiagrams
SELECT [name],principal_id,version,definition from [SourceDB].[dbo].sysdiagrams
WHERE diagram_id = @SourceDiagramId
Et hop, tout est là-dedans dès la première fois.
Comme dans C Isaze answer, il y a trois étapes simples:
1- Créez le même nombre de diagrammes "factices" dans le serveur cible où vous souhaitez copier les diagrammes
2- Ajouter le serveur cible en tant que serveur lié dans le serveur source
3- Exécutez ce script sur le serveur source
update [LINKEDSERVER].TARGETDB.[dbo].sysdiagrams set [definition]=
(SELECT [definition] from SOURCEDB.[dbo].sysdiagrams WHERE diagram_id = 1)
where diagram_id=1
Si les bases de données se trouvent sur des serveurs différents, il peut y avoir des problèmes d'autorisation.
Pour copier les diagrammes système, créez le même nombre de diagrammes "factices" sur le serveur cible où vous souhaitez copier les diagrammes, ajoutez le serveur cible en tant que serveur lié dans le serveur source, puis exécutez le script:
SELECT * from [LINKEDSERVER].TARGETDB.[dbo].sysdiagrams
SELECT * from SOURCEDB.[dbo].sysdiagrams
update [LINKEDSERVER].TARGETDB.[dbo].sysdiagrams set definition=
(SELECT definition from SOURCEDB.[dbo].sysdiagrams WHERE diagram_id = 1)
where diagram_id=1
-- the first 2 select commands will confirm that you are able to connect to both databases
-- then change the id as required to copy all the diagrams
Il existe un outil pour exporter les diagrammes vers un fichier et les renvoyer dans une base de données que vous pouvez trouver ici: https://github.com/timabell/database-diagram-scm/
Vous pourrez l'utiliser en la pointant sur votre base de données d'origine et en effectuant une exportation, puis en pointant votre base de données cible et en effectuant une importation.