データベース プロジェクトでの参照の使用
さまざまな状況に対応するために、数種類の参照をデータベース プロジェクトに追加できます。 使用する手順は、参照の種類によって少し異なります。 追加できる参照の種類、およびそれぞれの種類が対応する状況を次の一覧に示します。
現在のソリューションのデータベース プロジェクト (.dbproj)
この種類の参照を追加すると、いくつかのシナリオに対応できます。参照を追加し、サーバーの名前の変数 (省略可能) とオブジェクトを含むデータベースの名前の変数を定義することで、あるプロジェクト内のデータベース オブジェクトを別のプロジェクトから参照できます。 データベースが他のデータベース内のオブジェクトを参照する場合、このデータベース間参照を使用します。 詳細については、「他のデータベースを参照するデータベースのチーム開発の開始」を参照してください。
変数を定義しないで別のプロジェクトへの参照を追加する場合は、複合プロジェクトを作成します。 この種類のプロジェクトを配置するときには、他のプロジェクトのオブジェクトも配置します。 詳細については、このトピックで後述する「参照を使用した複合プロジェクトの作成」を参照してください。
現在のソリューションまたは別のソリューションからのデータベース プロジェクト (.dbschema ファイル) の出力
別のデータベース内のオブジェクトを参照する必要があり、他の開発者からそのデータベースを分離する場合、データベース スキーマ ファイルへの参照を追加できます。 この方法は、変更を防ぎたい場合、またはデータベースを更新できない場合に使用します。 たとえば、サーバーで共有および定義され、複数のデータベース プロジェクトで使用されるログインまたはキーをデータベース プロジェクトから参照する必要がある場合、.dbschema ファイルへの参照を追加できます。 詳細については、「共有サーバー オブジェクトを参照するデータベースのチーム開発の開始」を参照してください。現在のソリューション内の SQL 共通言語ランタイム (CLR: Common Language Runtime) プロジェクト
データベース プロジェクトと共に配置する 1 つ以上の SQLCLR オブジェクトを開発している場合、現在のソリューションで SQLCLR プロジェクトを参照できます。 データベース プロジェクトを配置するときに、参照する SQLCLR プロジェクトによって生成されたアセンブリも配置します。 CREATE ASSEMBLY ステートメントは、その参照に対して指定するプロパティからビルドされます。 詳細については、「SQLCLR オブジェクトを参照するデータベースのチーム開発の開始」およびこのトピックで後述する「データベース間参照の例」を参照してください。現在のソリューション内のプロジェクトまたは別のソースからの SQLCLR アセンブリ
SQLCLR アセンブリで定義され、同時に開発されていない、または同じチームによって開発されていないオブジェクトをデータベース プロジェクトから参照する必要がある場合、そのアセンブリへの参照を追加できます。 データベース プロジェクトの配置時に、参照するアセンブリも配置します。.xsd ファイルで定義された XML スキーマ定義
型指定された XML 変数、パラメータ、および列を作成するには、スキーマを変数、パラメータ、または列に関連付ける前に登録する必要があります。 次のいずれかのステートメントが true の場合、型指定された XML を使用できます。XML データのスキーマがあり、スキーマに従ってサーバーでそのデータを検証する場合
型情報に基づいてストレージとクエリを最適化する場合
クエリのコンパイル中に型情報を利用する場合
詳細については、「XML スキーマ コレクションを使用するデータベースのチーム開発の開始」を参照してください。
データベース間参照の定義
他のデータベース内のオブジェクトを参照するデータベース オブジェクトを作成またはインポートする場合、データベース オブジェクトのプロパティで対応する参照を定義する必要があります。 参照するデータベースごとに、参照するサーバーおよびデータベースに対応する SETVAR 変数を定義できます。 参照を含めるようにオブジェクト定義を変更する場合は、サーバーおよびデータベースの明示的な名前ではなくこれらの変数を使用して定義できます。 データベース プロジェクトをビルドすると、変数は指定した値に置き換えられます。
データベース間参照のシナリオ
Visual Studio Team System Database Edition は、以下のシナリオをサポートします。
データベース プロジェクトを作成し、既存のデータベースからスキーマをインポートしました。 スキーマには、他の 1 つ以上のデータベース内のオブジェクトを参照するオブジェクトが含まれています。 プロジェクトのプロパティで、対応する参照を定義し、サーバーおよびデータベースの明示的な名前を SETVAR 変数に置き換えます。 この定義により、データベース間参照はデザイン時に検証できます。 また、データベース プロジェクトを分離開発環境に配置することもできます。この環境では、ターゲット サーバーの名前が、稼働環境のターゲット サーバーの名前と異なる可能性があります。
データベース間参照を含むデータベース プロジェクトがあり、これらの参照では、SETVAR 変数を使用してサーバーおよびデータベースを示しています。 このような変数の名前を変更して、これらの参照を含むオブジェクト定義を更新します。
開発中のデータベース プロジェクトから追加のデータベース スキーマを参照します。 これらのスキーマだけをチームと共有します。他のデータベース プロジェクトを共有する必要はありません。 このような他のプロジェクトのデータベース スキーマ ファイル (.dbschema) に参照を追加して、そのスキーマ ファイルだけをバージョン管理にチェックインすることができます。 この方法を使用すると、参照するスキーマを含むデータベース プロジェクトへのアクセスを制限できます。 また、データベース プロジェクトを配置するときに、そのデータベース プロジェクトに依存するプロジェクトを配置しない場合も、この方法を使用する必要があります。
データベース リファクタリングを使用して、データベース間参照で追加のタスクを実行できます。 詳細については、「方法 : サーバーまたはデータベースへの参照の名前を変更する」を参照してください。
データベース プロジェクトとスキーマ ファイルへの参照
データベース プロジェクトで参照を追加する場合、別のデータベース プロジェクト、またはデータベース プロジェクトのビルド時に生成されるスキーマ ファイルを指定できます。
次のステートメントが true である場合、他のデータベース プロジェクトを参照する必要があります。
- 参照を含むデータベースと参照先のデータベース両方のスキーマを変更する必要がある場合。 参照を含むデータベース プロジェクトを配置する場合は、参照先のデータベース プロジェクトも配置します。
次のいずれかのステートメントが true である場合、スキーマ ファイルを参照する必要があります。
現在のソリューションにプロジェクトが存在しないデータベースを参照する必要がある場合。
単一のプロジェクトが他のプロジェクトに依存していて、依存先プロジェクトを配置せずに単一のプロジェクトを配置する必要がある場合。
変更される可能性の低いデータベース スキーマを参照している場合。 この場合、スキーマ ファイルをバージョン管理にチェックインできます。
データベース間参照の制限事項
データベース スキーマをインポートすると、オブジェクト定義内の他のデータベースへの参照により、警告が生成されます。これは、データベース プロジェクトでは、プロジェクトの配置前に、これらの参照を検証できないためです。 プロジェクトのプロパティでデータベース参照を定義すると、オブジェクト定義を検証し、警告を解決できます。 その後、サーバーおよびデータベースの名前を変数に置き換えることで、オブジェクト定義を更新できます。 また、リファクタリングを使用して、置き換えることもできます。 詳細については、「方法 : データベース プロジェクトに参照を追加する」および「方法 : サーバーまたはデータベースへの参照の名前を変更する」を参照してください。
参照するサーバーおよびデータベースの変数と値は、ビルド構成に固有ではありません。 コマンド プロンプトでサーバーおよびデータベースを指定するには、MSBuild 変数として参照する必要があります。これらの変数は、配置時に置き換えることができます。
次の制限も適用されます。
参照をデータベースに追加できるのは、対応するデータベース プロジェクトがある場合のみです。
データベース プロジェクトのスキーマ ファイルに参照を追加する前に、そのデータベース プロジェクトをビルドする必要があります。
参照するデータベース プロジェクトをビルドして、データベース間参照が警告なく解決されるようにする必要があります。
ソリューションまたは参照するデータベース プロジェクトのビルド構成を変更すると、ソリューションをビルドし直して、データベース間参照が警告なく解決されるようにする必要がある場合があります。
別のサーバー上のデータベース プロジェクトのオブジェクトを参照する場合、ターゲット サーバーで、そのサーバーをリンク サーバーとして定義する必要があります。 詳細については、「方法 : データベース プロジェクトに参照を追加する」を参照してください。
マスタ データベースを参照する場合、データベース間参照は必要はありません。
SETVAR 変数が含まれる参照は、常に "[$(VariableName)]" 形式にする必要があります。 角かっこを省略すると、データベース プロジェクトを配置できない場合があります。
SETVAR 変数の名前は一意である必要があります。 サーバーとデータベースの名前が同じ場合、同じ値に解決される、異なる名前の付いた複数の変数を定義する必要があります。
セキュリティの考慮事項
データベース プロジェクトのビルド時に作成されるスキーマ ファイルには、そのプロジェクトのスキーマ情報が格納されています。 そのスキーマ情報を保護するために、この種類のファイルへのアクセスを制限する必要があります。 スキーマ ファイルは、ターゲット サーバーに配置するのではなく、バージョン管理にチェックインすることにより、チームで共有できます。 参照するデータベースのデータベース プロジェクトが同じソリューションにある場合、プロジェクトの他の開発者は、バージョン管理に同期して、ソリューションをビルドするときにアクセスできます。
データベース間参照の例
ReportDb および DependentDb という 2 つのデータベース プロジェクトがあり、DependentDb 内のオブジェクトを ReportDb から参照するとします。 まず、DependentDb データベース プロジェクトのプロパティで参照を追加し、変数を次のように定義します。
RefServer
RefDatabase
RefServer の値は、DependentDb が存在するサーバーの名前です。 RefDatabase の値は、DependentDb プロジェクトによって配置されるターゲット データベースの名前です。 この例では、RefServer に StageSvr があり、RefDatabase に DepDb があります。
DependentDb 内の Employee テーブルのすべての列を表示するビューを ReportDb に追加できます。 StageSvr という名前のサーバー上の DepDb という名前のデータベースにテーブルを配置します。 ビューのオブジェクト定義は、次のステートメントを追加して作成します。
CREATE VIEW [dbo].[DependentView]
AS
SELECT * FROM [$(RefServer)].[$(RefDatabase)].[dbo].[Employee]
;
参照を使用した複合プロジェクトの作成
データベース プロジェクトおよびサーバー プロジェクトは、データベース開発中に発生する可能性があるすべてのシナリオに対応できるとは限りません。 より複雑なシナリオに対応するために、2 つ以上の他のプロジェクトから複合プロジェクトを作成できます。
データベース プロジェクト内の参照を別のデータベースまたはサーバー プロジェクトに追加するが、参照先であるプロジェクト内のサーバー変数およびデータベース変数には値を指定しない場合、複合プロジェクトを作成します。 この種類の参照を追加すると、参照を追加したプロジェクトには、参照先のプロジェクト内のすべてのオブジェクトと設定が含まれます。
複合プロジェクトを作成することで、次のシナリオに対応できるようになります。
共有ログインまたは共有キーを参照するデータベース スキーマを管理できます。 詳細については、「共有サーバー オブジェクトを参照するデータベースのチーム開発の開始」を参照してください。
パフォーマンスを向上したり、スキーマまたはオブジェクト型を分割したりするために、大規模なデータベースをサブプロジェクトに分割できます。 複数のデータベースがいくつかのオブジェクトを共有しているが、他の点では異なる場合にこの変更を行うこともできます。 プロジェクトを 2 つ以上のサブプロジェクトに分割できるのは、その変更により循環参照が作成されない場合のみです。
複合プロジェクトを配置する場合は、参照先のすべてのデータベース プロジェクト内のオブジェクトも配置します。 詳細については、「大規模なデータベースのチーム開発の開始」を参照してください。
参照
処理手順
方法 : サーバーまたはデータベースへの参照の名前を変更する