SQLPLUS: как подключиться с помощью службы по умолчанию SYS$USERS
У нас есть устаревший код, который подключается к Oracle DB с помощью команды SQLPLUS:
sqlplus "$USERNAME/$PASSWORD@//$HOST:$PORT/$SERVICE_NAME"
Значения переменных USERNAME, PASSWORD, HOST, PORT и SERVICE_NAME настраиваются с помощью файла внешних свойств. Этот код работает, когда у нас есть БД с именем службы. В нашем случае DB имеет службу по умолчанию:
SYS_CONTEXT('USERENV','SERVICE_NAME')
-------------------------------------
SYS$USERS
БД имеет только SID:
SYS_CONTEXT('USERENV','SID')
----------------------------
521
Есть ли способ подключиться к Oracle DB, используя имя службы по умолчанию? например
sqlplus "$USERNAME/$PASSWORD@//$HOST:$PORT/SYS$USERS"
Ошибка:ERROR:
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
Нет возможности изменить код этого устаревшего приложения или изменить БД для добавления имен служб. Пожалуйста, дайте мне знать, если есть способ решить эту проблему.
1 ответ
Вы неправильно используете sys_context для определения правильных значений для SERVICE_NAME или SID. Это не то, о чем сообщает SYS_CONTEXT. Здесь "sid" - это ваш session_id, а не системный идентификатор базы данных. Я не совсем уверен, что SYS.USERS представляет в этом контексте, но это определенно НЕ имя службы, с помощью которой вы подключаетесь к базе данных. Вы должны посмотреть на параметр v$:
select name, value from v$parameter where name='service_names';
Или, лучше, просто посмотрите на вывод 'lsnrctl status', чтобы показать вам, что знает _дет_ слушателя.
Я никогда не видел слушателя, обслуживающего SYS$USERS.