1

我们有一个使用 SQLPLUS 命令连接到 Oracle DB 的遗留代码:

sqlplus "$USERNAME/$PASSWORD@//$HOST:$PORT/$SERVICE_NAME"

变量 USERNAME、PASSWORD、HOST、PORT 和 SERVICE_NAME 的值是使用外部属性文件配置的。当我们拥有具有服务名称的数据库时,此代码有效。在我们的例子中,数据库有默认服务:

SYS_CONTEXT('USERENV','SERVICE_NAME')                                                                                                                                                                                                                           
-------------------------------------
SYS$USERS

DB 只有 SID:

SYS_CONTEXT('USERENV','SID')                                                                                                                                                                                                                                    
----------------------------
521

有没有办法使用默认服务名称连接到 Oracle DB?例如

sqlplus "$USERNAME/$PASSWORD@//$HOST:$PORT/SYS$USERS"

它失败并出现错误:错误:

ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor

我们还尝试将 SID 设置为:

sqlplus "$USERNAME/$PASSWORD@//$HOST:$PORT/521"

它失败并出现错误:

ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor

无法更改此旧应用程序的代码或更改数据库以添加服务名称。请让我知道是否有任何解决此问题的方法。

4

1 回答 1

0

您误用 sys_context 来确定 SERVICE_NAME 或 SID 的正确值。这不是 SYS_CONTEXT 报告的内容。这里的“sid”是你的 session_id,而不是数据库的系统 id。我不确定 SYS.USERS 在这种情况下到底代表什么,但它肯定不是您连接到数据库的服务名称。你应该看看 v$parameter:

 select name, value from v$parameter where name='service_names';

或者更好的是,只需查看“lsnrctl status”的输出,即可向您展示侦听器_does_知道的内容。

从未见过为 SYS$USERS 服务的侦听器。

于 2020-05-19T14:53:30.747 回答