データベース プロジェクトでの参照の使用

さまざまな状況に対応するために、データベース プロジェクトで複数の種類の参照を追加できます。 参照の種類によって、手順は少し異なります。

次の表は、追加できる参照の種類と、それぞれが対応する状況を示しています。

参照の種類

使用する理由

現在のソリューションのデータベース プロジェクト (.dbproj)

この種類の参照は、いくつかの状況に対応するために追加します。

  • 1 つのプロジェクト内のデータベース オブジェクトを別のプロジェクトから参照するには、参照を追加し、サーバーの名前を指定する変数 (省略可能) と、そのオブジェクトが格納されているデータベースの名前を指定する変数を定義します。 データベースで別のデータベース内のオブジェクトを参照する場合は、これらのデータベース間参照を使用します。 詳細については、「他のデータベースを参照するデータベースのチーム開発の開始」を参照してください。

別のプロジェクトへの参照を追加し、変数は定義しないと、複合プロジェクトが作成されます。 この種類のプロジェクトを配置すると、別のプロジェクトのオブジェクトも配置されます。 詳細については、このトピックの後半にある「参照を使用した、複合プロジェクトの作成」を参照してください。

現在のソリューションまたは別のソリューションからの、データベース プロジェクトの出力 (.dbschema ファイル)

別のデータベース内のオブジェクトを参照する必要があるが、そのデータベースを他の開発者から分離する場合は、データベース スキーマ ファイルに参照を追加します。 データベースが変更されることを防ぐ場合、またはデータベースを更新できない場合は、この方法で追加します。 たとえば、サーバー上で共有および定義されているが、複数のデータベース プロジェクトが使用しているログインまたはキーを、自分のデータベース プロジェクトで参照する必要がある場合は、.dbschema ファイルに参照を追加できます。 詳細については、「共有サーバー オブジェクトを参照するデータベースのチーム開発の開始」を参照してください。

サーバー オブジェクト用の定義が含まれている .dbschema ファイルを参照する場合や、データベース プロジェクトの配置時にサーバー上の設定を検証しない場合があります。 このような場合は、master.dbschema ファイルへの参照を追加し、値が "マスター" のデータベース変数についてリテラルを定義できます。 そうすることによって、"マスター" データベースで定義されたオブジェクトへの参照を、エラーを発生させることなく解決できます。 リテラルの詳細については、このトピックの後半にある「リテラルを使用した、データベースの参照」を参照してください。

システム オブジェクトの定義が含まれている master.dbschema ファイル

システム ストアド プロシージャ、システム テーブル、システム ビュー、システム カタログなどのシステム オブジェクトを参照する場合は、適切な master.dbschema への参照を追加して、それらの参照を解決する必要があります。 たとえば、ストアド プロシージャの sys.sysobjects を参照する場合があります。 サポートされている各バージョンの SQL Server について、Visual Studio Premium では master.dbschema ファイルが提供されます。 .dbschema ファイルは [Program Files]\Microsoft Visual Studio 10.0\VSTSDB\Extensions\SqlServer\Version\DBSchemas にあります。この Version は、使用している SQL Server のバージョン (2005 や 2008 など) です。

このような場合は、適切な master.dbschema ファイルへの参照を追加し、値が "マスター" のデータベース変数についてリテラルを定義できます。 そうすることによって、"マスター" データベースで定義されたオブジェクトへの参照を、エラーを発生させることなく解決できます。 リテラルの詳細については、このトピックの後半にある「リテラルを使用した、データベースの参照」を参照してください。

現在のソリューションの SQL 共通言語ランタイム (CLR) プロジェクト

データベース プロジェクトと共に配置する 1 つ以上の SQLCLR オブジェクトを開発している場合は、現在のソリューション内の SQLCLR プロジェクトを参照します。 データベース プロジェクトを配置するときには、参照先の SQLCLR プロジェクトで生成されたアセンブリも配置します。 その参照用に指定するプロパティに基づいて、CREATE ASSEMBLY ステートメントがビルドされます。 詳細については、「SQLCLR オブジェクトを参照するデータベースのチーム開発の開始」、およびこのトピックの後半にある「データベース間参照の定義」を参照してください。

