適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric の SQL データベース
データベースと SQL プロジェクトのオブジェクト定義の違いを理解することで、進行中の開発や回帰のトラブルシューティング中など、データベースとプロジェクトの状態に関する貴重な分析情報を得ることができます。 SQL プロジェクトには、違いを視覚化するためのツール、データベースの更新に必要な変更の分析、データベースから SQL プロジェクト ファイル セットへの変更のインポート、およびプロジェクトに合わせてデータベースを更新するために実行される T-SQL スクリプトの確認が含まれます。
この記事では、さまざまな方法を使用してデータベースと SQL プロジェクトを比較する方法について説明します。
- schema compare を使用して、データベースやプロジェクト間の違いを表示できます。 この比較により、データベースとプロジェクトの間で同期する必要がある変更を特定することができます。
- 配置レポートを使用して、データベースの更新に必要な変更のレビューを要約して自動化できます。
- Schema Compare または SqlPackage 抽出を使用して、データベースから SQL プロジェクト ファイル セットに変更をインポートできます。
- SqlPackage deploy scriptまたは schema compare を使用して、プロジェクトに一致するようにデータベースを更新するために実行される T-SQL ステートメントを確認できます。
スキーマ比較: 違いを視覚化する
Prerequisites
Visual Studio の SDK スタイルの SQL プロジェクト プレビューでは、グラフィカル スキーマの比較はまだ使用できません。 Azure Data Studio または Visual Studio を使用してスキーマを比較します。
スキーマ比較には、Visual Studio などのグラフィカル ツール、または Visual Studio Code 用の MSSQL 拡張機能が必要です。
Summary
Schema Compare は、データベースとプロジェクトの違いを理解するための視覚的に豊富なインターフェイスを提供します。 Schema Compare の主な機能は、比較の方向が元に戻せるということです。 その結果、スキーマ比較を使用して、データベースに配置するプロジェクトの変更や、プロジェクトに追加するデータベースからの変更を把握できます。 Schema Compare を使用すると、テーブル、ビュー、ストアド プロシージャ、関数などのオブジェクト定義の違いを特定できます。
差分の完全なセットまたは選択したサブセットを使用して、データベースまたはプロジェクトに変更を適用できます。 Schema Compare では、実行時に変更をデータベースに効果的に適用するデプロイ スクリプトを生成することもできます。
Schema Compare の詳細については、「スキーマ比較の概要」を参照してください。
配置レポート: 変更を確認する
配置レポートには、SqlPackage CLI が必要です。
dotnet tool install -g Microsoft.SqlPackage
Summary
配置レポートには、プロジェクトに一致するようにデータベースを更新するために必要な変更の概要が表示されます。 SqlPackage CLI は、ソース モデル ( SQL プロジェクト ビルド成果物またはデータベース) とターゲット データベースを比較することで.dacpacします。 たとえば、次のコマンドは、MyDatabaseという名前の SQL プロジェクトから MyProject という名前のデータベースの配置レポートを生成します。
dotnet build MyProject.sqlproj
sqlpackage /Action:deployreport /SourceFile:bin/Debug/MyProject.dacpac /TargetConnectionString:{connection string for MyDatabase} /OutputPath:deployreport.xml
生成された XML は、展開プランの簡略化された形式であり、データベース配置を実行した場合に実行される操作を要約します。 以下の操作の一覧は完全ではありません。
CreateAlterDropRefreshUnbindSchemaBindingUnbindFulltextIndexTableDataMotionSPRenameEnableChangeTrackingDatabaseDisableChangeTrackingDatabase
配置レポートは、テキスト エディターまたは 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 プロジェクト ファイル セットへのオブジェクト定義の抽出を自動化する方法について説明します。
Prerequisites
自動化に重点を置き、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
Summary
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 スクリプトの生成を自動化する方法を確認します。これにより、レビューと承認のためにパイプライン成果物として格納できます。
Prerequisites
dotnet tool install -g Microsoft.SqlPackage
Summary
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