web-dev-qa-db-ja.com

クロスデータベース結合を使用するデータベースの開発/テスト環境

SQL Serverデータベースプロジェクトのソース管理下にある既存のデータベースがあり、これらのデータベースの多くは相互に参照しています。

これらをプロジェクトとソース管理に組み込むことは十分に困難でしたが、新しいSQLサーバーインスタンスを使用せずに開発/テスト環境をセットアップするのは難しいと感じています。

現時点では、継続的デプロイの一部として使用されているテストSQLインスタンスにデータベースのコピーがあります。私が探しているのは、ブランチで開発し、同じインスタンス上のDevプレフィックスを持つデータベースに対して作業することですが、これらは継続的デプロイに使用されるデータベースを参照していることを認識しています。

これは、名前だけでなくデータベース参照でデータベース変数を使用することで可能でしょうか?そうであれば、プロジェクト間でSQLCMD変数を共有する方法と方法はありますか?検討する別の方法はありますか?

1
mheptinstall

ここで説明するように、複数のpublish.xmlファイルを使用することをお勧めします Jamie Thompsonブログ

データベース名(またはプレフィックス)は、SQLCMD変数として格納できます。

次に、各公開ファイルがビルドされ、ビルドアーティファクトとして公開されます。サーバー名に基づいて正しいファイルを選択するには、カスタムのPowerShellまたはバッチジョブをコーディングする必要があります。 (ここではサーバー名をスイッチとして使用できます)

環境ごとに公開ファイルを一度設定する必要がありますが、その作業が完了すると、再度行う必要はありません。

0
George.Palacios

以前の人生では、各環境の異なるサーバー上で、いくつかの制御データベースとともに、大量の同一のデータベースを使用してかなり大規模な実装を管理していました。開発、QA、テスト、本番前、本番など、同じように機能する必要のあるデータベース間クエリがたくさんありました。私のソリューションは、すべてのサーバーとデータベース間の参照を更新するスクリプトではなく、同義語を使用することでした。

Devでは、すべてが1つのサーバー上にありました。

CREATE SYNONYM dbo.ControlTable FOR ControlDB.dbo.ControlTable;

QAでは、制御テーブルが別のサーバー上にありました。

CREATE SYNONYM dbo.ControlTable FOR ControlServerQA.ControlDB.dbo.ControlTable;

これで、制御テーブルを必要とするいずれかの環境のデータベース内のすべてのコードがdbo.ControlTableを参照するだけで、自動同期/デプロイからシノニムを除外しました(シノニムが実際に変更された場合を除く)。

そのテーブルを別のデータベースに移動したり、別の名前のデータベースを使用したり、そのデータベースを別のサーバーに移動したりした場合、コードに触れる必要はありませんでした。シノニムを削除して再作成しただけです。

あなたの場合、devプロジェクト/ devデータベースの同義語は次のようになります。

CREATE SYNONYM dbo.tTableName FOR DevPrefixDB.SchemaName.TableName;

そして、本番データベースでは:

CREATE SYNONYM dbo.tTableName FOR DefaultDbName.SchemaName.TableName;

シノニム名をオブジェクト名と同じ名前にしたい場合は、シノニムを独自のスキーマに配置できます。

CREATE SCHEMA syn;
GO
CREATE SYNONYM syn.TableName FOR DefaultDbName.SchemaName.TableName;

また、dev dbでは、次のようになります。

CREATE SCHEMA syn;
GO
CREATE SYNONYM syn.TableName FOR DevPrefixDB.SchemaName.TableName;

(これで、同義語(またはそのスキーマ)をプロジェクトとは別に展開可能なものとして保持し、ワイヤーの交差を回避します。)

ここで同義語についてブログを書きました。これらは非常に便利ですが、十分に活用されていない機能です。

0
Aaron Bertrand