web-dev-qa-db-fra.com

Comment exporter un diagramme de base de données SQL Server 2008 vers une autre base de données?

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.

30
Ash Machine

@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

45
Justin

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.

Comme PROCÉDURE :

-- =============================================
-- 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
11
Eduardo Cuomo

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.

7
WayneS

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

enter image description hereenter image description hereenter image description here

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 
5
Zakaria

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
4
C Isaza

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.

1
Tim Abell