スキーマ比較の概要

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric の SQL データベース

スキーマ比較ツールを使用すると、2 つのデータベース定義を比較できます。 接続されているデータベース、SQL データベース プロジェクト、または .dacpac ファイルの任意の組み合わせを比較のソースとターゲットとして使用できます。 比較が完了すると、ターゲットをソースと同じにする一連のアクションとして結果が表示されます。 データベース モデル間の違いは、ソース管理の相違と同様の方法で表示されます。 スキーマ比較ターゲットが SQL プロジェクトまたはデータベースの場合は、スキーマ比較インターフェイスから直接ターゲットを更新するか、同じ効果を持つ更新スクリプトを生成できます。

概念としてのパッケージとデータベースの違いのスクリーンショット。

スキーマ比較には、次の機能があります。

  • 2 つの .dacpac ファイル、データベース、または SQL プロジェクト間でスキーマを比較します。
  • ターゲットとソースを照合するアクションのセットとして結果を表示します。
  • 結果に一覧表示されるアクションを選択的に除外する。
  • 比較の範囲を制御するオプションを設定する。
  • ターゲットに変更を直接適用するか、後で変更を適用するスクリプトを生成します。
  • 比較を保存する

Functionality

ソースとターゲットとの相違点はグリッドに表示されるので、簡単に確認できます。 次のいずれかのオプションから派生したデータベース モデル間で、どちらの方向でも比較できます。

  • 接続されたデータベース
  • SQL データベース プロジェクト
  • .dacpac ファイル

スキーマ比較では、結果グリッドまたはスクリプト 形式で各違いをドリルダウンして確認できます。ここで、変更の詳細は 1 行ごとのレベルで確認できます。 ターゲットを更新する前に、特定の違いを選択的に除外することもできます。 スキーマ比較ツールは、Visual Studio、Visual Studio Code、およびコマンド ラインで使用できます。

スキーマ比較オプション

スキーマ比較オプションは、DacFx .NET ライブラリで使用できる配置オプションに基づいています。 設定できるオプションは次のとおりです。

  • 空白を無視する
  • パーティション構成を無視する
  • 列の順序を無視する
  • ソースにないインデックスを削除する
  • データ損失の可能性をブロックする

比較に含まれるオブジェクトの種類を構成することもできます。 これらのオブジェクトには、テーブル、ストアド プロシージャ、インデックス、アクセス許可、ユーザー定義型などが含まれます。

スキーマ比較ファイル

スキーマ比較の比較定義は、スキーマ比較ファイルと呼ばれる.scmpファイルとして保存できます。 このファイルには、スキーマ比較に関する情報が XML 形式で格納され、次のものが含まれます。

  • ソースとターゲットの接続情報
  • 比較オプション
  • 除外されるオブジェクトの種類

.scmp ファイルをVisual Studioで開いて、後で同じ比較を再度実行したり、他のユーザーと比較を共有したりできます。

Schema Compare の起動と使用

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

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

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

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

  2. [ソースの選択] ドロップダウン リストで [ソースの選択] を選択すると、[ソース スキーマの選択] ダイアログが開きます。

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

    Visual Studio の [スキーマ比較ソースの選択] ダイアログのスクリーンショット。

  3. スキーマ比較ソースの選択を完了するには、プロジェクトデータベース接続、.dacpac ファイルを選択します。 ソースは、ターゲットへの変更の基礎として使用するデータベース定義です。

  4. [スキーマ比較] ウィンドウの [ターゲットの選択] ドロップダウン リストから、[ターゲットの選択] を選択します。 [ ターゲット スキーマの選択 ] ダイアログが開きます。 スキーマ比較ターゲットの選択を完了するには、プロジェクトデータベース接続、.dacpac ファイルを選択します。 ターゲットは、評価するデータベース定義であり、変更を適用する可能性があります。

  5. 比較するオブジェクト、無視する相違点の種類、およびその他の設定を指定するには、[スキーマ比較ウィンドウ] ツール バーから [オプション] を選択します。

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

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

    データベースをプロジェクトと比較する Visual Studio のスキーマ比較インターフェイスのスクリーンショット。

    既定では、結果一覧では、両方のスキーマで同じオブジェクト、または組み込みオブジェクトなどの更新がサポートされていないオブジェクトが非表示になります。 ツール バーで適切なフィルター オプションを選択して、これらのオブジェクトを表示します。

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

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

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

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

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

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

Note

