【问题标题】:Using sqlplus to programmatically check connection使用 sqlplus 以编程方式检查连接
【发布时间】:2017-06-06 15:22:22
【问题描述】:

是否可以使用 sqlplus 以编程方式检查数据库连接(特别是 SYS 帐户)?

我在想一些事情

  1. 使用一些参数运行 sql plus(使用 Process.Start),提供 sys 用户名和密码
  2. 检查退出代码(甚至是标准输出),是否成功。到目前为止,我能想到的最好方法是检查标准输出字符串是否存在子字符串“ERROR”,但我认为这不是很干净

这可能吗?你建议我使用什么参数? 我之所以要这样做是因为 System.Data.OracleClient doesn't support connection as SYSDBA

【问题讨论】:

    标签: .net oracle process sqlplus


    【解决方案1】:

    这可能有效

    whenever sqlerror exit failure
    whenever oserror exit failure
    conn user/pwd@db-name
    select 'success' from dual;
    exit
    

    上述脚本将具有以下行为:

    • 如果出现错误,sqlplus 进程将返回非零代码
    • 否则 sqlplus 将返回零

    请注意,我没有测试上述内容。

    修正

    脚本应该在 unix 上运行如下:

    sqlplus -nolog @script-file.sql
    

    在windows上如下:

    sqlplus /nolog @script-file.sql
    

    【讨论】:

    • 这不会在失败时退出.. 也许错误没有归类为 sqlerror 或 oserrror?
    • @Louis 你是如何运行上面的脚本的?请参阅帖子的修改部分。
    • 仅供参考,对于“SQL*Plus:版本 11.2.0.3.0 生产”(Win32),我必须使用“/nolog”而不是“-nolog”。例如sqlplus /NOLOG @test.sql
    【解决方案2】:

    您无需获取会话即可检查连接是否正在运行。

    如果您尝试使用无效凭据访问数据库,您将收到 ORA-01017 错误。如果连接不可用或侦听器正在运行但未安装数据库(即即使可以连接也无法检查凭据),您将收到不同的错误代码。

    有关示例,另请参阅 Nagios check_oracle_v2 脚本。

    【讨论】:

      【解决方案3】:

      我有similar question。我发现我们可以根据情况指定可以发送哪些失败代码:

      sqlplus /nolog << EOF
       WHENEVER SQLERROR EXIT 50
       WHENEVER OSERROR EXIT 66
       connect /@${MISTERY_DB}
       exit;
      EOF
      

      然后查看返回码:

      RET_CODE=$?
      if [ ${RET_CODE} -eq 50 ] ; then
        echo "it was an SQLERROR"
      fi
      

      【讨论】:

        猜你喜欢
        • 2012-06-14
        • 1970-01-01
        • 1970-01-01
        • 2010-11-07
        • 2010-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-21
        相关资源
        最近更新 更多