web-dev-qa-db-ja.com

シノニムベースオブジェクトからのデータベースの取得

馬鹿げたことを尋ねるリスクはありますが、Google-fuでは簡単に取得できませんが、類義語の基本オブジェクトからデータベースID(およびその他の情報)を照会する方法はありますか?

問題のシノニムはリモートのシノニムです(同じサーバー上の別のDBのテーブルを指します)。基本オブジェクト自体は固定されていません。プロシージャの実行ごとに異なるDB上の同じテーブルです。

非特定の方法(例:sys.synonymsのbase_object_name列の解析に依存したくない)が欲しいのですが、それが唯一の選択肢であると言われたら、理解できます。

そしてそれは質問をしますので:並行性は問題ではないので、1つのクライアントだけがそのプロシージャを呼び出します。

2
Fabricio Araujo

これは、3つの部分からなるすべての名前、およびサーバーがローカルインスタンスであるすべての4つの部分からなる名前に対して機能します。

_SELECT 
  name, base_object_name,
  DB_ID(PARSENAME(base_object_name,3)),
  DB_NAME(DB_ID(PARSENAME(base_object_name,3)))
FROM sys.synonyms;
_

NULLが表示された場合は、シノニムが2部構成になっている(たとえば、現在のデータベース内のオブジェクトを参照している)か、シノニムにリストされているデータベースが存在しない(名前が変更されたか、削除された可能性があります)等)。

4部構成の名前がリモートサーバーを参照している場合、DB_ID()/DB_NAME()を使用できません。リモートサーバーの_master.sys.databases_に参加する必要があります。これには、最初にリンクサーバーが使用され、動的SQLが構築されます。それについて言及するだけです。それはあなたのユースケースの問題ではないようです。

3部構成の名前のみに制限する場合は、以下の述部を追加できます。

_WHERE PARSENAME(base_object_name,3) IS NOT NULL
AND PARSENAME(base_object_name,4) IS NULL;
_
3
Aaron Bertrand