2010-10-25 7 views

risposta

44

@Ash Avevo lo stesso problema. Ecco cosa abbiamo fatto per aggirare il problema ...

Sembra che i diagrammi di sistema siano memorizzati nella tabella "sysdiagrams". Quindi la prima cosa che devi fare è determinare il diagramma_id del diagramma che desideri copiare. Esegui la seguente query per elencarli tutti. ** Nota è necessario sostituire "SourceDB" con il nome del database.

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

Quindi è possibile utilizzare INSERT per duplicare il diagramma da un database a un altro come segue. ** Nota ancora sostituire "SourceDB" con il nome del Database contenente il diagramma esistente e "DestinationDB" con il nome del Database che si desidera copiare. Anche @SourceDiagramId dovrebbe essere impostato sull'ID recuperato in precedenza.

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

Quindi è necessario impostare "principal_id" su 1 manualmente.

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

questo ha funzionato per noi sembra abbastanza hacky tanto più che il diagramma è memorizzato interamente in un unico campo "definizione" binario.

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

+0

Sta funzionando bene, anche per me. Grazie. –

7

Si può sbarazzarsi della dichiarazione UPDATE fissando la vostra dichiarazione INSERT - in particolare la porzione di selezione. Si sta inserendo la colonna diagram_id nella colonna principal_id (ID diagramma è un'identità).

modificarla in:

DECLARE @SourceDiagramId int = 1 
INSERT INTO [DestinationDB].[dbo].sysdiagrams 
SELECT [name],principal_id,version,definition from [SourceDB].[dbo].sysdiagrams 
WHERE diagram_id = @SourceDiagramId 

E presto, è tutto lì a destra la prima volta.

4

Se i database si trovano in server diversi, potrebbero esserci problemi di autorizzazione.

Per copiare i sysdiagrams, creare lo stesso numero di diagrammi "fittizi" nel server di destinazione in cui si desidera copiare gli schemi, aggiungere il server di destinazione come un server collegato nel server di origine e quindi eseguire lo 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 
11

Questo genera una stringa importazione:

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)) + ',' + 
     ' @[email protected]' 
    AS ExportQuery 
FROM 
    [dbo].[sysdiagrams] 
WHERE 
    [name] = '' -- Diagram Name 

Successivamente, si esegue la stringa generata in altri DB.

Come PROCEDURA:

-- ============================================= 
-- 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)) + ',' + 
     ' @[email protected]' 
    AS ExportQuery 
FROM 
    [dbo].[sysdiagrams] 
WHERE 
    [name] = @name 
+6

può essere utilizzato durante il trasferimento di diagrammi tra server diversi. Per evitare il limite di SQL Management Studio per le dimensioni dei risultati aggiungere 'per xml auto' alla fine di sql select. L'output XML è limitato a 2mb e può essere impostato su altro. Quindi basta tagliare lo sql dal xml ed eseguirlo su un altro server (sarà necessario avere almeno uno schema creato manualmente prima) –

+2

Questo è perfetto hack .. – Halim

5

Come in C Isaze risposta, ci sono tre semplici passi:

1- creare lo stesso numero di diagrammi "fittizi" nel server di destinazione in cui si desidera copiare gli schemi

2- Aggiungere il server di destinazione come un server collegato nel server di origine

enter image description here enter image description here enter image description here

3- eseguire questo script sul server di origine

update [LINKEDSERVER].TARGETDB.[dbo].sysdiagrams set [definition]= 
    (SELECT [definition] from SOURCEDB.[dbo].sysdiagrams WHERE diagram_id = 1) 
    where diagram_id=1 
1

C'è uno strumento per esportare i diagrammi su file e di nuovo in un database che potete trovare qui: https://github.com/timabell/database-diagram-scm/

Saresti in grado di usarlo puntandolo sul tuo database originale e facendo un'esportazione, quindi indicando il tuo database di destinazione e facendo un'importazione.