【问题标题】:Connecting to Oracle via ODBC when password expired密码过期时通过 ODBC 连接到 Oracle
【发布时间】:2018-05-04 16:08:45
【问题描述】:

我们公司有一个 C++ 库,它在内部使用 ODBC API,特别是 SQLConnect 函数来连接到我们的 Oracle 数据库。

但是,假设我将用户密码(使用外部工具,例如 PL/SQL Developer)设置为过期。突然之间,下面的调用失败了……

SQLConnect("<My DSN>", "The user whose password has expired", "The expired password");

...返回码为 -1(理所当然)。

我的问题是:是否可以允许同一个用户通过 SQLConnect(或其他一些 ODBC 函数)临时连接到我们的 Oracle 数据库,其唯一目的是更改他们的密码?也就是说,无需以 SYSDBA 或类似方式连接...

【问题讨论】:

  • 不,这是不可能的——这会破坏拥有密码的意义。
  • 我不会这么说的。我的意思是,我知道您来自哪里,但我正在寻找一些临时会话模式,用户唯一可以做的就是更改自己的密码。 SQLPlus 允许您登录,如果它检测到您的密码已过期,则会提示您输入一个新密码。但从您的回答来看,这不可能通过 ODBC 进行复制。
  • 当然没有 ODBC 函数允许您这样做 - 但您始终可以编写自己的程序来执行此操作,使用 ODBC 查询和更新 Oracle 元数据,但它必须具有特权.

标签: c++ oracle oracle11g odbc


【解决方案1】:

我们得出的结论是,不存在 ODBC 函数可以在用户被标记为过期时更改用户的密码; ODBC API 本身虽然功能强大,但不足以实现此目的。

因此,我们采取了不同的方法:由于我们使用的是 Oracle 11g,并且我们的机器安装了 Oracle Instant Client,因此我们使用了 OCI(Oracle 调用接口),尤其是其 OCIPasswordChange 函数。

sword password_change_status = OCIPasswordChange(svchp, errhp, (CONST text *)sUser, strlen(sUser), (CONST text *)sOldPassword, strlen(sOldPassword), (CONST text *)sNewPassword, strlen(sNewPassword), OCI_AUTH);

当然,可能还有一些其他选择,例如创建一个功能数据库用户并使用该用户更改另一个用户的密码,但这种方法效果很好。

【讨论】:

    【解决方案2】:

    要重置密码一旦过期并抛出错误ORA-28001: the password has expired 我在 SQL*Plus 中更改它

    从命令行启动 Sql Plus:

    sqlplus username/password@host:port/service
    

    然后系统会提示您设置新密码。
    更新您的 DSN,一切就绪。

    【讨论】:

      猜你喜欢
      • 2019-08-23
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      相关资源
      最近更新 更多