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

Jef*_*eff 7 oracle dblink owner

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

create database link remote_db_link 
connect to remote_user 
identified by remote_password 
using 'remote_db'
Run Code Online (Sandbox Code Playgroud)

但我希望我的数据库链接在创建后由另一个帐户拥有.有没有办法做到这一点?

以下不起作用:

create database link anotheruser.remote_db_link 
connect to remote_user 
identified by remote_password 
using 'remote_db'
Run Code Online (Sandbox Code Playgroud)

spe*_*593 15

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

替代方法

IS可以创建其他用户的模式的数据库链接,只要anotheruserCREATE 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"
    /

让我们放松一下吧.首先,我在anotherusers模式中创建一个过程; 此过程包含CREATE DATABASE LINK我要运行的语句.

执行该过程时,它将作为过程的所有者运行,以便CREATE DATABASE LINK执行该语句anotheruser.

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

对于"一次性"类型的管理功能,这是一种可行的解决方法.我更喜欢这个替代方案:保存另一个用户的密码,更改密码,以用户身份连接,以及将另一个用户的密码重置为已保存的密码.)


Sat*_*hat 9

对DBLink的限制 - 您无法在其他用户的架构中创建数据库链接,也无法使用架构名称限定dblink.