現在のソリューション内のプロジェクトから、または別のソースから取得した SQLCLR アセンブリ

データベース プロジェクトで、SQLCLR アセンブリで定義されているが、同時には開発されていない、または同じチームでは開発されていないオブジェクトを参照する必要がある場合は、その SQLCLR アセンブリへの参照を追加します。 データベース プロジェクトを配置するときに、参照先のアセンブリも配置します。

.xsd ファイルで定義された、XML スキーマ定義

型指定された XML 変数、パラメーター、および列を作成するためにスキーマを変数、パラメーター、または列と関連付ける前に、そのスキーマを登録する必要があります。 次のいずれかの場合には、型指定された XML を使用できます。

  • XML データ用のスキーマがあり、サーバーでそのデータをそのスキーマに基づいて検証する必要がある場合。

  • 型情報に基づいてストレージとクエリを最適化する必要がある場合。

  • クエリのコンパイル時に型情報を活用する必要がある場合。

詳細については、「XML スキーマ コレクションを使用するデータベースのチーム開発の開始」を参照してください。

データベース間参照の定義

別のデータベース内のオブジェクトを参照するデータベース オブジェクトを作成またはインポートする場合は、データベース プロジェクトのプロパティで、対応する参照を定義する必要があります。 参照するデータベースごとに、参照先のサーバーおよびデータベースに対応する SETVAR 変数を定義できます。 参照を含めるようにオブジェクト定義を変更する場合は、サーバーおよびデータベースの明示的な名前ではなくこれらの変数を使用して定義できます。 データベース プロジェクトをビルドすると、変数は指定した値に置き換えられます。

データベース間参照のシナリオ

Visual Studio Premium は、次のシナリオをサポートします。

  • データベース プロジェクトを作成し、既存のデータベースからスキーマをインポートしました。 スキーマには、他の 1 つ以上のデータベース内のオブジェクトを参照するオブジェクトが含まれています。 プロジェクトのプロパティで、対応する参照を定義し、サーバーおよびデータベースの明示的な名前を SETVAR 変数に置き換えます。 この定義により、データベース間参照はデザイン時に検証できます。 また、データベース プロジェクトを分離開発環境に配置することもできます。この環境では、ターゲット サーバーの名前が、稼動環境のターゲット サーバーの名前と異なることがあります。

  • データベース間参照を含むデータベース プロジェクトがあり、これらの参照では、SETVAR 変数を使用してサーバーおよびデータベースを示しています。 このような変数の名前を変更して、これらの参照を含むオブジェクト定義を更新します。

  • 開発中のデータベース プロジェクトから追加のデータベース スキーマを参照します。 これらのスキーマだけをチームと共有します。他のデータベース プロジェクトを共有する必要はありません。 このような他のプロジェクトのデータベース スキーマ ファイル (.dbschema) に参照を追加して、そのスキーマ ファイルだけをバージョン管理にチェックインすることができます。 この方法を使用すると、参照先スキーマを含むデータベース プロジェクトへのアクセスを制限できます。 また、データベース プロジェクトを配置するときに、そのデータベース プロジェクトに依存するプロジェクトを配置しない場合も、この方法を使用する必要があります。

データベース リファクタリングを使用して、データベース間参照で追加のタスクを実行できます。 詳細については、「方法 : サーバーまたはデータベースへの参照の名前を変更する」を参照してください。

データベース プロジェクトおよびスキーマ ファイルへの参照

データベース プロジェクトで参照を追加する場合、別のデータベース プロジェクト、またはデータベース プロジェクトのビルド時に生成されるスキーマ ファイルを指定できます。

次の条件に当てはまる場合は、別のデータベース プロジェクトを参照する必要があります。

  • 参照を含むデータベースと参照先のデータベース両方のスキーマを変更する必要がある場合。 参照を含むデータベース プロジェクトを配置する場合は、参照先のデータベース プロジェクトも配置します。

