首页 > 解决方案 > 密码过期时通过 ODBC 连接到 Oracle

问题描述

我们公司有一个 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 或类似方式连接...

标签: c++oracleoracle11godbc

解决方案


我们得出的结论是,不存在 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);

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


推荐阅读