テスト データベースに新しいデータベース ダイアグラムを作成しました。これは sitde01 サーバーにあります。今、私はそれを別のサーバーに移動したいと考えています。別のサーバーに移行するにはどうすればよいですか。
3 に答える
それは可能ですが、それは王室の苦痛です。プロセスの概要といくつかのスクリプトを次に示します。
ダイアグラムは、sysDiagramsという名前の「システム」テーブルに格納されます。このテーブル(のみ?)は、SSMSのダイアグラムノードをクリックすると作成され、ダイアグラムをサポートするオブジェクトを作成するかどうかを尋ねられ、[はい]をクリックします。ソースデータベースとターゲットデータベースの両方でこれを行います。
「ソース」データベースに1つまたは複数の図を作成します。
sysDiagramsの構造と内容を確認します。diagram_id
列はID列であることに注意してください。ダイアグラムごとに1行が格納されます。(気にしませんが、SQL 2000では4行または5行でした。)
同じSQLインスタンス上の別のデータベースにコピーするには、テーブル間でINSERT ...SELECT...を実行するのが最も簡単な方法です。そのID列が邪魔になると、SET IDENTITY_INSERTに煩わされ、ターゲットコンピューターに新しいID値を割り当てる必要があります。刺激的ですが、それほど難しくはありません。
次のスクリプトは、あるデータベースから同じサーバー上にある別のデータベースにすべての図をコピーします(これは、ドロップして再作成される傾向のあるデータベースから、作成に時間がかかりすぎる複雑な図をアーカイブする方法です):
USE TargetDatabase
DELETE sysDiagrams
where name in (select name from SourceDatabase.dbo.sysDiagrams)
SET identity_insert sysDiagrams on
INSERT sysDiagrams (name, principal_id, diagram_id, version, definition)
select name, principal_id, diagram_id, version, definition
from SourceDatabase.dbo.sysDiagrams
SET identity_insert sysDiagrams off
別のSQLインスタンス(またはサーバー)上の別のデータベースにコピーするのは、さらに難しくなります。私は一時的に作成されたリンクサーバー定義を使用し、何年も前に弾丸を吐いたスクリプトを使用し、二度と変更する必要はありません(つまり、別の質問を投稿して、知っている人がどのように機能するかを教えてくれます)、適切な4つでスクリプトを変更します-パーツの命名規則。他のオプション(OPENROWSETなど)も可能ですが、私はそれらにあまり詳しくありません。
ダイアグラムをあるインスタンスまたはサーバーから別のインスタンスまたはサーバーに移動したいが、データベース全体を復元したくない場合は、次の操作を実行できます。
- 存在しない場合は、ターゲット サーバーにデータベースを作成します。また、SSMS の [データベース ダイアグラム] ノードをクリックして、dbo.sysDiagrams テーブルを作成する必要があります。
- 次に、ダイアグラムに必要なすべてのスキーマ情報を必ずインポートしてください。あなたの図はこれらを指すからです。つまり、テーブル、PK、FK などが存在する必要があります。
- ソース サーバーでデータベースをバックアップします。
- ターゲット サーバー上の一時データベースに復元します。このようにして、すべてのダイアグラム情報をターゲット サーバーに取得します。
一時データベースの dbo.sysDiagrams テーブルからターゲット データベースの dbo.sysDiagram テーブルに情報をコピーします。次のようなことができます (Philip Kelley のコードを採用):
USE TargetDatabase SET identity_insert sysDiagrams on INSERT sysDiagrams (name, principal_id, diagram_id, version, definition) select name, principal_id, diagram_id, version, definition from TempDatabase.dbo.sysDiagrams SET identity_insert sysDiagrams off
このソリューションは私にとって非常にうまくいきました。もちろん、すべてのダイアグラムが必要ない場合や、ターゲット データベースに他のダイアグラムが存在する場合は、select ステートメントをフィルター処理し、identity_insert 操作を行う必要がありますが、これはそれほど難しくありません。
データベース ダイアグラムを移動するには、そのダイアグラムに含まれるすべてのテーブルとトリガーを移行する必要があります。これを行う最も簡単な方法は、データベースをバックアップし、他のサーバーに復元することです。