次の方法で共有


データベースとプロジェクトを比較する

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Microsoft Fabric SQL Database

データベースと SQL プロジェクトのオブジェクト定義の違いを理解することで、進行中の開発や回帰のトラブルシューティング中など、データベースとプロジェクトの状態に関する貴重な分析情報を得ることができます。 SQL プロジェクトには、違いを視覚化するためのツール、データベースの更新に必要な変更の分析、データベースから SQL プロジェクト ファイル セットへの変更のインポート、およびプロジェクトに合わせてデータベースを更新するために実行される T-SQL スクリプトの確認が含まれます。

この記事では、さまざまな方法を使用してデータベースと SQL プロジェクトを比較する方法について説明します。

Schema Compare: 違いを視覚化する

前提条件

Visual Studio の SDK スタイルの SQL プロジェクト プレビューでは、グラフィカル スキーマの比較はまだ使用できません。 Azure Data Studio または Visual Studio を使用してスキーマを比較します。

Schema Compare には、Visual Studio や Azure Data Studio などのグラフィック ツールが必要です。

まとめ

Schema Compare は、データベースとプロジェクトの違いを理解するための視覚的に豊富なインターフェイスを提供します。 Schema Compare の主な機能は、比較の方向が元に戻せるということです。 その結果、スキーマ比較を使用して、データベースに配置するプロジェクトの変更や、プロジェクトに追加するデータベースからの変更を把握できます。 Schema Compare を使用すると、テーブル、ビュー、ストアド プロシージャ、関数などのオブジェクト定義の違いを特定できます。

差分の完全なセットまたは選択したサブセットを使用して、データベースまたはプロジェクトに変更を適用できます。 Schema Compare では、実行時に変更をデータベースに効果的に適用するデプロイ スクリプトを生成することもできます。

Schema Compare の詳細については、「スキーマ比較の概要」を参照してください。

配置レポート: 変更を確認する

配置レポートには、SqlPackage CLI が必要です。

dotnet tool install -g Microsoft.SqlPackage

まとめ

配置レポートには、プロジェクトに一致するようにデータベースを更新するために必要な変更の概要が表示されます。 SqlPackage CLI は、ソース モデル (.dacpac SQL プロジェクト ビルド成果物またはデータベース) とターゲット データベースを比較することで配置レポートを生成します。 たとえば、次のコマンドは、MyProjectという名前の SQL プロジェクトから MyDatabase という名前のデータベースの配置レポートを生成します。

dotnet build MyProject.sqlproj
sqlpackage /Action:deployreport /SourceFile:bin/Debug/MyProject.dacpac /TargetConnectionString:{connection string for MyDatabase} /OutputPath:deployreport.xml

生成された XML は、展開プランの簡略化された形式であり、データベース配置を実行した場合に実行される操作を要約します。 以下の操作の一覧は完全ではありません。

  • Create
  • Alter
  • Drop
  • Refresh
  • UnbindSchemaBinding
  • UnbindFulltextIndex
  • TableDataMotion
  • SPRename
  • EnableChangeTrackingDatabase
  • DisableChangeTrackingDatabase

配置レポートは、テキスト エディターまたは Visual Studio で確認でき、次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<DeploymentReport xmlns="http://schemas.microsoft.com/sqlserver/dac/DeployReport/2012/02">
    <Alerts />
    <Operations>
        <Operation Name="Create">
            <Item Value="[CO].[Products].[IX_Products_CategorySlug]" Type="SqlIndex" />
        </Operation>
        <Operation Name="Alter">
            <Item Value="[CO].[Brands]" Type="SqlTable" />
            <Item Value="[CO].[AddProductImage]" Type="SqlProcedure" />
        </Operation>
        <Operation Name="Refresh">
            <Item Value="[CO].[SelectStarView]" Type="SqlView" />
        </Operation>
    </Operations>
</DeploymentReport>

配置レポートを使用すると、変更を確認したり、データモーションやクラスター化インデックスの作成/ドロップなどの影響が大きくなり得るイベントを監視したりできます。 これらのイベントは、配置レポートの Alerts 要素の下に表示されます。

配置レポート XML 操作の利点は、データベースの更新に必要な変更のレビューを自動化するために使用できることです。 XML を解析して使用すると、レポートを生成したり、表示された操作またはオブジェクト名に基づいてアラートをトリガーしたりできます。