次の条件のいずれかに当てはまる場合は、スキーマ ファイルを参照する必要があります。

  • 現在のソリューションにプロジェクトが存在しないデータベースを参照する必要がある場合。

  • 単一のプロジェクトが他のプロジェクトに依存していて、依存先プロジェクトを配置せずに単一のプロジェクトを配置する必要がある場合。

  • 変更される可能性の低いデータベース スキーマを参照している場合。 この場合、スキーマ ファイルをバージョン管理にチェックインできます。

データベース間参照の制限事項

データベース スキーマをインポートすると、オブジェクト定義内の他のデータベースへの参照により、警告が生成されます。これは、データベース プロジェクトでは、プロジェクトの配置前に、これらの参照を検証できないためです。 プロジェクトのプロパティでデータベース参照を定義すると、オブジェクト定義を検証し、警告を解決できます。 その後、サーバーおよびデータベースの名前を変数に置き換えることで、オブジェクト定義を更新できます。 また、リファクタリングを使用して、置き換えることもできます。 詳細については、「方法: データベース プロジェクトに参照を追加する」および「方法 : サーバーまたはデータベースへの参照の名前を変更する」を参照してください。

参照先のサーバーおよびデータベースの変数と値は、ビルド構成に固有ではありません。 コマンド プロンプトでサーバーおよびデータベースを指定するには、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]
;

参照を使用した、複合プロジェクトの作成

データベース プロジェクトとサーバー プロジェクトで、データベース開発中に遭遇するすべての状況に対応することはできません。 より複雑な状況に対応するために、複数の他のプロジェクトを使用して、複合プロジェクトを作成できます。

別のデータベース プロジェクトまたはサーバー プロジェクトへの参照をデータベース プロジェクトに追加するが、参照先プロジェクトでそのサーバーおよびプロジェクトの変数の値を指定しないときに、複合プロジェクトを作成します。 この種類の参照を追加すると、参照を追加したプロジェクトには、参照が指し示すプロジェクト内のすべてのオブジェクトと設定が含まれます。

複合プロジェクトを作成することによって、次のことが可能になります。

  • 共有のログインまたはキーを参照するデータベース スキーマを管理できます。 詳細については、「共有サーバー オブジェクトを参照するデータベースのチーム開発の開始」を参照してください。

  • 大規模データベースを複数のサブプロジェクトに分割して、パフォーマンスを向上させたり、スキーマやオブジェクトの種類を分けることができます。 また、複数のデータベースでいくつかのオブジェクトを共有するが、別の場合には異なる場合も、この変更を加えます。 複数のプロジェクトに分割できるのは、その変更によって循環参照が発生しない場合に限ります。

複合プロジェクトを配置するときには、参照先のすべてのデータベース プロジェクトのオブジェクトも配置します。 詳細については、「大規模なデータベースのチーム開発の開始」を参照してください。

リテラルを使用した、データベースの参照

データベース参照変数を定義して、ターゲットの配置環境内の参照先データベースの名前を指定できます。 ターゲット データベース名が配置環境で常に同じであるため、SQLCMD 変数を使用しない場合は、値が参照先データベースの名前であるリテラルを指定できます。

変数を使用する場合、構文は次のようになります。

CREATE VIEW [dbo].[View1] AS SELECT * FROM [($MasterDbVar)].[dbo].[spt_values].

代わりにリテラルを使用する場合、構文は次のようになります。

CREATE VIEW [dbo].[View1] AS SELECT * FROM [master].[dbo].[spt_values]

リテラル値の指定方法の詳細については、「方法: データベース プロジェクトに参照を追加する」を参照してください。

参照

処理手順

方法 : サーバーまたはデータベースへの参照の名前を変更する

方法: データベース プロジェクトに参照を追加する

概念

データベース オブジェクトおよびサーバー オブジェクトの作成と変更