次の方法で共有


SQL Database プロジェクトとは

適用対象: SQL Server 2022 (16.x) Azure SQL データベース Azure SQL Managed Instance

SQL データベース プロジェクトは、テーブル、ストアド プロシージャ、関数など、単一データベースのスキーマを構成する SQL オブジェクトをローカルで表現したものです。 SQL データベース プロジェクトの開発サイクルにより、データベース開発を、開発の成功事例として使い慣れた継続的インテグレーションおよび継続的デプロイ (CI/CD) ワークフローに統合できます。

概要

SQL プロジェクトは、宣言型 T-SQL ステートメントに基づいています。 SQL Database プロジェクト コードでは、各オブジェクトを 1 回作成します。 列の追加やデータ型の変更など、そのオブジェクトに関する何かを変更する必要がある場合は、オブジェクトを初回のみ宣言する単一のファイルを変更します。

SQL Database プロジェクトがビルドされたときの出力成果物は .dacpac ファイルです。 新しいデータベースと既存のデータベースは、.dacpac をターゲット データベースに発行することで、.dacpac の内容と一致するように更新できます。

SQL データベースは、そのビルド プロセスを使用して、そのファイル セットに 2 つの基本的な機能を追加するデータベース コードに関するフレームワークをプロジェクトします。

  • 特定のバージョンの SQL に対するオブジェクトと構文間の参照の検証
  • 新規または既存のデータベースへのビルド成果物のデプロイ

配置前スクリプトと配置後スクリプトおよびデータベース オブジェクトが含まれる SQL Database プロジェクトの概要のスクリーンショット。

SQL Database プロジェクトの機能は、Microsoft.SqlServer.DacFx .NET ライブラリによって提供され、SQL 開発用のいくつかの ツールで表示されます。 DacFx には、展開手順の変更やコード分析用のカスタム ルールを作成する機能など、複数の拡張点があります。 SQL プロジェクト用のプロジェクト SDK は Microsoft.Build.Sql であり、現在プレビューで利用でき、新しい開発用に推奨されています。

検証

SQL プロジェクトがビルドされると、オブジェクト間のリレーションシップが検証されます。 たとえば、ビュー定義に、SQL プロジェクトに存在しないテーブルまたは列を含めることはできません。

さらに、SQL プロジェクトには、"ターゲット プラットフォーム" という .sqlproj ファイル内のプロパティが含まれています。 この情報は、そのバージョンの SQL に関数と T-SQL 構文が存在することを検証するために、ビルド プロセス中に使用されます。 たとえば、SQL Server 2022 で追加された JSON 関数は、Sql140 (SQL Server 2017) ターゲット プラットフォームに設定された SQL プロジェクトでは使用できません。

SQL プロジェクトをビルドするには、コマンド ラインから dotnet ビルドを実行します。 SQL プロジェクト (Azure Data Studio、VS Code、Visual Studio) をサポートするグラフィカル ツールには、SQL プロジェクトをビルドするためのメニュー項目があります。

ビルド プロセスのコンソール出力には、エラー (ビルド エラー) または警告が含まれている可能性があります。 ビルドの警告には、オブジェクト名やその他のカスタマイズ可能なベスト プラクティスに一貫性のない大文字と小文字が含まれる場合がありますがビルドは失敗しません。

ビルド プロセスの成果物の出力は .dacpac ファイルであり、bin/Debug フォルダー内の既定の設定を持つビルドに対して見つけることができます。

展開

出力ファイル (.dacpac) は、強力で再利用可能で宣言型の成果物です。 このファイルを使用すると、SqlPackage やその他のツールを使用してデータベース コードをデータベースに適用できます。 .dacpac をデプロイする SqlPackage コマンドは、publish コマンドです。

SQL プロジェクトのビルドから dacpac へのプロセスの概要とデータベースへの配置のスクリーンショット。

たとえば、sqlpackage /Action:Publish /SourceFile:yourfile.dacpac /TargetConnectionString:{yourconnectionstring} のようにします。

新しいデータベース

