Oracle public 共享数据库 link 不适用于非 DBA 用户

Oracle public shared database link not working for non-DBA users

我需要将 Oracle 中的数据库 link 从普通 public 数据库 link 转换为 public shared 数据库 link.

我 运行 以下作为我的具有 DBA 权限的用户可以共享 link:

DROP PUBLIC DATABASE LINK "MYDBLINK";

CREATE SHARED PUBLIC DATABASE LINK "MYDBLINK"
AUTHENTICATED BY SOME_USER
IDENTIFIED BY thepassword
USING 'OTHERDB';

我使用的用户名和密码与数据库 link 已经在使用的用户名和密码相同。

当我使用具有 DBA 权限的用户跨数据库 link 查询时,它工作正常。但是当我使用非 DBA 特权用户并检查数据库 link 时,它显示数据库 link 的用户名是 null,如果我尝试查询link,我得到:

ORA-01017: invalid username/password; logon denied

知道为什么 link 对非 DBA 用户的行为会有所不同吗?

远程数据库的身份验证是使用 AUTHENTICATED BY 子句中定义的凭据完成的。建立连接后,对远程数据库的操作将继续使用 CONNECT TO 子句或 CURRENT USER 中定义的用户权限,而不是 AUTHENTICATED BY 模式。

在你的例子中,你没有定义 CONNECT TO 模式,因此它使用本地数据库中的当前用户对远程数据库进行操作。如果您当前在本地数据库上登录的用户在远程服务器上不存在,则会出现此错误。

这是一个演示

在本地数据库上(AS SYSDBA)

SQL> CREATE SHARED PUBLIC DATABASE LINK link2remotedb
AUTHENTICATED BY userA_uat IDENTIFIED BY userA_uat
USING 'ORCLUAT';  

Database link created.

然后我通过一个存在于本地数据库但不存在于远程数据库的用户进行连接。

SQL> conn jay/jay
Connected.
SQL> select * from address@link2remotedb;
select * from address@link2remotedb
                      *
ERROR at line 1:
ORA-01017: invalid username/password; logon denied
ORA-02063: preceding line from LINK2REMOTEDB

发生错误是因为 SELECT 操作使用了远程数据库上 ADDRESS table 的 JAY 到 select 的当前用户. JAY 用户在远程数据库中不存在。

那么,接下来呢?

CONNECT TO 子句中定义用户。

SQL> CREATE SHARED PUBLIC DATABASE LINK link2remotedb
CONNECT TO userA_uat IDENTIFIED BY userA_uat
AUTHENTICATED BY userA_uat IDENTIFIED BY userA_uat
USING 'ORCLUAT'; 

Database link created.

SQL> conn jay/jay
Connected.
SQL> select * from address@link2remotedb;

文档

  • Using Shared Database Links