我已经为dblink创建了一个同义词。
create synonym dblink2 for dblink1
但是当我使用同义词而不是dblink查询任何内容时,我找不到远程数据库的连接描述错误。
SELECT * FROM DUAL@DBLINK2
如何使用同义词进行查询?
编辑我知道如果我使用dblink创建表的视图,它将会起作用。但我的要求是上述问题。
答案 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”,并且所有内容都应该从此处透明。