適用対象: SQL Server 2022 (16.x)
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric SQL Database
SQL データベース プロジェクトは、1 つのデータベースのスキーマを構成する SQL オブジェクト群 (テーブル、ストアド プロシージャ、関数など) のローカル表現です。 SQL データベース プロジェクトの開発サイクルでは、よく使われる開発ベスト プラクティスの 1 つである継続的インテグレーションと継続的デプロイ (CI/CD) ワークフローの中にデータベース開発を統合できます。
概要
SQL プロジェクトは、宣言型の T-SQL ステートメントに基づいています。 SQL データベース プロジェクトのコード内では、それぞれのオブジェクトを 1 回のみ作成します。 オブジェクトに何らかの変更 (列の追加、データ型の変更など) を加える必要がある場合は、そのオブジェクトの宣言を最初に一度だけ行う 1 つのファイルのみを修正します。
SQL データベース プロジェクトをビルドすると、出力成果物として .dacpac
ファイルができます。 この .dacpac
をターゲット データベースに対して発行すると、.dacpac
の内容に合致するように新規データベースを作成することや既存データベースを更新することができます。
SQL データベース プロジェクトでは、データベース コードの周りに、以下 2 つの基盤的な機能をこのファイル セットに追加するフレームワークと、そのビルド プロセスが付加されます。
SQL データベース プロジェクトの機能は Microsoft.SqlServer.DacFx .NET ライブラリによって提供され、数個の SQL 開発用ツールとしてアクセス可能になっています。 DacFx には、デプロイ手順の変更や、コード分析のカスタム ルールを作成する機能など、複数の拡張ポイントが用意されています。 SQL プロジェクト用のプロジェクト SDK は Microsoft.Build.Sql です。新規開発にはこれが推奨されており、また、Azure Data Studio および VS Code 用の SQL Database Projects 拡張機能ではこの形式を使用します。 Visual Studio では、SDK スタイルの SQL プロジェクトに対するサポート機能はプレビュー段階で提供されています。
検証
SQL プロジェクトをビルドすると、オブジェクト間の関係が検証されます。 たとえば、その SQL プロジェクト内に存在しないテーブルや列をビュー定義に含めることはできません。
また、SQL プロジェクトの .sqlproj
ファイル内には "ターゲット プラットフォーム" と呼ばれるプロパティが 1 つあります。 この情報は、該当する機能と T-SQL 構文がそのバージョンの SQL に存在することをビルド プロセス中に検証するために使用されます。 たとえば、Sql140 (SQL Server 2017) をターゲット プラットフォームとして設定した SQL プロジェクトでは、SQL Server 2022 で追加された JSON 機能を使用できません。
SQL プロジェクトをビルドするには、コマンド ラインから dotnet build を実行します。 SQL プロジェクトをサポートするグラフィカル ツール (Azure Data Studio、VS Code、Visual Studio) には、SQL プロジェクトをビルドするためのメニュー項目があります。
場合によっては、ビルド プロセスのコンソール出力にはエラー (ビルドの失敗) や警告が表示されることがあります。 ビルドの警告には、ビルドの失敗にはならない、オブジェクト名の大文字と小文字の不統一や、その他のカスタマイズ可能なベスト プラクティスに関する警告が含まれることがあります。
ビルド プロセスから出力される成果物は .dacpac
ファイルであり、その出力先は、既定の設定によるビルドの場合は bin/Debug
フォルダーです。
デプロイ
出力される .dacpac
ファイルは、強力な、再利用可能な宣言型のビルド成果物です。 このファイルと、SqlPackage やその他のツールを使用すると、データベース コードをデータベースに適用できます。 .dacpac
をデプロイする SqlPackage コマンドは、publish コマンドです。
たとえば、「sqlpackage /Action:Publish /SourceFile:yourfile.dacpac /TargetConnectionString:{yourconnectionstring}
」のように入力します。
新しいデータベース
dacpac を新しいデータベースに対して発行するとき、SqlPackage はオブジェクトの関係をたどり、個々のオブジェクトを正しい順序で作成します。 たとえば、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
ステートメントを作成します。
既存のデータベースに柔軟に対応できる publish コマンドの機能は、データベースの数が 1 個ではない場合にも有効です。 1 個の .dacpac
を複数回デプロイできるため、たとえば、100 個から成るデータベース群のアップグレードを実行することも可能です。
使用に適した状況
SQL データベース プロジェクトは、データベース開発を CI/CD ワークフローに統合する方法を検討しているチームに最適です。 SQL プロジェクトに備わっている宣言型の性質により、データベース スキーマ管理を、信頼できる一元的な情報源にまとめることができます。また、ビルドと発行のプロセスにより、反復可能かつ信頼性の高い方法でデータベースへの変更をデプロイできます。
SQL データベース プロジェクトは、たとえば、EF Core などのオブジェクト リレーショナル マッパー (ORM) を使用した開発において、信頼できる単一の情報源を追跡管理してデータベースの状態を取得する目的などに使用されます。 どのような ORM でデータベースを作成したかを問わず、グラフィカル ツールまたはコマンド ラインを使用して、データベースのスキーマを SQL プロジェクトに抽出できます。
SQL データベース プロジェクトは、SQL Server と Azure SQL ファミリのデータベース (Azure SQL Database、Azure Synapse Analytics など) をサポートしています。 アプリケーションの開発でも、データ ウェアハウスの開発でも、データベースのスキーマ管理に SQL データベース プロジェクトを使用できます。 SQL プロジェクトの開発は、Visual Studio、VS Code、Azure Data Studio 内のツールから行えます。
オリジナル プロジェクトと SDK スタイルのプロジェクト
Microsoft.Build.Sql SDK スタイルのプロジェクト形式は、.NET Core で導入された新しい SDK スタイルのプロジェクトを基にした、Azure Data Studio と VS Code の SQL Database Projects 拡張機能で使用される形式です。 Microsoft.Build.Sql プロジェクトは、MSBuild (.NET Framework) を基にしたオリジナルの SQL プロジェクト形式に取って代わるものです。 SDK スタイル SQL プロジェクトをサポートする Visual Studio の機能は現在プレビュー段階であり、開発が活発に進められています。Visual Studio では、オリジナル プロジェクト形式と SDK スタイル プロジェクト形式の両方を使用できます。
将来サポートされる形式は SDK スタイルのプロジェクトであるため、新規開発には、Microsoft.Build.Sql プロジェクトの使用を検討することをお勧めします。 SDK スタイルのプロジェクト形式のほうが柔軟性に優れており、オリジナルの SQL プロジェクトにはない以下の新機能を利用できます。
- .NET 8 のサポート (クロス プラットフォーム)
- NuGet パッケージ参照を使用してのデータベース参照
- プロジェクト内の .sql ファイルを既定グロビング パターンで指定
SDK スタイルのプロジェクトにはオリジナル SQL プロジェクトの機能のスーパーセットが備わっており、プロジェクト ファイルの変更によって既存の SQL プロジェクトを SDK スタイルのプロジェクトに変換できます。
機能カバレッジの例外は、.NET Framework を必要とする SQLCLR オブジェクトのサポートです。 SQLCLR オブジェクトを含むプロジェクトは SDK スタイルのプロジェクトに変換できますが、プロジェクトには .NET Framework が必要であり、Windows 上の Visual Studio でビルドする必要があります。 SQLCLR オブジェクトを含むプロジェクトがビルドされると、.dacpac
は .NET および .NET Framework 上の SqlPackage と共に展開でき、プロジェクト (同じデータベースまたは同じサーバーの異なるデータベースの両方) で .dacpac
参照として使用できます。