代码之家  ›  专栏  ›  技术社区  ›  Ash Machine

如何将SQL Server 2008数据库关系图导出到其他数据库?

  •  30
  • Ash Machine  · 技术社区  · 14 年前

    我使用SQL Server 2008中方便的数据库图表工具来创建和管理关系。我已经将sourceDB导出到destinationDB,但是没有看到图表。

    online KB article 失败的原因 select * from dtproperties 已经不存在了。

    6 回复  |  直到 14 年前
        1
  •  45
  •   Justin    14 年前

    @我也有同样的问题。我们是这么做的。。。

    似乎系统图存储在“sysdiagrams”表中。因此,首先需要确定要复制的关系图的关系图id。运行以下查询以将它们全部列出。**注意,您需要用数据库的名称替换“SourceDB”。

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

    然后可以使用INSERT将关系图从一个数据库复制到另一个数据库,如下所示。**注意:再次将“SourceDB”替换为包含现有关系图的数据库的名称,将“DestinationDB”替换为要复制到的数据库的名称。还应该将@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
    

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

    这对我们很有用,特别是因为图完全存储在一个二进制字段“definition”中。


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

        2
  •  11
  •   Eduardo Cuomo Sajjad Ali Khan    10 年前

    这将生成 :

    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
    

    接下来,在其他数据库中运行生成的字符串。

    作为 程序 :

    -- =============================================
    -- 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
    
        3
  •  7
  •   SchmitzIT Mitch    12 年前

    UPDATE 通过修复您的 INSERT 语句-特别是选择部分。您正在插入 diagram_id 列到 principal_id 列(图表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
  •  5
  •   Community CDub    8 年前

    就像在 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 
    
        5
  •  4
  •   C Isaza    12 年前

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

    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
    
        6
  •  1
  •   Tim Abell    9 年前

    有一个工具可以将关系图导出到文件并返回到数据库中,您可以在此处找到: https://github.com/timabell/database-diagram-scm/

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