Невозможно подключиться как внешне идентифицированный пользователь, используя python3 и cx_Oracle в Linux - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь написать простой скрипт на python, который подключится к моей базе данных oracle как внешне идентифицированный пользователь, а затем выполнит некоторые вещи.Я не могу установить соединение, хотя.

Если я жестко закодирую имя пользователя / пароль в строке подключения, то он подключается нормально и печатает версию БД, как и ожидалось, поэтому формат строки подключениядолжен быть действительным

import cx_Oracle
con = cx_Oracle.connect('<user>','<password>','<service name>')
print (con.version)
con.close()

Теперь пользователь ОС идентифицируется извне, как показано здесь:

sqlplus /

SQL*Plus: Release 11.2.0.4.0 Production on Mon Sep 24 14:28:01 2018

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage 
Management, OLAP,
Data Mining and Real Application Testing options

SQL>

Итак, из того, что я увидел при поиске, я смогу запустить этот коддля подключения:

import cx_Oracle
con = cx_Oracle.connect('','','<service name>')
print (con.version)
con.close()

Но это дает мне ошибку:

Traceback (most recent call last):
  File "test.py", line 5, in <module>
    con = cx_Oracle.connect('','','<service name>')
cx_Oracle.DatabaseError: ORA-01017: invalid username/password; logon denied

Может кто-нибудь помочь мне здесь, такое чувство, что это должно быть просто!

Спасибо

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Я думаю, что cx_oracle, эквивалентный sqlplus /, будет следующим:

con = cx_Oracle.connect('/')

Если вы хотите подключиться через tnsname, например ORCL, вам нужно установить этот параметр:

 alter system set remote_os_authent=TRUE scope=spfile;

Тогда ваша строка подключения будет работать.Для меня это было:

con = cx_Oracle.connect('','','ORCL')

В sqlplus эквивалент равен

sqlplus /@ORCL

Вы не можете выполнить аутентификацию ОС по сети, если не установите remote_os_authent = TRUE.Если вы просто используете / вы не собираетесь по сети.Вы должны сбросить базу данных после изменения параметра.

Bobby

0 голосов
/ 27 сентября 2018

Решено!Спасибо Бобби за то, что он указал мне правильное направление, проблема заключалась в том, что при указании базы данных в строке подключения она интерпретировалась как удаленное подключение, поэтому не была разрешена из-за отключенной удаленной аутентификации.

Хитрость заключалась в том, чтобы вообще не устанавливать БД в строке подключения, как показано ниже, тогда она работала как брелок, подключающийся к локальной БД

con = cx_Oracle.Connection('/')
0 голосов
/ 25 сентября 2018

То, что вы пытаетесь, работает для меня:

import cx_Oracle

connection = cx_Oracle.Connection('', '', 'my183')
cur = connection.cursor()

sql = "select user from dual"
for i in cur.execute(sql):
    print(i)

Производит:

$ python t.py
('CJ',)

В этом случае у меня есть sqlnet.ora со следующим (вы захотите просмотретьнастройки и используйте соответствующие для вашей версии и среды):

WALLET_LOCATION =
   (SOURCE =
     (METHOD = FILE)
     (METHOD_DATA =
       (DIRECTORY = /Users/cjones/test)
     )
   )

SQLNET.WALLET_OVERRIDE = TRUE

и tnsnames.ora с:

my183 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orclpdb)
    )
  )

И мой cwallet.sso был создан для 'my183' (дляпользователь CJ) и находится в том же каталоге, что и tnsnames.ora & sqlnet.ora.Моя переменная среды TNS_ADMIN установлена ​​в этот каталог.

...