如何在 Oracle 中使用 DBlink 的同义词?

How to use synonym of a DBlink in Oracle?

我已经为 dblink 创建了一个同义词。

create synonym dblink2 for dblink1

但是当我使用同义词而不是 dblink 查询任何内容时,我收到 找不到远程数据库的连接描述 错误。

SELECT * FROM DUAL@DBLINK2

如何使用同义词查询?

编辑: 我知道如果我创建 table 使用 dblink。但是我的要求就是上面的问题

我看不出为 dblink 本身创建同义词有什么意义。理想情况下,您使用 dblink.[=12 为 远程 table 创建 synonym =]

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

现在,您可以使用同义词查询远程table:

SELECT * FROM my_table;

很遗憾,不支持为 dblinks 创建同义词。如果你阅读documentation on synonyms,你会发现允许的同义词对象只有:

Use the CREATE SYNONYM statement to create a synonym, which is an alternative name for a table, view, sequence, procedure, stored function, package, materialized view, Java class schema object, user-defined object type, or another synonym.

你的第二个查询失败的原因是你创建的同义词没有正常工作。它在创建时没有被正确验证,你可以创建任何类型像这样的不正确的同义词。要验证,只需测试以下语句:

create synonym dblink3 for no_object_with_this_name;

您仍然会收到这样的回复:

*Synonym DBLINK3 created.*

当然,这个同义词什么也做不了。

如果您想让多个模式(用户)可以访问数据库 link,答案是创建一个 public 数据库 link

示例:

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

之后任何模式都可以发出:

SELECT * FROM TABLE@dblink1

我正在考虑通过在 db_link 上放置同义词来解决的业务问题,我唯一能想到的是您需要部署将要选择的常量代码来自 some_Table@some_dblink,虽然 table 名称不变,但不同的用户可能会查看不同的 db_link。或者您只是希望能够通过简单的同义词重新指向来交换您正在操作的 db_link。

问题是:不能那样做。 db_link 不允许使用同义词。

您唯一的解决方案是让代码通过同义词引用 table,并将私有同义词设置为指向正确的 db_link。这样,您的代码将继续 "Select from REMOTE_TABLE1",您只需翻转 DB_LINK 您从哪个 table 获取遥控器。

set/reset 100 多个私有同义词是不是很痛苦?是的。但是,如果这是您需要经常做的事情,那么在您传入 db_link 名称的地方捆绑一个程序来为您完成它,它会循环并为您重置同义词。

虽然我知道这个问题已经 3 年多了,但将来有人可能会从不同的答案中受益。

假设我有 4 个数据库,2 个用于生产,2 个用于开发/测试。

产品数据库:PRDAPP1DB1 和 PRDAPP2DB1 开发数据库: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”,从那里应该都是透明的。