SQL Server 2008の便利なデータベースダイアグラム作成ツールを使用して、関係を作成および管理しています。 sourceDBをdestinationDBにエクスポートしましたが、図が表示されません。
私はあるデータベースにある図だけを別のデータベースにエクスポートする方法を理解しようとしているところを見回しています...この オンラインKB記事 はselect * from dtproperties
はもう存在しません。
@灰私は同じ問題を抱えていました。これを回避するために私たちが行ったのは...
システム図は「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
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
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
そして、プレスト、それはすべてが初めてです。
C Isaze 答えのように、3つの簡単なステップがあります。
1-図をコピーするターゲットサーバーに同じ数の「ダミー」図を作成します。
2-移行先サーバーをリンクサーバーとして移行元サーバーに追加する
3-このスクリプトをソースサーバーで実行する
update [LINKEDSERVER].TARGETDB.[dbo].sysdiagrams set [definition]=
(SELECT [definition] from SOURCEDB.[dbo].sysdiagrams WHERE diagram_id = 1)
where diagram_id=1
データベースが異なるサーバーにある場合は、権限の問題がある可能性があります。
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
図をファイルにエクスポートしてデータベースに戻すためのツールがあり、ここで見つけることができます: https://github.com/timabell/database-diagram-scm/
これを使用するには、元のデータベースをポイントしてエクスポートを実行し、次にターゲットデータベースをポイントしてインポートを実行します。