2010-10-25 159 views

回答

44

@Ash我遇到了同样的问题。以下是我们为解决它而做的...

看起来系统图存储在“sysdiagrams”表中。因此,您需要做的第一件事是确定您想要复制的关系图的diagram_id。运行以下查询将其全部列出。 **请注意,您需要将“SourceDB”替换为数据库的名称。

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

然后,您可以使用INSERT将图从一个数据库复制到另一个数据库,如下所示。 **再次用包含现有图表和“DestinationDB”的数据库的名称替换“SourceDB”,并将其替换为要复制到的数据库的名称。还应该将@SourceDiagramId设置为上面检索的ID。

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

然后,您需要手动设置“principal_id”为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 

这个工作对我们来说似乎很哈克尤其是因为图是完全存储在单个二进制领域“定义”。

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

+0

它工作得很好,对我来说也是如此。谢谢。 – 2016-02-09 15:52:10

7

您可以通过固定的INSERT声明摆脱UPDATE声明 - 特别是选择部分。您将diagram_id列插入principal_id列(diagram_id是标识)。

将其更改为:

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

而且似的,这一切都在有正确的第一次。

4

如果数据库位于不同的服务器中,则可能存在权限问题。

要复制sysdiagrams,创造同样多的,你要复制的图表,添加目标服务器在源服务器链接服务器,然后运行该脚本在目标服务器的“虚拟”图:

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

这产生进口串

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 

接下来,你就可以运行其它数据库生成的字符串。

作为程序

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

这可以在不同服务器之间传输图表时使用。为了避免SQL Management Studio对结果大小的限制,在sql select的末尾添加'for xml auto'。 XML输出限制为2MB,可以设置更多。然后,简单地从xml中剪切sql并在其他服务器上执行(至少需要手动创建一个图表) – 2014-10-09 12:04:56

+2

这是完美的hack .. – Halim 2015-03-16 12:55:05

5

正如C Isaze答案,有三个简单的步骤:

1-创建相同数量的目标服务器的“虚拟”图要复制图

2-添加目标服务器作为源服务器链接服务器

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

3-运行此脚本源服务器上

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

有导出图表到文件,并回,你可以在这里找到一个数据库的工具:https://github.com/timabell/database-diagram-scm/

通过将它指向原始数据库并执行导出,然后指向目标数据库并执行导入,可以使用它。

相关问题