方法:スキーマ比較を使用して各種のデータベース定義を比較する

SQL Server Data Tools (SSDT) に付属しているスキーマ比較ユーティリティを使用して、2 つのデータベース定義を比較できます。 比較のソースとターゲットには、接続されているデータベース、SQL Server データベース プロジェクトまたはスナップショット、または .dacpac ファイルを指定できます。 比較結果は、ターゲットをソースと同じにするためにターゲットに実行する必要があるアクションのセットとして表示されます。 比較が完了したら、ターゲットを直接更新したり (ターゲットがプロジェクトまたはデータベースの場合)、同じ効果がある更新スクリプトを生成したりできます。

ソースとターゲットとの相違点はグリッドに表示されるので、簡単に確認できます。 それぞれの相違点を結果グリッドまたはスクリプト形式でドリル インして確認できます。 確認後、特定の相違点を選択的に除外できます。

SQL Server データベース プロジェクトの一部またはスタンドアロン ファイルとして、比較を保存できます。 比較の範囲および更新の特性を制御するオプションを設定することもできます。 さらに、比較を保存できるので、同じ比較を後で簡単に繰り返したり、新しい比較の起点として使用したりすることができます。

警告

比較のターゲットとしてプロジェクトを指定した場合、プロジェクトのパスとしてサポートされる長さ (ドライブ文字、コロン、および先頭のバックスラッシュを除く) は、最大 256 文字です。 プロジェクトのパスが 256 文字を超えていても、スキーマをデータベースまたは別のプロジェクトと比較することはできます。 ただし、スキーマを更新することはできません。

次の手順では、データベース プロジェクトのスキーマを、接続されているデータベースと比較します。 「テーブルとリレーションシップの管理およびエラーの修正」および「プロジェクト指向のオフライン データベース開発」のセクションに示されているこれまでの手順で作成したエンティティを使用します。

データベース定義を比較する

  1. [ツール] メニューで [SQL Server] を選択して、[新しいスキーマ比較] を選択します。

    または、ソリューション エクスプローラーTradeDev プロジェクトを右クリックし、 [スキーマ比較] をクリックします。

    [スキーマ比較] ウィンドウが開き、SqlSchemaCompare1 などの名前が Visual Studio によって自動的に割り当てられます。

    [スキーマの比較] ウィンドウのツール バーのすぐ下に、2 つのドロップダウン メニューとその間に緑の矢印が表示されます。 これらのメニューを使用して、比較のソースおよびターゲットとなるデータベース定義を選択できます。

  2. [ソースの選択] ボックスの一覧の [ソースの選択] をクリックし、[ソース スキーマの選択] ダイアログ ボックスを開きます。

    プロジェクト名を右クリックして [スキーマ比較] ウィンドウを開いた場合は、ソース スキーマが既に設定されているので、手順 4 に進むことができます。

  3. [プロジェクト] オプション ボタンをクリックし、前の手順で作成した TradeDev データベース プロジェクトを選択します。

  4. [スキーマ比較] ウィンドウで [ターゲットの選択] ボックスの一覧の [ターゲットの選択] をクリックし、[ターゲット スキーマの選択] ダイアログ ボックスを開きます。 [スキーマ] セクションの [データベース] オプション ボタンを選択し、[新しい接続] ボタンを選択します。

  5. [接続のプロパティ] ダイアログ ボックスで、TradeDev データベースがあるサーバーの名前を入力し、認証に使用する正しい資格情報が指定されていることを確認します。 [データベースへの接続]TradeDev を選択し、[OK] を選択します。

    [スキーマ比較] ウィンドウのツール バーにある [オプション] ボタンを選択して、比較対象のオブジェクトや無視する相違の種類などの設定を指定することもできます。

  6. [スキーマ比較] ウィンドウのツール バーにある [比較] を選択して、比較プロセスを開始します。

    比較が完了すると、プロジェクトとデータベースの間の構造上の相違点がウィンドウ上部の結果ペインに表示されます。 既定では、比較結果のすべての相違点はアクション (削除、変更、追加など) 別にグループ化されます。 結果ペインには、データベース定義間で異なっているデータベース オブジェクトが 1 行に 1 つ表示されます。 ソース スキーマまたはターゲット スキーマ (あるいはその両方) のオブジェクトと、ターゲット オブジェクトをソース オブジェクトと同じにするためにターゲット スキーマに対して実行されるアクションが、各行に示されます。 オブジェクトがリファクタリングされ、名前が変更されたか新しいスキーマに移動された場合は、ソース名とターゲット名が異なり、不一致を強調するためにソース名が太字フォントで表示されます。

    既定では、両方のスキーマで同じオブジェクトまたは更新の対象としてサポートされていないオブジェクト (たとえばビルトイン オブジェクト) は、結果リストで非表示になります。 ツール バーの適切なフィルター ボタンを選んで、非表示のオブジェクトを表示できます。

    グループ化の設定を変更するには、ツール バーにある [結果のグループ化] ボックスの一覧を選びます。 結果をオブジェクトの種類別にグループ化するには (テーブル別、ビュー別、ストアド プロシージャ別など)、 [種類] をクリックします。

  7. Products グループの Tables テーブルを探します。 行を選ぶと、テーブルのソースとターゲットの定義が[オブジェクト定義] ペインに表示され、相違点が強調表示されます。 結果ペインの Products テーブルの行を展開し、テーブル内の相違がある特定の要素について詳細情報を確認することもできます。

  8. 既定では、すべての相違点が [ターゲットの更新] アクションの対象になります。 同期対象としない相違点は除外できます。 そのためには、各行の中央にある [アクション] 列をオフにします。 または、スキーマ ペイン内の行を右クリックし、 [除外] をクリックします。 行が直ちに灰色表示されます。ターゲット データベースを更新する際に、この行の保留中の変更は考慮されません。

    グループ行を右クリックし、[すべて除外] または [すべて追加] をクリックする方法もあります。これは、そのグループ内のすべての相違点をオフまたはオンにするのと同じです。 この方法は、結果をスキーマ別にグループ化する場合に、特定のスキーマに対するすべての変更を対象に含めるか除外するのに便利です。

    • 除外する行に依存オブジェクト (ビュー行で参照されているテーブル行など) がある場合、除外した行は無効になりますが、チェック ボックスはオフになりません。 依存するすべての行がオフになったときに、無効にされた行がオフになります。 また、行がリファクタリングされる (名前が変更される、または別のスキーマに移動される) と、その行および行に依存するすべての子行のチェック ボックスが無効になります。

      比較を更新すると、スキップするように指定した相違点は無視されます。

    • SQLCMD 変数を使用する場合、スキーマ比較ツールはプロジェクトのプロパティのローカル値を使用します。既定値は無視されます。 詳細については、「データベース プロジェクトの設定」を参照してください。

