web-dev-qa-db-ja.com

OracleでDBlinkの同義語を使用するにはどうすればよいですか?

Dblinkの同義語を作成しました。

create synonym dblink2 for dblink1

しかし、dblinkの代わりにシノニムを使用して何かをクエリすると、リモートデータベースの接続の説明が見つかりませんエラーが発生します。

SELECT * FROM DUAL@DBLINK2

同義語を使用してクエリを実行するにはどうすればよいですか?

編集: dblinkを使用してテーブルのビューを作成すると機能することはわかっています。しかし、私の要件は上記の質問です。

5
Nitish

残念ながら、dblinksの同義語の作成はサポートされていません同義語に関するドキュメント を読むと、同義語に許可されているオブジェクトは次のとおりであることがわかります。

CREATE SYNONYMステートメントを使用して、テーブル、ビュー、シーケンス、プロシージャ、ストアド関数、パッケージ、マテリアライズドビュー、Javaクラススキーマオブジェクトの代替名であるシノニムを作成します。 、ユーザー定義のオブジェクトタイプ、または別の同義語

2番目のクエリが失敗する理由は、作成したシノミムが正しく機能していないためです。作成時に正しく検証されていないため、次のことができます。そのような間違った同義語を作成します。確認するには、次のステートメントをテストするだけです。

create synonym dblink3 for no_object_with_this_name;

それでも次のような応答があります。

*Synonym DBLINK3 created.*

しかしもちろん、この同義語では何も機能しません。

9
Gergely Bacso

私はdb_linkに同義語を置くことで解決されるビジネス上の問題を考えようとしていますが、私が考えることができる唯一のことは、some_Table @ some_dblinkから選択する定数コードをデプロイする必要があるということですが、テーブルは名前は一定であり、さまざまなユーザーがさまざまなdb_linkを探している可能性があります。または、操作しているdb_linkを単純なシノニムリポイントで交換できるようにしたいだけです。

ここに問題があります:それはそのように行うことができません。 db_linkシノニムは許可されていません。

唯一の解決策は、コードが代わりにシノニムによってテーブルを参照し、正しいdb_linkを指すようにプライベートシノニムを設定することです。そうすれば、コードは「REMOTE_TABLE1から選択」を続行し、そのリモートテーブルを取得しているDB_LINKを反転させることができます。

100以上のプライベートシノニムを設定/リセットするのは面倒ですか?うん。しかし、それが頻繁に行う必要がある場合は、db_link名を渡すと、それを実行するためのプロシージャがバンドルされ、循環してシノニムがリセットされます。

3

Dblink自体のシノニムを作成する意味がわかりません。理想的には、dblinkを使用してリモートテーブル同義語を作成します。

CREATE DATABASE LINK my_db_link CONNECT TO user IDENTIFIED BY passwd USING 'alias';
CREATE SYNONYM my_table FOR remote_table@my_db_link;

これで、synonymを使用してリモートテーブルをクエリできます。

SELECT * FROM my_table;
2
Lalit Kumar B

複数のスキーマ(ユーザー)がDBリンクにアクセスできるようにしようとしている場合、答えはpublic dbリンクを作成することです。

例:

CREATE PUBLIC DATABASE LINK dblink1 CONNECT TO user IDENTIFIED BY password USING 'tnsalias';

その後、どのスキーマでも以下を発行できます。

SELECT * FROM TABLE@dblink1
0

この質問は3歳以上であると理解していますが、将来、誰かが別の回答から利益を得ることができるかもしれません。

私が4つのデータベースを持っていると想像してみましょう。2つは本番用、2つは開発/テスト用です。

製品DB:PRDAPP1DB1およびPRDAPP2DB1開発DB:DEVAPP1DB1およびDEVAPP2DB1

「APP2」データベースは、APP1データベースからデータを抽出およびインポートするためのプロシージャを実行しています。これらの手順には、次のようなさまざまなselectステートメントがあります。

declare
iCount INTEGER;
begin
  insert into tbl_impdata1
  select sysdate, col1, col2, substr(col3,1,10), substr(col3,15,3)
  from tbl1@dblink2; -- Where dblink2 points to DEVAPP1DB1
  ...
  <more statements here>
  ...
EXCEPTION
  <exception handling code here>
end;

これで開発は問題ありませんが、更新されたプロシージャを本番環境にデプロイするときは、dblink2を常にdblink1に変更する必要があります。

指摘されたように、同義語はこの目的には使用できません。ただし、代わりに、同じ名前、異なる接続文字列でデータベースリンクを作成します。

例えば。生産時:

CREATE DATABASE LINK "MyDBLINK" USING 'PRDAPP1DB1';

そして開発者:

CREATE DATABASE LINK "MyDBLINK" USING 'DEVAPP1DB1';

次に、手順で、すべての「@ dblink1」と「@ dblink2」を「@mydblink」に変更すると、そこからすべてが透過的になります。

0
Peter T.