web-dev-qa-db-ja.com

SQL Server 2008データベースダイアグラムを別のDBにエクスポートする方法

SQL Server 2008の便利なデータベースダイアグラム作成ツールを使用して、関係を作成および管理しています。 sourceDBをdestinationDBにエクスポートしましたが、図が表示されません。

私はあるデータベースにある図だけを別のデータベースにエクスポートする方法を理解しようとしているところを見回しています...この オンラインKB記事select * from dtpropertiesはもう存在しません。

30
Ash Machine

@灰私は同じ問題を抱えていました。これを回避するために私たちが行ったのは...

システム図は「sysdiagrams」テーブルに格納されているようです。したがって、最初に行う必要があるのは、コピーするダイアグラムのdiagram_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

次に、「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

これは私たちにとってはうまくいきました。特に、ダイアグラムが完全に単一のバイナリフィールド「definition」に格納されているため、かなりハックに思えます。

答えは次のとおりです。
http://www.dotnetspider.com/resources/21180-Copy-or-move-database-digram-from-for.aspx

45
Justin

import stringが生成されます:

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

次に、生成された文字列を他のDBで実行します。

として[〜#〜]手順[〜#〜]

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

UPDATEステートメント、特に選択部分を修正することで、INSERTステートメントを取り除くことができます。 diagram_id列をprincipal_id列に挿入しています(diagram_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

そして、プレスト、それはすべてが初めてです。

7
WayneS

C Isaze 答えのように、3つの簡単なステップがあります。

1-図をコピーするターゲットサーバーに同じ数の「ダミー」図を作成します。

2-移行先サーバーをリンクサーバーとして移行元サーバーに追加する

enter image description hereenter image description hereenter 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
Zakaria

データベースが異なるサーバーにある場合は、権限の問題がある可能性があります。

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
4
C Isaza

図をファイルにエクスポートしてデータベースに戻すためのツールがあり、ここで見つけることができます: https://github.com/timabell/database-diagram-scm/

これを使用するには、元のデータベースをポイントしてエクスポートを実行し、次にターゲットデータベースをポイントしてインポートを実行します。

1
Tim Abell