次の方法で共有


データベース スキーマの比較と同期

更新 : 2010 年 6 月

このトピックの内容は、次の製品に該当します。

Visual Studio Ultimate

Visual Studio Premium

Visual Studio Professional 

Visual Studio Express

トピック該当 トピック該当 トピック該当なし トピック該当なし

Visual Studio Premium または Visual Studio Ultimate を使用して、ターゲット スキーマとソース スキーマを比較できます。 各相違点について、ソースに合わせてターゲットを更新するかどうかを指定できます。 ターゲットに更新を直接書き込んだり、更新スクリプトを Transact-SQL エディターまたはファイルにエクスポートしたりできます。 また、データベース プロジェクトの一部、またはスタンドアロン ファイルとして、比較を保存することもできます。 比較を保存することで、比較操作の繰り返しや、同じソースとターゲットの再同期を簡単に実行できます。

スキーマ比較の種類

データベース スキーマ定義を含む次のエンティティを比較できます。

  • SQL Server データベース - SQL Server 2008 インスタンスまたは SQL Server 2005 インスタンス上で実行されるデータベース

  • データベース プロジェクト - SQL Server 2008 データベースまたは SQL Server 2005 データベースの定義を含み、ビルド時に .dbschema ファイルを生成するプロジェクト

  • サーバー プロジェクト - SQL Server 2008 サーバーまたは SQL Server 2005 サーバーの "マスター" データベースのサーバー オブジェクトおよびオブジェクトの定義を含み、ビルド時に .dbschema ファイルを生成するプロジェクト

  • データ層アプリケーション コンポーネント (DAC) - ビルド時に .dacpac ファイルを生成するプロジェクト

  • .dbschema ファイル - データベース プロジェクトまたはサーバー プロジェクトのビルド時の出力

  • .dacpac ファイル - データ層アプリケーション コンポーネント (DAC) プロジェクトのビルド時の出力

次の表は、比較できるスキーマの種類と、ターゲットに更新を書き込むことができるかどうかの一覧です。

下はソース、

右はターゲット

SQL Server データベース

データベース プロジェクト

.dbschema ファイル

サーバー プロジェクト

DAC プロジェクト

.dacpac ファイル

SQL Server データベース

比較 + 更新

比較 + 更新

比較

比較 + 更新

比較

比較

データベース プロジェクト

比較 + 更新

比較 + 更新

比較

なし

なし

なし

.dbschema ファイル

比較 + 更新

比較 + 更新

比較

比較 + 更新

なし

なし

サーバー プロジェクト

比較 + 更新

なし

比較

比較 + 更新

なし

なし

DAC プロジェクト

比較

なし

なし

なし

比較 + 更新

比較

.dacpac ファイル

比較

なし

なし

なし

比較 + 更新

比較

この表の見方としては、まず、左端の列に目的のソース スキーマがある行を見つけます。 次に、一番上の行に目的のターゲット スキーマがある列を見つけます。 該当の列と行が交差する欄に、ソースとターゲットを比較できるだけであるか、または比較してから必要に応じてターゲット スキーマを更新できるかが示されています。

サーバー スキーマとデータベース スキーマ、またはデータベース スキーマとサーバー スキーマは比較できません。 比較できないスキーマとして、.dbschema ファイルの形式のスキーマなどがあります。 たとえば、サーバー プロジェクトと、サーバー プロジェクトから作成された .dbschema ファイルとの比較は可能です。

2 つのデータベース プロジェクトを比較できるのは、それらのプロジェクトが Visual Studio の同じソリューション内に含まれている場合だけです。

ヒント

ソース データベースとターゲット データベース プロジェクト (.dbproj) は比較できますが、データベース プロジェクトを変更し、その変更をデータベースに配置する必要があります。 プロジェクト (.dbproj) を変更して配置すると、プロジェクトがバージョン管理下にあるために自分が行った変更と他のチーム メンバーによる変更が競合するリスクを軽減できます。

データベース スキーマを更新する際のデータ損失の回避

