データベース参照の概要
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Microsoft Fabric SQL Database
SQL プロジェクトのデータベース参照を使用すると、別のプロジェクト、.dacpac
ファイル、発行済みの NuGet パッケージにリンクすることにより、プロジェクトに含まれていないオブジェクトを組み込むことができます。 プロジェクトに追加されるデータベース オブジェクトは同じデータベース、同じサーバーにある別のデータベース、別のサーバーにある別のデータベースの一部になることがあります。 SQL Server 開発では、データベース参照を使用して 3 部構成の名前付けのために同じサーバーにある別のデータベースにリンクするか、データベース間クエリ用に別のサーバーにある別のデータベースにリンクすることができます。 個別のグループに多数のオブジェクトが含まれるデータベースには、データベース参照を使用して、データベースを小さくて管理しやすいプロジェクトに分割できます。 プロジェクト サイズを小さくすると、パフォーマンスを向上させて反復的なローカル開発時にプロジェクトのビルドに必要な時間を短縮できます。
Note
プロジェクト参照と NuGet パッケージ参照は、新しい開発でデータベース参照に推奨される方法です。 NuGet パッケージの参照は、元の SQL プロジェクトではサポートされていません。
SQL プロジェクト ファイルのサンプルと構文
C# プロジェクトと同様に、データベース参照は .sqlproj
ファイル内のエントリを介してプロジェクトに含まれます。 データベース参照が同じサーバーにある別のデータベースにあると、<DatabaseSqlCmdVariable>
要素がパッケージ参照に含まれます。 データベース参照が別のサーバーにある別のデータベースにあると、<ServerSqlCmdVariable>
要素もパッケージ参照に含まれます。 同じデータベースへのデータベース参照には、<ServerSqlCmdVariable>
または <DatabaseSqlCmdVariable>
要素は含まれません。
SQL スクリプトにデータベース参照への特定の参照を含め、プロジェクト ファイルで名前付けされた SQLCMD 変数を使用してデータベース名を指定します。 たとえば、次の SQL スクリプトは Warehouse
データベース内のテーブルを参照します。
SELECT ProductId, StorageLocation, BinNumber
FROM [$(Warehouse)].[Production].[ProductInventory]
$(Warehouse)
SQLCMD 変数に対応するデータベース参照はプロジェクト ファイルに含まれており、<DatabaseSqlCmdVariable>Warehouse</DatabaseSqlCmdVariable>
が含まれています。
プロジェクト参照
この例では、同じデータベースの一部である SQL プロジェクト AdventureWorksSalesLT.sqlproj
にプロジェクト参照が追加されます。
<ItemGroup>
<ProjectReference Include="..\AdventureWorks\AdventureWorksSalesLT.sqlproj">
<Name>AdventureWorksSalesLT</Name>
<Project>{d703fc7a-bc47-4aef-9dc5-cf01094ddb37}</Project>
<Private>True</Private>
<SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
</ProjectReference>
</ItemGroup>
Dacpac パッケージ参照
SQL プロジェクトのパッケージ参照の詳細については、「SQL プロジェクトのパッケージ参照」の記事を参照してください。
SQL 2022 用のmaster
システム データベースへのパッケージ参照は、次の例で示されます。
<ItemGroup>
<PackageReference Include="Microsoft.SqlServer.Dacpacs.Master" Version="160.2.1" />
</ItemGroup>
Dacpac アーティファクト参照
.dacpac
アーティファクト ファイルへの直接参照は、SDK スタイルのプロジェクトでの新しい開発には推奨されません。 代わりに、NuGet パッケージ参照を使用します。
元の SQL プロジェクトでは、.dacpac
ファイル参照は <ArtifactReference>
項目で .sqlproj
ファイルで指定されます。 次の例では、同じサーバーにある別のプロジェクト内の.dacpac
ファイルへの .dacpac
アーティファクト参照が示されています。
<ItemGroup>
<ArtifactReference Include="..\AdventureWorks\Warehouse\bin\Release\Warehouse.dacpac">
<HintPath>..\AdventureWorks\Warehouse\bin\Release\Warehouse.dacpac</HintPath>
<SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
<DatabaseSqlCmdVariable>Warehouse</DatabaseSqlCmdVariable>
</ArtifactReference>
</ItemGroup>
プロジェクト参照の追加と使用
プロジェクト参照を追加する
Visual Studio で SQL プロジェクトにプロジェクト参照を追加するには、ソリューション エクスプローラーのプロジェクトの下にある [参照] ノードを右クリックし、[データベース参照の追加] を選択します。
データベース参照の追加 ダイアログには、次のものに参照を追加するためのオプションが表示されます。
- 同じソリューションの SQL プロジェクト
- システム データベース (Visual Studio に自動的に含まれる
.dacpac
ファイルから) - ローカル ファイル システム上の任意のデータ層アプリケーション (
.dacpac
) ファイル
ダイアログには、次の参照場所から選択できるドロップダウン リストも表示されます。
- 同じデータベース
- 別のデータベース、同じサーバー
- 別のデータベース、別のサーバー
SQL プロジェクトにプロジェクト参照を追加するには、データベース参照ごとに適切な参照項目を含む .sqlproj
ファイルに <ItemGroup>
項目を追加します。 たとえば、次のプロジェクト参照は SQL プロジェクトに追加され、別のサーバーにある別のデータベース内の WorldWideImporters
プロジェクトが参照されます。
<ItemGroup>
<ProjectReference Include="..\Contoso\WorldWideImporters.sqlproj">
<Name>WorldWideImporters</Name>
<Project>{d703fc7a-bc47-4aef-9dc5-cf01094ddb37}</Project>
<SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
<ServerSqlCmdVariable>WWIServer</ServerSqlCmdVariable>
<DatabaseSqlCmdVariable>WorldWideImporters</DatabaseSqlCmdVariable>
</ProjectReference>
</ItemGroup>
プロジェクト参照は、SQL プロジェクトのサンプル ビュー定義に使用されます。
CREATE VIEW dbo.WorldWide_Products
AS
SELECT ProductID, ProductName, SupplierID
FROM [$(WWIServer)].[$(WorldWideImporters)].[Purchasing].[Suppliers]
SQL データベース プロジェクト 拡張機能で SQL プロジェクトにデータベース参照を追加するには、[データベース プロジェクト] ビューのプロジェクトの下にある [データベース参照] ノードを右クリックし、[データベース 参照の追加] を選択します。
利用可能な参照型は次のとおりです。
- システム データベース
- データ層アプリケーション (
.dacpac
) - 公開されたデータ層アプリケーション (
.nupkg
) - project
拡張機能は、次の参照場所から選択するようにも求めます。
- 同じデータベース
- 別のデータベース、同じサーバー
- 別のデータベース、別のサーバー
SQL プロジェクトにプロジェクト参照を追加するには、データベース参照ごとに適切な参照項目を含む .sqlproj
ファイルに <ItemGroup>
項目を追加します。 たとえば、次のプロジェクト参照は SQL プロジェクトに追加され、別のサーバーにある別のデータベース内の WorldWideImporters
プロジェクトが参照されます。
<ItemGroup>
<ProjectReference Include="..\Contoso\WorldWideImporters.sqlproj">
<Name>WorldWideImporters</Name>
<Project>{d703fc7a-bc47-4aef-9dc5-cf01094ddb37}</Project>
<SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
<ServerSqlCmdVariable>WWIServer</ServerSqlCmdVariable>
<DatabaseSqlCmdVariable>WorldWideImporters</DatabaseSqlCmdVariable>
</ProjectReference>
</ItemGroup>
プロジェクト参照は、SQL プロジェクトのサンプル ビュー定義に使用されます。
CREATE VIEW dbo.WorldWide_Products
AS
SELECT ProductID, ProductName, SupplierID
FROM [$(WWIServer)].[$(WorldWideImporters)].[Purchasing].[Suppliers]
プロジェクト参照を含むビルド
データベース参照を使用して SQL プロジェクトをビルドするには、参照先オブジェクトがビルド プロセス中に確実に利用可能できるようにするため、追加の構成が必要になる場合があります。 たとえば、プロジェクトが継続的インテグレーション (CI) パイプラインにビルドされている場合、ビルド エージェント環境はローカル開発環境と同様に設定する必要があります。
- SQL プロジェクト内の
.dacpac
参照には、プロジェクト ファイルで指定されているとおりの同じ相対ファイル パスにあるビルド エージェントに.dacpac
が存在する必要があります。 - SQL プロジェクトのプロジェクト参照には、参照先プロジェクトがプロジェクト ファイルで指定されているとおりの同じ相対ファイル パスにあるビルド エージェントに存在し、ビルド エージェントで正常にビルドできる必要があります。
- Visual Studio の元の SQL プロジェクトで作成されたシステム データベース参照には、ビルド エージェントに Visual Studio がインストールされている必要があります。
- SQL プロジェクトの NuGet パッケージ参照には、ビルド エージェントのパッケージ ソースとしても設定されている NuGet フィードにパッケージを発行する必要があります。
プロジェクト参照を使用して発行
データベース参照を使用してプロジェクトからビルドされた .dacpac
を発行する場合、追加の手順は必要ありません。 .dacpac
ファイルには、参照先オブジェクトと、プロジェクト ファイルで指定された SQLCMD 変数が含まれています。
同じデータベース内のオブジェクトへのデータベース参照には、参照先プロジェクトのオブジェクトは .dacpac
ファイルに含まれますが、既定では配置には含まれません。 配置にオブジェクトを含めるには、SqlPackage コマンド ライン ツールの /p:IncludeCompositeObjects=true
オプションを使用します。 たとえば、次のコマンドは AdventureWorks
オプションを使用して /p:IncludeCompositeObjects=true
プロジェクトを配置し、データベース参照から AdventureWorks にオブジェクトを含めます。
sqlpackage /Action:Publish /SourceFile:AdventureWorks.dacpac /TargetConnectionString:{connection_string_here} /p:IncludeCompositeObjects=true
別のデータベース (同じまたは別のサーバー上で) にデータベース参照を含む .dacpac
ファイルをデプロイする場合、プロジェクト ファイルで指定された SQLCMD 変数をターゲット環境の正しい値に設定する必要があります。 配置時に SQLCMD 変数の値の設定は、SqlPackage コマンド ライン ツールの /v
オプションを使用して行います。 たとえば、次のコマンドは WorldWideImporters
変数を WorldWideImporters
に設定し、WWIServer
変数を localhost
に設定します。
sqlpackage /Action:Publish /SourceFile:AdventureWorks.dacpac /TargetConnectionString:{connection_string_here} /v:WorldWideImporters=WorldWideImporters /v:WWIServer=localhost