1

我需要将 Oracle 中的数据库链接从普通的公共数据库链接转换为公共共享数据库链接。

我以具有 DBA 权限的用户身份运行以下命令以共享链接:

DROP PUBLIC DATABASE LINK "MYDBLINK";

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

我使用了与数据库链接已经使用的用户名和密码相同的用户名和密码。

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

ORA-01017: 无效的用户名/密码;登录被拒绝

任何想法为什么链接对于非 DBA 用户的行为会有所不同?

4

1 回答 1

2

对远程数据库的身份验证是通过使用 onAUTHENTICATED BY子句定义的凭证来完成的。建立连接后,远程数据库上的操作将使用用户定义的 onCONNECT 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 操作使用了当前用户,该用户将从远程数据库上JAY的表中进行选择。远程数据库上不存在用户。ADDRESSJAY

那么,接下来呢?

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;

文档

  • 使用共享数据库链接

  • 于 2017-10-05T04:19:07.607 回答