c++ - 密码过期时通过 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 或类似方式连接...
解决方案
我们得出的结论是,不存在 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);
当然,可能还有其他一些替代方案,例如创建一个功能数据库用户并使用该用户更改另一个用户的密码,但这种方法效果很好。
推荐阅读
- spring-boot - 如何在jenkins插件的maven项目中包含一个使用spring和bean作为依赖项的独立jar?
- javascript - 在“animationend”上循环点击事件函数
- css - 使用 CSS 为框设置动画以填满整个屏幕而不会突然跳跃
- pandas - pandas groupby,计算每个值的出现次数
- javascript - 无法将 momentjs 中的日期与 isSame() 进行比较
- qt - 将当前时间和日期连接到 qt 中的 timeEdit 和 dateEdit
- c - 为什么堆栈中定义的这个C函数指针在传递时无效?
- python - UnboundLocalError at /index/register/ .local 变量 'context' 在分配之前引用
- python - 如果我想在电报 python bot 中标记一个组的所有成员,我该怎么办?
- java - Java:更改scanner.nextDouble接受点作为十进制分隔符或在文件中用逗号写入双精度