2010-10-25 17 views

Respuesta

44

@Ash Estaba teniendo el mismo problema. Esto es lo que hicimos para evitarlo ...

Parece que los diagramas del sistema se almacenan dentro de la tabla "sysdiagrams". Entonces, lo primero que debe hacer es determinar el diagram_id del Diagrama que desea copiar. Ejecute la siguiente consulta para listarlos todos. ** Tenga en cuenta que necesita reemplazar "SourceDB" con el nombre de su base de datos.

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

Luego puede usar INSERT para duplicar el diagrama de una base de datos a otra de la siguiente manera. ** Nota nuevamente, reemplace "SourceDB" con el nombre de la base de datos que contiene el diagrama existente y "DestinationDB" con el nombre de la base de datos en la que desea copiar. También @SourceDiagramId debe establecerse en el id recuperado anteriormente.

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

Luego debe establecer el "principal_id" en 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 

Esto funcionó para nosotros parece bastante hacky sobre todo porque el diagrama se almacena en su totalidad en una sola "definición" binario campo.

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

+0

Está funcionando bien, para mí también. Gracias. –

7

Usted puede deshacerse de la declaración UPDATE mediante la fijación de su estado de cuenta INSERT - específicamente la parte de selección. Está insertando la columna diagram_id en la columna principal_id (diagram_id es una identidad).

Cambiar a:

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

Y listo, todo está allí bien la primera vez.

4

Si las bases de datos están en servidores diferentes, puede haber problemas de permisos.

Para copiar los sysdiagrams, crear el mismo número de diagramas "ficticios" en el servidor de destino en la que desea copiar los diagramas, añadir el servidor de destino como un servidor vinculado en el servidor de origen y luego ejecutar el 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

Esto genera una cadena de importación :

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 

a continuación, se ejecuta la cadena generada en otra base de datos.

Como PROCEDIMIENTO:

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

esto se puede utilizar al transferir diagramas entre diferentes servidores. Para evitar el límite de SQL Management Studio para el tamaño del resultado, agregue 'para xml auto' al final de sql seleccione. La salida XML está limitada a 2mb y puede configurarse a más. Luego simplemente corte el sql del xml y ejecútelo en otro servidor (necesitará tener al menos un diagrama creado manualmente antes) –

+2

Este es un truco perfecto. – Halim

5

Como en C Isaze respuesta, hay tres pasos simples:

1- Crear el mismo número de diagramas "ficticios" en el servidor de destino en la que desea copiar el diagramas

2- Añadir el servidor de destino como un servidor vinculado en el servidor de origen

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

3- Ejecutar este proceso de servidor de origen

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

Hay una herramienta para exportar los diagramas de presentar y de nuevo en una base de datos que se pueden encontrar aquí: https://github.com/timabell/database-diagram-scm/

Podrías usar esto apuntando a tu base de datos original y haciendo una exportación, y luego apuntando a tu base de datos de destino y haciendo una importación.

Cuestiones relacionadas