SqlPackage は、dacpac を新しいデータベースに発行するときに、オブジェクト リレーションシップを移動して各オブジェクトを適切な順序で作成します。 たとえば、Table_B に Table_Aに対する外部キーがある場合、SqlPackage は Table_B の前に Table_A を作成します。

SQL スクリプトのフォルダー全体を実行する必要はありません。オブジェクトのリレーションシップに基づいて各 T-SQL セクションを正しい順序で自動的に実行する SQL プロジェクトを使用できる場合は特にそうです。

既存のデータベース

新しいデータベースに発行するときにオブジェクト階層を移動するだけでなく、.dacpac 発行プロセスでは、そのデータベースを更新するために必要な手順を決定する前に、ソース .dacpac とターゲット データベースの違いも計算されます。 たとえば、Table_Cには、SQL プロジェクトに含まれる 2 つの列がデータベースに存在せず、StoredProcedure_Aが変更された場合、SqlPackage では、多くのオブジェクトを盲目的に作成するのではなく、ALTER TABLE ステートメントと ALTER PROCEDURE ステートメントが作成されます。

展開によって計算された alter table ステートメント例のスクリーンショット。

既存のデータベースに対して発行コマンドによって提供される柔軟性は、1 つのデータベースに限定されるわけではありません。 100 個のデータベースのフリートをアップグレードする場合など、1 つの .dacpac を複数回デプロイできます。

いつ使用するか

SQL Database プロジェクトは、データベース開発を CI/CD ワークフローに統合しようとしているチームに最適です。 SQL プロジェクトの宣言型の性質により、データベース スキーマの信頼できる唯一の情報源となり、ビルドと発行プロセスにより、変更をデータベースにデプロイするための反復可能で信頼性の高い方法が提供されます。

SQL Database プロジェクトは、EF Core などのオブジェクト リレーショナル マッパー (ORM) を使用した開発など、データベース状態の信頼できる情報源を追跡するために使用されます。 グラフィカル ツールまたはコマンド ラインを使用して、データベースの作成に使用される ORM に関係なく、データベースのスキーマを SQL プロジェクトに抽出できます。

AdventureWorks SQL プロジェクトが開き、エディターにテーブルが表示されている VS Code のスクリーンショット。

SQL Database プロジェクトでは、Azure SQL データベースや Azure Synapse Analytics など、SQL Server と Azure SQL ファミリのデータベースがサポートされています。 アプリケーションまたはデータ ウェアハウスを開発する場合でも、SQL Database プロジェクトを使用してデータベースのスキーマを管理できます。 SQL プロジェクトは、Visual Studio、VS Code、Azure Data Studio といったツールで開発することができます。

元のプロジェクトと SDK スタイルのプロジェクト (プレビュー)

元の SQL プロジェクト形式は MSBuild (.NET Framework) に基づいており、Visual Studio の SQL Server Data Tools で使用される形式です。 SDK スタイルのプロジェクト形式は、.NET Core で導入された新しい SDK スタイルのプロジェクトに基づいており、Azure Data Studio および VS Code の SQL Database プロジェクト拡張機能で使用される形式です。 Visual Studio での SDK スタイルの SQL プロジェクトのサポートは、ロードマップにあります。

新しい開発作業では、今後サポートされる形式であるため、SDK スタイルのプロジェクト形式の使用を検討する必要があります。 SDK スタイルのプロジェクト形式は柔軟性が高く、元の SQL プロジェクトでは使用できない新機能が含まれています。

  • .NET 8 のサポート (クロス プラットフォーム)
  • データベース参照の NuGet パッケージ参照
  • プロジェクト内の.sql ファイルの既定の glob パターン

SDK スタイルのプロジェクトには、元の SQL プロジェクトの機能のスーパーセットがあり、既存の SQL プロジェクトは、プロジェクト ファイルの変更によって SDK スタイルのプロジェクトに変換できます。 機能カバレッジの例外は、.NET Framework を必要とし、SDK スタイルのプロジェクトではサポートされていない SQLCLR オブジェクトのサポートです。