ターゲットのスキーマを更新する場合は、2 つのオプションがあります。 ターゲットがデータベースまたはプロジェクトの場合は、[スキーマ比較] ウィンドウからターゲットを直接更新できます。ターゲットがデータベースまたはデータベース ファイルの場合は、更新スクリプトを生成することができます。 生成されたスクリプトは Transact-SQL エディターに表示され、このエディター内からスクリプトを検査し、データベースに対して実行することができます。 次の手順では、これらのオプションについて詳しく説明します。

警告

更新は失敗します。原因は、変更の中に列を NOT NULL から NULL に変更するものがあり、その結果データ損失が発生するためです。 更新を続行する場合は、スキーマ比較のツール バーにある [オプション] ボタン (左から 5 番目のもの) を選択し、[データ損失が発生する場合に増分配置をブロック] オプションをオフにします。

スキーマと Visual Studio オートメーション モデルを比較する

  1. [表示] メニューを開き、[その他のウィンドウ] をポイントして、[コマンド ウィンドウ] を選びます。

  2. コマンド ウィンドウで、次のコマンドを入力します。

    Tools.SSDTNewSchemaComparison
    

[スキーマ比較] ウィンドウで直接更新する

  1. [スキーマ比較] ウィンドウのツール バーにある [更新] ボタンを選択します。

  2. 生成された変更スクリプトを調べます。 [ファイル] メニューの [新規作成] を使用して、スクリプトを保存することもできます。 運用データベースを更新する権限がない場合など、このスクリプトを後で配置するように DBA に渡すことができるので便利です。

  3. データベースを更新するために必要なアクセス許可がある場合は、編集ペインのツール バーにある [クエリの実行] ボタンを選択してスクリプトを実行します。

スクリプトによって更新する

  1. [スキーマ比較] ウィンドウのツール バーにある [スクリプトの生成] ボタン (左から 4 番目のもの) を選択します。

    生成されたスクリプトが、新しい Transact-SQL エディター ウィンドウに表示されます

    警告

    この動作は、SSDT スナップショット プロセスによって生成された .dacpac ファイルのみでサポートされます。 現時点では、SQL データ層アプリケーション (DAC) のツールまたはフレームワークによって生成された .dacpac ファイルを対象にすることはできません。

  2. 生成された変更スクリプトを調べます。 [ファイル]/[上書き保存] または [保存]/[名前を付けて保存] メニュー コマンドを使用して、スクリプトを保存できます。

    保存したスクリプトは、運用データベースを更新する権限がない場合に便利です。 そのような場合は、スクリプトを DBA に渡して後で配置してもらうことができます。

    または、Transact-SQL エディターを適切なサーバーに接続し、スクリプトを直接実行できます。 この手順を実行する前に、データベースを作成または更新するために必要なアクセス許可があることを確認してください。 データベースを更新するために必要なアクセス許可がある場合は、編集ペインのツール バーにある [クエリの実行] ボタンを選択してスクリプトを実行します。

  3. [接続] を選択します。 この操作により、現在のサーバーに接続されるか、[サーバーに接続] ダイアログ ボックスでサーバーの入力または選択を求められます。 データベース名はスクリプトでコマンド変数として定義されています。

  4. スクリプトを検査し、必要に応じて、ターゲット データベース名および関連プレフィックスとファイル パスを定義するコマンド変数を変更します。

  5. 編集ペインのツール バーにある [実行] を選択して、スクリプトを実行します。

関連項目