web-dev-qa-db-ja.com

SQL Visual Studioの発行プロファイルでの検索と置換

Visual Studioデータベースプロジェクト(SSDT)にソース管理があります。相互データベース参照を作成するには、以下のプロジェクト参照でこのようなものを利用します。

Otherdatabaseは当社で2つのオプションから選択できるため、プロジェクト参照が必要です。ほとんどの場合、90%がデータベースA、10%がデータベースBです。

これは、$と角かっこ[]を使用してコードを作成する開発者にとって頭痛の種です。これに対する回避策はありますか?たとえば、DatabaseAのデフォルトでコードを書くとします。

from [$(OtherDatabase)].dbo.PurchaseOrder
from DatabaseA.dbo.PurchaseOrder

複数のパブリッシュプロファイルスクリプトを作成する方法はありますか?データベースAへのすべての参照を検索し、データベースBで置き換えるパブリッシュプロファイルスクリプトを記述できますか?たぶん、単純なCtrl-Find and Replaceのようなものですか?この種類のコマンド、バッチファイル、ストアドプロシージャ、またはPowershellをパブリッシュプロファイルに組み込むにはどうすればよいですか?

効率的な方法を探しています。以下の回答を使用できますが、DatabaseAは同じサーバーに存在する必要があるため、削除して再作成すると、最適ではない可能性があります。

ビューとストアドプロシージャでデータベース名を検索して置換

このルートを回避し、検索/置換を実行しようとする同義語を認識している

3
user162241

クロスデータベースコードを作成するときは、3部構成の名前参照を避けたいと思います。あなたが説明する$(OtherDatabase)の変動性は、私が3部構成の名前を避ける正確な理由です。いつか、DatabaseADatabaseCに名前が変更され、コード内の一連の参照を更新する必要があります。あなたの場合、あなたは新しいビルドをすることができますが、それでもまだ苦痛です。

代わりに、クロスデータベース参照ごとにプロジェクトで synonyms を作成します。同義語では、オブジェクトごとにSSDTプロジェクト参照変数を1回使用します。

_CREATE SYNONYM dbo.PurchaseOrder FOR [$(OtherDatabase)].dbo.PurchaseOrder;
_

その後、クロスデータベースオブジェクトを参照するたびに、2つの部分からなる名前を使用するだけで済みます。開発者は、検索と置換に[$(OtherDatabase)]もプレースホルダDatabaseA参照も使用しないでください。

_FROM dbo.PurchaseOrder
_

これには、すべてのcodeがデータベースの異なる繰り返しで常に同じになるという追加の利点があります。一致しない唯一のオブジェクトタイプはシノニムになります。コードを検査する代わりに、単純に_sys.synonyms_ DMVをクエリして、_dbo.PurchaseOrder_が指している場所を特定できます。

このクエリでは、nameは2部構成の名前(ex PurchaseOrder)を返し、_base_object_name_は3部構成の名前(ex _DatabaseA.dbo.PurchaseOrder_)を返します。

_SELECT name, base_object_name FROM sys.synonyms;
_

DatabaseAからDatabaseBに再ポイントする必要があるデータベースがある場合、一連の_DROP SYNONYM_&_CREATE SYNONYM_ステートメントを使用してシノニムを再ポイントするだけで、プロシージャのALTERステートメントを実行する必要はありません/ビュー/関数/トリガー。

2
AMtwo