由其他用户拥有的创建数据库链接的Oracle语法

10

创建数据库链接的典型语法如下:

create database link remote_db_link 
connect to remote_user 
identified by remote_password 
using 'remote_db'

但是我希望在创建完成之后,我的数据库链接归另一个账户所有。有没有办法实现这个需求?

以下方法不可行:

create database link anotheruser.remote_db_link 
connect to remote_user 
identified by remote_password 
using 'remote_db'

“选中”的答案说“你不能在另一个用户的模式中创建数据库链接”。这不完全正确。确实有“Oracle语法”可以完成此操作。请参阅我的答案。 - spencer7593
3个回答

20

Sathya是正确的,CREATE DATABASE LINK语法不允许在另一个架构中创建数据库链接。然而......

解决方法

只要anotheruser具有CREATE DATABASE LINK权限,并且您连接的用户具有CREATE ANY PROCEDURE权限,则可以在另一个用户的架构中创建数据库链接。

以下是我使用的解决方法:

    create procedure anotheruser."tmp_doit_200906121431"
    is
    begin
      execute immediate '
        create database link remote_db_link 
        connect to remote_user 
        identified by remote_password 
        using ''remote_db'' ';
    end;
    /
    begin
      anotheruser."tmp_doit_200906121431";
    end;
    /
    drop procedure anotheruser."tmp_doit_200906121431"
    /

让我们详细解释一下。首先,在anotheruser的架构中创建一个存储了想要运行的CREATE DATABASE LINK语句的过程。

当执行该过程时,它将作为该过程的所有者运行,因此CREATE DATABASE LINK语句由anotheruser执行。

过程名称并不重要,除了需要确保它不会与任何现有对象名称冲突。我使用小写字母(在双引号中括起过程名称),使用“tmp”标记此对象为“临时”,并使用当前yyyymmddhh24miss作为过程名称的一部分。(我通常运行DBA_OBJECTS的查询来检查是否存在匹配的object_name。)

对于“一次性”类型的管理员功能,这是一个可行的解决方法。相比于其他替代方案:保存anotheruser的密码,更改密码,连接用户,然后将anotheruser的密码重置回保存的密码,我更喜欢使用这个方法。


9

DBLink的限制 - 你不能在其他用户的模式下创建数据库链接,也不能使用模式名称来限定DBLink。


我很担心这个。感谢大家的时间。 - Jeff
1
说“你不能在另一个用户的模式中创建数据库链接”是不准确的。这是不正确的。CREATE DATABASE LINK语法不允许它,但是它是可能的。请参见我的答案。 - spencer7593

-3
作为系统用户,您可以在SYS.DBA_DB_LINKS视图中查看所有的数据库链接。 该视图使用link$和user$表。 您可以像往常一样创建新的dblink,并且它会显示在link$表中。然后更改所有者(使用来自user$的id)。提交。完成。

谢谢您的回答,但是这个问题已经有一个被接受的答案了。 - alestanis
2
请注意,本答案中描述的方法*不受Oracle支持。Oracle强烈警告不要在未经Oracle支持指导的情况下发出DML以修改SYS模式中表的内容。 - spencer7593

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接