我需要将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用户的行为会有所不同?
答案 0 :(得分:2)
使用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操作使用当前用户JAY
从远程数据库上的ADDRESS
表中进行选择。 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;
<强>文档强>