#python #python-3.x #oracle #oracle11g #cx-oracle
#python #python-3.x #Oracle #оракул11g #cx-oracle #oracle11g
Вопрос:
У меня есть скрипт (my_script.py ), который обращается к базе данных Oracle с помощью обычного процесса входа в систему через cx_Oracle.
def make_connect(**creds):
dsn_str = cx_Oracle.makedsn(host, port, sid)
return cx_Oracle.connect(un, pw, dsn_str)
При запуске скрипта из IDE проблем с доступом к базе данных с помощью этого метода нет, но как только я упаковываю его в исполняемый файл (с помощью PyInstaller, хотя я не думаю, что это имеет значение), я получаю следующую ошибку:
ORA-20045: LOGON BLOCKED
Я полагаю, это связано с тем, что исполняемый файл, который обращается к базе данных, не python.exe это запуск кода, а скорее my_script.exe. Код работает должным образом, если я изменю my_script.exe к python.exe это означает, что я считаю python.exe база данных занесена в белый список для доступа.
Я недостаточно знаю о том, какая конкретная системная переменная или переменная среды объявляет себя базе данных Oracle для доступа, но я попытался изменить sys.executable на python.exe или sys.argv[0] для python.exe , но я думаю, что есть что-то более глубокое, что мне, возможно, потребуется изменить (если я вообще могу что-либо изменить, чтобы получить доступ).
Любые предложения были бы более чем полезны. Исполняемый файл будет находиться в системах с доменным доступом к базе данных, но поскольку это всего лишь python.exe если они занесены в белый список, их доступ будет запрещен.
Комментарии:
1. Исключения Oracle в диапазоне от ORA-20000 до ORA-21299 являются общими, определяемыми пользователем исключениями, возникающими при вызове
raise_application_error
. Возможно, у вас триггер ВХОДА в СИСТЕМУ или что-то подобное, что мешает вам подключиться. Попробуйте выполнить этот запрос, чтобы найти код, который генерирует эту ошибку:select * from all_source where text like '%-20045%'
2. Попросите администраторов баз данных изменить триггер для проверки имени драйвера, который инициировал соединение, вместо имени программы. Это будет (очень) незначительно более безопасным, но гораздо менее раздражающим для пользователей:
SELECT UNIQUE sid, client_driver FROM v$session_connect_info ORDER BY sid;
Стандартом де-факто для столбца CLIENT_DRIVER является ‘name : version’. Обратите внимание, что более старые версии базы данных будут отображать только первые 9 или около того символов, которые фактически задает драйвер, поэтому вы можете не видеть версию при использовании Oracle DB 11.3. И под «незначительно более безопасным» я подразумеваю «незначительно менее небезопасный», поскольку любой может подделать двоичное имя (как это делали вы) или имя драйвера.