web-dev-qa-db-ja.com

データベースの同義語/エイリアスと同等

SP Database1にコードがある場合、(同じサーバー上の)Database2にクエリを実行し、同じコードをデータベースDatabase1DevとDatabase2Devで機能させます。ただし、これは現在、Push to Liveを実行するたびに完全なSPを編集することを意味します。

次のような1行のコードが必要です。

select col1, col2 from databaseName..ourTable

ここで、databaseNameはサーバーレベルで設定されています。

シノニムはこのための間違った解決策であることを理解しています。すべての単一のオブジェクトの同義語の記述を含まない、私たちが使用できる類似のものはありますか?

1
Paul

オブジェクトのシノニムを作成できますが、現在データベースのシノニムは作成できません。これはコネクトでよく使われるリクエストです。

したがって、質問で述べたように、影響を受けるオブジェクトごとにCREATE SYNONYMを実行する必要があります。このように、開発インスタンスでは:

CREATE SYNONYM MyObjectSyn
FOR Database1Dev.dbo.MyObject;

そして、prodインスタンスでは次のようになります:

CREATE SYNONYM MyObjectSyn
FOR Database1.dbo.MyObject;

次に、ストアドプロシージャコードはMyObjectSynを代わりに参照します。

この問題を回避するもう1つの方法は、お勧めしませんが、各データベースに接続されたリンクサーバーを使用することです。リンクサーバーは、devでDatabase1Devに、データベースでprodに再ポイントできます。

または、 Scott Hodgin が推奨するように、各サーバーで動的SQLと構成テーブルを使用し、<database1>をそのサーバーの特定のデータベースに「マップ」します。ストアドプロシージャは、構成テーブルとREPLACE <database1>を読み取り、構成テーブルから取得した名前を使用します。

1
Max Vernon