データベース スキーマ比較の概要
Visual Studio Team System Database Edition を使用すると、2 つのデータベースのスキーマを比較し、ソースからターゲットにスキーマ オブジェクトの一部またはすべてを適用するかどうかを決定できます。このシナリオの 1 つの例として、「データベース スキーマを比較する理由」を参照してください。
次のスキーマを比較できます。
同じデータベースの 2 つのバージョンが格納された 2 つのデータベース
1 つの Visual Studio データベース プロジェクトと 1 つのデータベース
比較を構成する場合、[スキーマ比較] ダイアログ ボックスでソースとターゲットを指定します。詳細については、「方法 : 2 つのデータベースのスキーマを比較する」を参照してください。
スキーマの比較が終了すると、比較の結果がビューに表示されます。詳細については、「方法 : スキーマの相違点を表示する」を参照してください。この後で、スキーマ要素をソースからターゲットに反映できます。詳細については、「方法 : データベース スキーマを同期する」を参照してください。
データベース スキーマを比較する理由
ここでは、あるシナリオを例に挙げて、データベース スキーマを比較する必要がある状況について説明します。このシナリオでは、2 つのデータベースを比較する代わりに、1 つのデータベースと 1 つのデータベース プロジェクトを比較します。
チームによるデータベース開発
あるデータベース開発者が、Database Edition データベース プロジェクトを使用してデータベースを作成しています。開発チームは、長期間にわたって継続的にデータベースの新しいバージョンをビルドし、それらをテスト サーバーに配置しています。開発チームの他のメンバも、データベースのデザインを行います。
データベース開発者は、データベース スキーマに対して一連の変更を行い、自分のコンピュータで変更のテストが完了したところです。エラーが見つからなかったため、チームの品質保証担当者が変更をテストできるように、更新をテスト サーバーに発行します。
データベース プロジェクトを開き、[新しいスキーマ比較] ダイアログ ボックスを使用して、テスト サーバーとの接続を確立します。プロジェクト (ソース) と配置済みデータベース (ターゲット) を比較し、2 つのエンティティの間で多くのオブジェクトに相違点があることを確認しました。ただし、相違点のある大部分のオブジェクトは自分の担当範囲外であることもわかりました。これらのオブジェクトは他のメンバによって変更されているため、上書きしないようにします。
そこで、自分が作業したオブジェクトだけを選択し、[更新の書き込み] をクリックします。この操作で、データベースの一部が更新され、他の部分は変更されません。変更が配置されたため、テストを実行できる状態になりました。
次のセクションでは、変更したスキーマ オブジェクトが Team Edition for Database Professionals でどのように表示されるか、および実行するアクションを決定する方法について説明します。
スキーマ比較の制御
スキーマ比較処理とスクリプト生成処理を制御するオプションは、2 つのレベルで指定できます。全体的なオプションを設定するには、[ツール] メニューの [オプション] をクリックします。次に [データベース ツール] を展開して [スキーマ比較] をクリックします。全体的な設定のオプションは、個別の比較でオーバーライドしない限り、それ以降に実行するすべてのスキーマ比較操作に対して有効になります。
スキーマ比較の表示
2 つのスキーマを比較すると、[スキーマ比較] ウィンドウのグリッドに比較の結果が表示されます。このウィンドウには、データベースのオブジェクトを同期するスクリプトを含め、それらのオブジェクトに関する情報も表示されます。
スキーマ比較の結果について
オブジェクト定義の表示
更新スクリプトのプレビュー
スキーマ比較の結果について
[スキーマ比較] ウィンドウは、Visual Studio のメインの編集領域になります。このウィンドウには、両方のスキーマのすべてのオブジェクトが、展開可能なフォルダに整理して表示されます。表示されるオブジェクトの種類は、テーブル、ビュー、ストアド プロシージャ、関数、ユーザー定義型、規則、既定値、フル テキスト カタログ、ユーザー、およびロールです。
このウィンドウのそれぞれの列に、各オブジェクトに関する次の情報が表示されます。
最初の [状態] 列には、比較したオブジェクトの比較結果の状態が表示されます。
"等しい" ソース オブジェクトとターゲット オブジェクトの構造が同じです。
"異なります" ソース オブジェクトとターゲット オブジェクトの構造が異なります。
"見つかりません" ターゲットに存在するオブジェクトが、ソースには存在しません。
"新規" ソースに存在するオブジェクトが、ターゲットには存在しません。
メモ : オブジェクトは、ユーザーが設定したスキーマ比較オプションのコンテキストで等しいかどうかが判定されます。詳細については、「スキーマ比較の制御」を参照してください。
2 番目の列には、ソースのスキーマ オブジェクトの名前が、オブジェクトの種類別に階層構造に整理して表示されます。この列では、ノードを展開したり折りたたんだりして、必要な種類のオブジェクトのみを表示できます。
3 番目の [更新アクション] 列には、特定のオブジェクトに対して、その 2 つのスキーマの構造を同一にするアクションが表示されます。変更はターゲットにのみ書き込まれます。[更新アクション] 列の値は [状態] 列の値に対応しています。すべてのオブジェクトで、[スキップ] アクションを選択できます。このアクションでは、ターゲットのオブジェクトが比較前の状態に保たれます。[依存関係を含める] チェック ボックスがオンの場合は、更新をスキップできません (このチェック ボックスの状態を確認するには、[ツール] メニューの [オプション] をクリックします)。たとえば、インデックス、キー、トリガの設定された新しいテーブルがソース データベースに含まれる場合、インデックス、キー、およびトリガを追加すると、テーブルをスキップできません。
メモ : [更新アクション] 列の値を変更したときに実際に変更されるのは、実行する更新スクリプトです。つまり、このスクリプトによって、[更新の書き込み] をクリックしたときに表示される結果が変更されます。詳細については、「方法 : データベース スキーマを同期する」を参照してください。
これらのアクションの概要を次の表に示します。
比較の状態 |
実行できる更新アクション (太字は既定値) |
既定のアクションの説明 |
等しい |
スキップ |
スキップは等しいオブジェクトに対する既定のアクションで、オブジェクトは変更されません。 |
異なります |
更新、スキップ |
更新は等しくないオブジェクトに対する既定のアクションで、ターゲット データベースのオブジェクトの構造が変更されます。たとえば、更新アクションで、テーブルの列の追加、削除、または名前の変更が実行されます。 |
見つかりません |
ドロップ、スキップ |
ドロップはソース データベースに存在しないオブジェクトに対する既定のアクションで、ターゲット データベースのオブジェクトが削除されます。 |
新規 |
作成、スキップ |
作成はターゲット データベースに存在しないオブジェクトに対する既定のアクションで、ターゲット データベースにオブジェクトが作成されます。 |
- 4 番目の列には、ターゲットのスキーマ オブジェクトの名前が表示されます。
オブジェクト定義の表示
[スキーマ比較] ウィンドウに表示される各データベース オブジェクトの SQL 定義を表示することもできます。メイン ドキュメント ウィンドウでオブジェクトの行をクリックすると、読み取り専用のオブジェクトの定義ペインにそのオブジェクトの定義が表示されます。オブジェクトの定義ペインの左側には選択したオブジェクトのソースでの定義が表示され、右側には選択したオブジェクトのターゲットでの定義が表示されます。それぞれの横にあるスクロール バーを使用すると、両方の定義を同時にスクロールできます。ソース オブジェクトとターゲット オブジェクトで定義の異なる行が強調表示されます。
オブジェクトの定義には、比較を実行した時点のオブジェクトの状態が反映されます。[更新アクション] 列の値を変更した場合や、このスキーマ比較セッションの範囲外でオブジェクトに変更を加えた場合、この定義は変更されません。
更新スクリプトのプレビュー
スキーマを比較すると同期スクリプトも自動的に生成され、[スキーマ更新スクリプト] ウィンドウにスクリプトが表示されます。このデータ定義言語 (DDL: Data Definition Language) スクリプトは、ターゲットの更新に使用されます。このスクリプトには、比較の状態が、更新、ドロップ、または作成のオブジェクトのみが含まれています。スキップする項目は [スキーマ更新スクリプト] ウィンドウに表示されません。
[更新アクション] 列の値を変更すると、[スキーマ更新スクリプト] ウィンドウに変更が反映されます。
メモ : |
---|
スクリプトのプレビュー ペインの内容の更新時間は [更新アクション] 列の変更の範囲に応じて異なり、数秒かかる場合があります。 |
更新アクションを変更すると DDL スクリプトを変更できますが、スクリプトのプレビュー ペインは読み取り専用であるため、[スキーマ更新スクリプト] ウィンドウでスクリプトを直接編集することはできません。更新スクリプトを編集する場合は、[エディタにエクスポート] をクリックし、Transact-SQL (T-SQL) エディタで更新スクリプトを変更します。
比較結果の更新
ソース スキーマとターゲット スキーマの相違点の表示を更新できます。ソースとターゲットを比較した後、それぞれのスキーマのいずれかまたは両方が変更されている場合、その表示を更新できます。スキーマ比較のオプションを変更した場合、比較結果も更新できます。[最新の情報に更新] をクリックすると、以前に指定した構成情報を再利用して、新しい比較データが生成されます。
最後にスキーマを比較した後に、ソースのデータベース オブジェクトが追加または削除されていることがあります。この場合、[最新の情報に更新] をクリックすると、スキーマ比較が実行され、新しいオブジェクトの追加と既存のオブジェクトの削除が新しい比較結果に反映されます。ただし、特定のオブジェクトの [更新アクション] の設定を変更した場合、最後にスキーマを比較した後でそのオブジェクトに対して行われた変更の内容に関係なく、その設定は保持されます。
データベース スキーマの安全な反映
データベース スキーマを反映するとデータが損失する場合があります。損失を防ぐには、ソースとターゲットのオブジェクトの名前に注意してください。特に、ターゲットのスキーマを更新する直前に注意が必要です。
たとえば、ターゲットに "Order_Details" という名前のテーブルが含まれているとします。ソース データベースで、その名前をアンダースコア (_) のない "Order Details" に変更します。次に、2 つのデータベースを比較します。ソースからターゲットにそのスキーマを反映する前は、両方のテーブルのデータは同じです。ところが、スキーマの更新をターゲットに書き込むと、Order_Details テーブルが削除され、新しい Order Details テーブルが作成されます。Order_Details テーブルのすべてのデータが損失する可能性があります。
[ツール] メニューの [オプション] をクリックし、[データ損失が発生する場合にスキーマの更新をブロック] チェック ボックスをオンにすると、データの損失を防ぐことができます。また、データベースに変更を配置する前に、常にデータベースをバックアップしてください。