グラフィカル スキーマの比較は、Visual Studio の SDK スタイルの SQL プロジェクト プレビューで部分的に使用できます。 スキーマ比較は、接続されたデータベースと .dacpac ファイルで使用できます。SQL データベース プロジェクトはまだ使用できません。

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

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

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

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

  2. [ソースの選択] ドロップダウン リストで [ソースの選択] を選択すると、[ソース スキーマの選択] ダイアログが開きます。

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

    Visual Studio の [スキーマ比較ソースの選択] ダイアログのスクリーンショット。

  3. スキーマ比較ソースの選択を完了するには、プロジェクトデータベース接続、.dacpac ファイルを選択します。 ソースは、ターゲットへの変更の基礎として使用するデータベース定義です。

  4. [スキーマ比較] ウィンドウの [ターゲットの選択] ドロップダウン リストから、[ターゲットの選択] を選択します。 [ ターゲット スキーマの選択 ] ダイアログが開きます。 スキーマ比較ターゲットの選択を完了するには、プロジェクトデータベース接続、.dacpac ファイルを選択します。 ターゲットは、評価するデータベース定義であり、変更を適用する可能性があります。

  5. [スキーマ比較ウィンドウ] ツール バーから [オプション] を選択して、比較するオブジェクト、無視される相違点の種類、およびその他の設定を指定します。

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

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

    データベースをプロジェクトと比較する Visual Studio のスキーマ比較インターフェイスのスクリーンショット。

    既定では、結果一覧では、両方のスキーマで同じオブジェクト、または組み込みオブジェクトなどの更新がサポートされていないオブジェクトが非表示になります。 ツール バーで適切なフィルター オプションを選択して、これらのオブジェクトを表示します。

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

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

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

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

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

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

Visual Studio Code でのスキーマ比較の詳細については、スキーマ比較に関する記事を参照してください。

  1. コマンド パレット (ctrl/cmd+shift+P) の Visual Studio Code で、 MSSQL: Schema Compare を検索して選択します。

    または、[データベース プロジェクト] ビューのデータベース プロジェクトまたは [オブジェクト エクスプローラー] のデータベースを右クリックし、[Schema Compare] を選択します。

    Visual Studio Code オブジェクト エクスプローラーの [スキーマ比較] メニュー項目のスクリーンショット。

    [Schema Compare] ウィンドウが開き、起動ポイントに基づいてソースまたはターゲットがプリセットされる場合があります。

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

  2. ソースまたはターゲットの省略記号ボタンを選択すると、それぞれを更新できるダイアログが開きます。 スキーマ比較ソースの選択を完了するには、プロジェクトデータベース接続、.dacpac ファイルを選択します。 ソースは、ターゲットへの変更の基礎として使用するデータベース定義です。 ターゲットは、評価するデータベース定義であり、変更を適用する可能性があります。

    Visual Studio Code の [スキーマ比較ソースの選択] ダイアログのスクリーンショット。

    選択が完了したら、[OK] を選択してダイアログを閉じ、[Schema Compare] ウィンドウに戻ります。

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

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

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

    プロジェクトとデータベースを比較する Visual Studio Code のスキーマ比較インターフェイスのスクリーンショット。

  5. 既定では、すべての相違点が [ターゲットの更新] アクションの対象になります。 同期対象としない相違点は除外できます。 そのためには、各行の中央にある [アクション] 列をオフにします。 スキーマ比較を使用してターゲット データベースを更新する場合、この行は保留中の変更とは見なされません。

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

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

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

SQL Server Management Studioでは、スキーマ比較ツールを使用して、データベース、プロジェクト、または .dacpac ファイルを比較できます。

  1. SQL Server Management Studioで、比較するデータベースに接続します。

  2. オブジェクト エクスプローラーで、データベースを右クリックし、[タスク] >Schema Compare (プレビュー) を選択します。

  3. [スキーマ比較] ウィンドウで、Projectデータベース接続、または .dacpac ファイルを選択して、スキーマ比較ターゲットの選択を完了します。

  4. 比較を開始するには、[ 比較 ] を選択します。

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

  5. 既定では、すべての相違点が [ターゲットの更新] アクションの対象になります。 同期対象としない相違点は除外できます。 これを行うには、各行の [列を含める] チェック ボックスをオフにします。 スキーマ比較を使用してターゲット データベースを更新する場合、この行は保留中の変更とは見なされません。

    除外する行に依存オブジェクト (たとえば、ビュー行で参照されているテーブル行) がある場合、除外する行は無効になりますが、チェックボックスはオフになりません。 依存するすべての行のチェックを外した後、無効にされた行のチェックも外れます。

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

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

スキーマ比較は、SQL Server Management Studio、Visual Studio、または MSSQL 拡張機能を使用してVisual Studio Codeで使用できます。