スキーマ比較を使用してデータベース スキーマを更新すると、データ損失が発生する場合があります。 データ損失を防ぐには、ソースとターゲットのオブジェクトの名前に注意してください。特に、ターゲットのスキーマを更新する直前に注意が必要です。

たとえば、ソース データベースのテーブル名を "Order_Details" から "OrderDetails" に変更し、ターゲット データベースは変更しない状態で、2 つのデータベースを比較するとします。 同期する前は、両方のテーブルのデータは同じです。 ところが、ターゲットを更新すると、Order_Details テーブルが削除され、OrderDetails テーブルが作成されます。 Order_Details テーブルのすべてのデータが損失する可能性があります。

データ損失を回避するには、[ツール] メニューの [オプション] をクリックし、[データ損失が発生する場合にスキーマの更新をブロック] チェック ボックスをオンにします。 また、データベースに更新を書き込む前は、常にデータベースをバックアップしてください。 また、スキーマの比較時に比較のオプションを指定することもできます。 詳細については、「方法 : データベース スキーマの比較に関するオプションを設定する」を参照してください。

重要

データベース プロジェクトのオブジェクト名を変更するためにリファクタリングを使用する場合、リファクタリング ログを使用して、データベースのビルドおよび配置時のデータ損失を回避することもできます。 このログには、変更の意図が保持されます。 たとえば、テーブル名を適切に変更できます。

スキーマ比較と増分配置の相違点

更新を既存のデータベースに配置する場合のプロセスは、スキーマ比較を使用して 2 つのデータベース スキーマを同期する場合のプロセスとよく似ています。 ただし、スキーマ比較には重要な相違点が 1 つあります。既定で、スキーマ比較は拡張プロパティを無視します。

拡張プロパティと権限を無視しない場合、すべてのスキーマ比較セッション、または現在のセッションについて、スキーマ比較のオプションを変更できます。 詳細については、「方法 : データベース スキーマの比較に関するオプションを設定する」を参照してください。

一般的なタスク

次の表に、このシナリオをサポートする一般的なタスクの説明と、それらのタスクを正常に完了する方法の詳細へのリンクを示します。

一般的なタスク

関連する参照先

実習を行う: 機能紹介のチュートリアルを実施することで、2 つのデータベース、またはデータベースとプロジェクト (.dbproj) を比較する方法を理解することができます。

チュートリアル : 2 つのデータベースのスキーマを比較する

チュートリアル: データベースとデータベース プロジェクトのスキーマの比較

スキーマを比較する方法を制御するオプションを設定する: スキーマを比較する方法を制御する詳細設定を構成できます。 特定の種類の相違を無視することができます。たとえば、空白、ファイル グループ、コメントなどです。 また、ユーザーやログインなど、オブジェクトのカテゴリを無視することもできます。 生成された更新スクリプトを制御するオプションを指定できます。

方法 : データベース スキーマの比較に関するオプションを設定する

データベースまたはサーバー オブジェクトを比較し、必要に応じてソースに合わせてターゲットを更新する: 比較するソース スキーマとターゲット スキーマを指定すると、結果が [スキーマ比較] ウィンドウに表示されます。 相違の詳細と、データベースの同期に使用される更新スクリプトを表示できます。 各スキーマ比較は、プロジェクトまたはスタンドアロンの .scmp ファイルに保存できます。 ソース スキーマとターゲット スキーマの各相違について動作を指定し、更新をターゲットに書き込むことができます。 また、更新スクリプトを Transact-SQL エディターまたはファイルにエクスポートして、ターゲットに変更を適用する前に確認することもできます。

方法: データベース スキーマを比較する

スキーマ比較の結果について

問題をトラブルシューティングする: データベース スキーマを比較して同期するときに発生する可能性がある一般的な問題をトラブルシューティングする方法の詳細について学習できます。

スキーマ比較に関する問題のトラブルシューティング

スキーマ比較の結果について

[スキーマ比較] ウィンドウには、比較するオブジェクトごとに 4 つの列が表示されます。 各列の内容について、次の表で説明します。

