我正在运行 Oracle 19c,在我的应用程序服务器代码中,我从用户接收旧/新密码,并构建更改用户查询(包括 REPLACE 子句)并执行它。即使旧密码不正确,似乎总是让他们更改密码。
当我从 TOAD 手动执行查询时也是如此。换句话说,下面将把他们的密码更改为“bar”。我原以为第二条语句会失败,因为他们的密码是“food”,而不是“bad_password”
ALTER USER myuser IDENTIFIED BY "foo";
ALTER USER myuser IDENTIFIED BY "bar" REPLACE "bad_password";
我尝试过搜索,但我发现很难以一种能得到有用结果的方式表达问题。
我错过了什么完全明显的事情?
来自文档:
如果您要设置自己的密码或者您具有 ALTER USER 系统权限并且要更改其他用户的密码,则可以省略 REPLACE 子句。但是,除非您具有 ALTER USER 系统权限,否则如果已启用密码复杂性验证功能,则必须始终指定 REPLACE 子句,方法是运行 UTLPWDMG.SQL 脚本或在配置文件的 PASSWORD_VERIFY_FUNCTION 参数中指定此类函数:已分配给用户。
更符合您的情况:
Oracle 数据库不会检查旧密码,即使您在 REPLACE 子句中提供旧密码,除非您要更改自己的现有密码。
由于您的应用程序(可能还包括 Toad)以不同用户身份连接,因此
myuser
不会更改自己的密码,因此 REPLACE
会被忽略。