データベースから変更をインポートする

スキーマ比較」セクションで説明したように、スキーマ比較を使用して、データベースから SQL プロジェクト ファイル セットに変更を適用できます。 SQL プロジェクトへの変更の適用は、データベースが直接アクティブに開発されていて、SQL プロジェクトを使用してソース管理のデータベース オブジェクトを管理する場合に一般的なシナリオです。 Visual Studio または Azure Data Studio を使用してこの操作を手動で完了すると、特にデータベースに多数のオブジェクトや散発的な変更がある場合に、時間がかかる場合があります。 このセクションでは、データベースから SQL プロジェクト ファイル セットへのオブジェクト定義の抽出を自動化する方法について説明します。

前提条件

自動化に重点を置き、SqlPackage CLI を使用して、データベースから SQL プロジェクト ファイル セットにオブジェクト定義を抽出します。 Microsoft.Build.Sql.Templates .NET テンプレートは、省略可能な手順である SQL プロジェクト ファイルを作成するために使用されます。

# install SqlPackage CLI
dotnet tool install -g Microsoft.SqlPackage

# install Microsoft.Build.Sql.Templates
dotnet new install Microsoft.Build.Sql.Templates

まとめ

SqlPackage 抽出コマンドは、ソース データベースを受け取り、.dacpac ファイルまたは SQL スクリプトのセットとして出力データベース モデルを生成します。 SqlPackage は既定で .dacpac ファイルを生成しますが、/p:ExtractTarget= プロパティを使用して SQL スクリプトのセットを指定できます。 次のコマンドは、データベース MyDatabase をフォルダー MyDatabaseProject 内の SQL プロジェクト ファイル セットに抽出します。

sqlpackage /Action:Extract /SourceConnectionString:{connection string for MyDatabase} /TargetFile:MyDatabaseProject /p:ExtractTarget=SchemaObjectType

フォルダーがソース管理下にある場合、抽出されたオブジェクト定義はソース管理ツールの違いを示します。 SqlPackage を使用してファイルを生成し、ソース管理の違いを確認することで、データベースから SQL プロジェクト ファイル セットに変更をインポートするプロセスを自動化できます。

一連の 3 つのコマンドでは、前のファイル セットを削除し、データベースを抽出し、ソース管理ツールの違いを確認できます。

rm -rf MyDatabaseProject
sqlpackage /Action:Extract /SourceConnectionString:{connection string for MyDatabase} /TargetFile:MyDatabaseProject /p:ExtractTarget=SchemaObjectType
git status --porcelain | wc -l

出力は、最新の SqlPackage 抽出によって変更されたファイルの数です。 git status コマンドからの出力を使用して、他の自動化ステップをトリガーできます。 この一連のファイルを SQL プロジェクトとして使用する場合は、Microsoft.Build.Sql.Templates .NET テンプレートを使用して、フォルダー MyDatabaseProject に SQL プロジェクト ファイルを作成できます。

dotnet new sqlproj -n MyDatabaseProject -o MyDatabaseProject

デプロイ T-SQL スクリプトを確認する

スキーマ比較」セクションで説明したように、スキーマ比較を使用して、データベースを更新して SQL プロジェクトに一致させるのに必要な T-SQL スクリプトを生成できます。 このセクションでは、SqlPackage を使用して、SQL プロジェクトに一致するようにデータベースを更新するために必要な T-SQL スクリプトの生成を自動化する方法を確認します。これにより、レビューと承認のためにパイプライン成果物として格納できます。

前提条件

dotnet tool install -g Microsoft.SqlPackage

まとめ

SqlPackage で SQL プロジェクトの配置を実行すると、publish アクションが使用されますが、実行される T-SQL スクリプトを確認する場合は、script アクションを使用できます。 次のコマンドは、MyDatabase という名前のデータベースを更新して、 MyProject という名前の SQL プロジェクトに一致させるために必要な T-SQL スクリプトを生成します。

dotnet build MyProject.sqlproj
sqlpackage /Action:Script /SourceFile:bin/Debug/MyProject.dacpac /TargetConnectionString:{connection string for MyDatabase} /DeployScriptPath:Deployment.sql