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

时间:2015-12-01 09:45:59

标签: oracle dblink

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

create synonym dblink2 for dblink1

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

SELECT * FROM DUAL@DBLINK2

如何使用同义词进行查询?

编辑我知道如果我使用dblink创建表的视图,它将会起作用。但我的要求是上述问题。

5 个答案:

答案 0 :(得分:9)

不幸的是,不支持为dblinks创建同义词。如果您阅读documentation on synonyms,您会发现同义词的允许对象仅为:

  

使用CREATE SYNONYM语句创建同义词,这是一个   表,视图,序列,过程的替代名称,已存储   函数,包,物化视图,Java类模式对象,   用户定义的对象类型或其他同义词

您的第二个查询失败的原因是您创建的同义词无法正常运行。创建时未正确验证它,您可以创建任何类型的错误同义词。要验证,只需测试以下语句:

create synonym dblink3 for no_object_with_this_name;

你仍会收到这样的回复:

*Synonym DBLINK3 created.*

但当然没有什么能通过这个同义词起作用。

答案 1 :(得分:3)

我试图通过在db_link上放置同义词来考虑解决的业务问题,我唯一能想到的是你需要部署将从some_Table @ some_dblink中选择的常量代码虽然表名是常量,但不同的用户可能会查看不同的db_links。或者您只是想通过一个简单的同义词重命令来交换您正在操作的db_link。

问题在于:它无法以这种方式完成。不允许使用db_link同义词。

您唯一的解决方案是让代码通过同义词引用表,并将私有同义词设置为指向正确的db_link。这样你的代码就会继续从#REMOTE_TABLE1"中选择。你只需要翻转哪个DB_LINK即可获得远程桌面。

必须设置/重置100多个私人同义词是一件痛苦的事吗?是的。但是如果它是你需要经常做的事情,那么捆绑一个程序来为你做传递db_link名称的程序,然后循环并重置你的同义词。

答案 2 :(得分:1)

我没有看到为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;

现在,您可以使用同义词查询远程表格

SELECT * FROM my_table;

答案 3 :(得分:0)

如果您尝试为多个模式(用户)访问数据库链接,则答案是创建公共数据库链接

示例:

sudo yum install mysql-connector-java
ln -s /usr/share/java/mysql-connector-java.jar /var/lib/sqoop/mysql-connector-java.jar

之后,任何架构都可以发出:

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

答案 4 :(得分:0)

虽然我知道这个问题已有3年以上的历史了,但将来有人可能会从另一个答案中受益。

让我们想象一下,我有4个数据库,其中2个用于生产,2个用于开发/测试。

产品DB:PRDAPP1DB1和PRDAPP2DB1 开发DB:DEVAPP1DB1和DEVAPP2DB1

“ APP2”数据库正在运行过程,以从APP1数据库提取和导入数据。在这些过程中,有各种选择语句,例如:

transform._transform()

现在可以进行开发了,但是在将更新的过程部署到生产环境时,dblink2经常需要更改为dblink1。

如前所述,同义词不能用于此目的。 但是,请使用相同的名称,不同的连接字符串创建数据库链接。

例如在生产中:

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;

关于开发者:

CREATE DATABASE LINK "MyDBLINK" USING 'PRDAPP1DB1';

然后在过程中,将所有“ @ dblink1”和“ @ dblink2”更改为“ @mydblink”,并且所有内容都应该从此处透明。