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 base de données Schamming dans SQL Server 2008 pour créer et gérer des relations. J'ai exporté la sourceDB vers la destinationDB mais le diagramme n'est pas trouvé.

je regarde autour de moi pour essayer de comprendre comment exporter juste le diagramme que j'ai dans une base de données à une autre... Ce en ligne l'article de échoue depuis select * from dtproperties n'existe plus.

30
demandé sur Ash Machine 2010-10-26 03:02:25

6 réponses

@Ash j'avais le même problème. Voilà ce qu'on a fait pour le contourner...

il semble que les diagrammes de système soient stockés dans la table "sysdiagrammes". Donc, la première chose que vous devez faire est de déterminer la diagram_id du Diagramme que vous souhaitez copier. Exécuter la requête suivante pour les énumérer tous. ** Notez que vous devez remplacer "SourceDB" par le nom de votre base de données.

-- List all database diagrams
SELECT * FROM [SourceDB].[dbo].sysdiagrams

alors vous pouvez utiliser INSERT pour dupliquer le diagramme d'une base de données à une autre comme suivre. ** Noter de 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 à laquelle vous souhaitez copier. De plus, @SourceDiagramId doit être défini à l'id 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 le "principal_id" à 1 manuellement.

-- 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 il semble assez hacky d'autant plus que le diagramme est stocké entièrement dans un seul champ binaire "définition."

la réponse vient from:

http://www.dotnetspider.com/resources/21180-Copy-or-move-database-digram-from-for.aspx

44
répondu Justin 2010-12-18 20:53:29

Cela génère un importer de la chaîne:

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 un autre DB.

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
répondu Eduardo Cuomo 2014-10-09 14:39:36

Vous pouvez vous débarrasser de l' UPDATE déclaration en corrigeant votre INSERT état - en particulier la partie select. Vous insérez le diagram_id colonne dans le principal_id colonne (diagram_id est une identité).

Modifier:

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à dès la première fois.

7
répondu WayneS 2012-10-26 14:38:24

comme dans C Isaze réponse, il y a trois étapes simples:

1 - Créer le même nombre de "dummy" diagrammes dans le serveur cible où vous souhaitez copier les diagrammes

2-Ajouter le serveur cible comme un 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
répondu Zakaria 2017-05-23 12:10:32

Si les bases de données sont dans des serveurs différents, il peut y avoir des problèmes d'autorisation.

pour copier les sysdiagrammes, créez le même nombre de diagrammes "fictifs" dans le serveur cible où vous voulez copier les diagrammes, ajoutez le serveur cible comme un serveur lié dans le serveur source et ensuite lancez 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
répondu C Isaza 2013-04-10 21:41:06

il y a un outil pour exporter les diagrammes vers file et revenir dans une base de données que vous pouvez trouver ici:https://github.com/timabell/database-diagram-scm/

vous pouvez utiliser ceci en pointant votre base de données originale et en faisant une exportation, puis en pointant votre base de données cible et en faisant une importation.

1
répondu Tim Abell 2015-11-23 10:45:50