【问题标题】:Application unable to access table created in oracle database应用程序无法访问在 oracle 数据库中创建的表
【发布时间】:2020-10-15 20:54:25
【问题描述】:

通过 python 应用程序从表中获取数据会引发以下错误: cx_Oracle.DatabaseError: ORA-00942: 表或视图不存在。我已经验证了架构和表名。

cur = cursor.execute('SELECT * FROM SYS.STUDENT_RECORDS')

但是,应用程序从系统表中获取数据。

cur = cursor.execute("SELECT * FROM TAB_STATS$ WHERE ROWNUM <= 10")

这是连接字符串:

dsn_tns = cx_Oracle.makedsn(ip, port, SID)                                                                     
connection = cx_Oracle.connect(user='username', password='****',dsn=dsn_tns)

我假设它必须在用户许可的情况下做某事,但并不完全正确。我对 Oracle DB 没有太多经验。任何帮助将不胜感激。

【问题讨论】:

  • 首先,为什么在 sys 模式中会有像 student_records 这样的用户表?要回答您的问题,如果您有 DBA 权限,您可以给予资助。最好让您的 DBA 为您的 python 脚本登录到数据库的模式用户授予对数据字典的访问权限。
  • FROM SYS.STUDENT 永远不要在SYSSYSTEM 架构/用户下创建表,除非您要销毁数据库。创建一个新的普通用户(模式),然后将所有表放入此模式中。
  • 我按照上述说明测试了与 SQL 开发人员的这个新用户的连接...但是从 python 脚本,我无法登录:cx_Oracle.DatabaseError: ORA-01017: invalid username /密码;登录被拒绝

标签: oracle cx-oracle


【解决方案1】:

@kaushik @krokodilko,您的指导帮助我找到了以下解决方案:

  1. 已创建新用户并授予权限。
  2. 将连接字符串更改为使用服务名称而不是 SID。(不知道为什么 SID 不起作用)

    dsn_tns = cx_Oracle.makedsn(ip, port, service_name=service_name)
    
  3. cur = cursor.execute("SELECT * FROM user1.STUDENT_PROFILES WHERE ROWNUM <= 10")
    

【讨论】:

  • 关于服务与 SID - 侦听器可能不知道您的 SID - 特别是如果数据库是多租户架构中的 12c 数据库。可插拔数据库只能通过其服务名称寻址
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
相关资源
最近更新 更多