我正在尝试编写一个简单的python脚本,它将以外部标识的用户身份连接到我的oracle数据库,然后执行一些操作。但是我无法通过连接。
如果我在连接字符串中对用户/密码进行了硬编码,则它可以正常连接并按预期打印出数据库版本,因此连接字符串的格式必须有效
catch(\Kreait\Firebase\Exception\Messaging\NotFound $e)
现在可以从外部识别os用户,如下所示:
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()
有人可以在这里帮我吗,感觉应该很简单!
谢谢
答案 0 :(得分:1)
您正在尝试的方法对我有用:
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环境变量设置为该目录。
答案 1 :(得分:1)
解决了! 感谢Bobby向我指出了正确的方向,问题是通过在连接字符串中指定DB,它被解释为远程连接,因此由于禁用了远程身份验证而被禁止。
诀窍是根本不设置连接字符串中的数据库,如下图所示,然后就像连接到本地数据库的超级按钮一样工作
con = cx_Oracle.Connection('/')
答案 2 :(得分:0)
我认为相当于sqlplus /的cx_oracle是这样的:
con = cx_Oracle.connect('/')
如果要通过ORCL这样的tnsname连接,则需要设置以下参数:
alter system set remote_os_authent=TRUE scope=spfile;
然后您的连接字符串将起作用。对我来说是
con = cx_Oracle.connect('','','ORCL')
在sqlplus中,等效项是
sqlplus /@ORCL
如果未设置remote_os_authent = TRUE,则无法通过网络进行OS身份验证。如果仅使用/,则不会通过网络。更改参数后,必须重新启动数据库。
鲍比