状態

  • 等しい - オブジェクトの定義が同じで、ソース スキーマとターゲット スキーマのオブジェクトが同じです。

  • 新規 - ソース スキーマに存在するオブジェクトが、ターゲット スキーマには存在しません。

  • 見つかりません - ターゲット スキーマに存在するオブジェクトが、ソース スキーマには存在しません。

  • 異なる定義 - オブジェクトの定義がソース スキーマとターゲット スキーマとで異なります。

  • 異なる依存関係 - オブジェクトの定義は同じですが、ソース スキーマとターゲット スキーマのオブジェクトが異なります。

たとえば、ソース スキーマのテーブル定義を変更し、ターゲット スキーマは変更せずに、比較するとします。 テーブルは [異なる定義] と見なされ、そのテーブルを含むスキーマは [異なる依存関係] と見なされます。

ソース名 (ソース {プロジェクト、データベース、またはプロジェクト ファイル (.dbschema)})

比較するソース プロジェクト、データベース、またはプロジェクト ファイルの名前。

更新アクション

  • スキップ - ターゲット スキーマのオブジェクトは更新されません。 オブジェクトに変更された依存関係がある場合、行を展開して相違点がある参照先オブジェクトを確認するように指示するアイコンが表示されます。

  • 参照のスキップ - オブジェクトは参照先データベースにあり、削除または作成する必要はありません。

  • 作成 - 更新を書き込むとき、または更新スクリプトを実行するとき、オブジェクトが作成されます。

  • 更新 - 更新を書き込むとき、または更新スクリプトを実行するとき、ソース スキーマに合わせてオブジェクト定義が更新されます。

  • ドロップ - 更新を書き込むとき、または更新スクリプトを実行するとき、ターゲット スキーマからオブジェクトが削除されます。

メモメモ
既定のアクションは、ステータスで決まります。[等しい] オブジェクトの場合、既定のアクションは [スキップ] です。これは変更できません。[新規] オブジェクトの場合、既定のアクションは [作成] ですが、[スキップ] を指定できます。[見つかりません] オブジェクトの場合、既定のアクションは [ドロップ] ですが、[スキップ] を指定できます。[異なる定義] の場合、既定のアクションは [更新] ですが、[スキップ] を指定できます。[異なるオブジェクト] の場合、既定のアクションは [スキップ] です。これは変更できません (この場合、オブジェクトは等しいのですが、新規オブジェクト、不明オブジェクト、または変更されたオブジェクトが含まれます)。

ターゲット名 (ターゲット {プロジェクト、データベース、またはプロジェクト ファイル (.dbschema)})

比較するターゲット プロジェクト、データベース、またはプロジェクト ファイルの名前。

関連するシナリオ

  • 1 つ以上のテーブルのデータを参照データベースのデータと比較して同期する
    データ比較を使用して、ソース データベースとターゲット データベースのテーブルのデータを同期できます。

  • データベース オブジェクトへのすべての参照の名前変更
    リファクタリングを使用して、データベース オブジェクトに対するすべての参照の名前を変更できます。 ビルドと配置を行う場合、リファクタリング ログは、変更の意図を保持し、データ損失のリスクを軽減するために使用されます。

  • データベースのビルドおよび分離開発環境への配置
    ターゲット データベースを更新するにはスキーマ比較を使用できますが、データベース プロジェクトを変更する場合や、その変更を構築してターゲット データベースに配置する場合は、チームで検討する必要があります。 この方法を実行する場合、データベース プロジェクトで実行するリファクタリング操作の意図を保持します。 また、データベースの更新にスキーマ比較を使用する他のチーム メンバーによって、変更が上書きされるリスクを軽減します。

履歴の変更

日付

履歴

理由

2010 年 6 月

顧客からのフィードバックに対応するために、トピック内にある最初の表の見方を追記しました。

カスタマー フィードバック

2010 年 8 月

プロジェクトを比較できるのはそれらのプロジェクトが同じソリューション内に含まれている場合だけであることを明記しました。

カスタマー フィードバック