【问题标题】:python cx_oracle and server informationpython cx_oracle 和服务器信息
【发布时间】:2012-03-12 11:04:11
【问题描述】:

为了演示 Oracle 的安全功能,必须在用户会话尚未建立时调用 OCIServerVersion()OCIServerRelease()

虽然有数据库参数sec_return_server_release_banner = false。 我为此使用 Python cx_Oracle 模块,但我不确定如何在建立连接之前获取服务器版本。有什么想法吗?

【问题讨论】:

  • cxOracle 不使用 OCI 函数来获取版本,而是在连接后调用 dbms_utility.db_version 所以我认为你不能没有对 dbms_utility.db_version 过程具有执行权限的用户,你可以尝试绕过 cxoracle使用 ctypes 直接玩 OCI 客户端(pypy 上的 cxoracle 使用 ctypes)
  • 连接函数是 Connection.c 中的 Connection_Connect 它调用 OCIServerAttach() 但在 auth 之前无法调用其他东西
  • bitbucket.org/pypy/pypy/src/default/pypy/module/oracle/… 是 rpython 你应该在 serverattach 之后调用 OCIServerVersion(),但是我不知道移植到 cpython+ctypes 有多么容易
  • 不确定您的用例,但您是否尝试过使用 zxJDBC? from com.ziclix.python.sql import zxJDBC'
  • @jhon.smith:你还在寻找这个答案吗?如果上面的其他建议没有帮助,那么将此功能添加到 cx_Oracle 不会很困难。如果您仍然需要此功能,我相信我们可以帮助您添加此功能。

标签: python cx-oracle


【解决方案1】:

取决于您的软件架构和您准备跨平台的意图。

cx_Oracle 依赖于 Oracle 客户端。因此,您确定已知路径上有 Oracle 客户端。即使您不想在常规会话中使用 Oracle 客户端,您也可以将其用于服务器的初步检查。

在 linux/unix 上,您可以在子进程中运行以下代码:

sqlplus user/pasword@INSTANCE <<< "quit"| grep "Oracle Database"| head -n 1 

Grep 和其他处理可以在您的代码中完成,在 Windows 中这是必要的。通过代码你会得到Oracle的版本,你会知道连接信息是否正确。

【讨论】:

  • 这假设安装了 sqlplus。 Oracle Instantclient(它只提供 OCI,因此对于 cxOracle 本身就足够了)默认情况下不附带 sqlplus。
【解决方案2】:

无需建立连接,。不,你永远不能问任何事情。这就像访问 Google Page。(互联网架构 - 无论您称其为无会话还是基于会话)

对于 Authentical,如果未设置权限 - Oracle 使用用户名“nobody”作为用户,因此为每个用户提供会话。

我是 Oracle APEX 的用户,我经常使用 Python、PLSQL。

这是一个很好的问题。谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 2011-03-10
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2013-02-14
    相关资源
    最近更新 更多