Oracle中将PASSWORD_VERIFY_FUNCTION设为NULL无效,必须设为NONE才能禁用密码复杂度校验;UNLIMITED仅解除时效限制,不关闭复杂度验证;修改DEFAULT profile不影响已有用户,需手动执行ALTER USER ... PROFILE DEFAULT同步。
Oracle 中 ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION 设为 NULL 无效?
直接设 password_verify_function 为 null 不会取消校验,oracle 会忽略该值,继续使用内置或已启用的验证函数。真正生效的方式是显式禁用——把值设成 none(注意是字符串 'none',不是 null 或数字 0)。
常见错误现象:ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL; 执行成功但改密码时仍报 ORA-28003: password verification failed。
- 必须写成
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NONE;(不加引号,Oracle 会识别为关键字) - 如果当前 profile 绑定了自定义函数(比如
ora12c_strong_verify_function),要先查清:SELECT resource_name, limit FROM dba_profiles WHERE profile='DEFAULT' AND resource_name='PASSWORD_VERIFY_FUNCTION'; - 修改后需重新连接或切换用户才能触发新规则(已有 session 不受影响)
把 PASSWORD_LIFE_TIME、PASSWORD_REUSE_TIME 等全设成 UNLIMITED 就够了吗?
不够。仅设 UNLIMITED 只解决过期和重用限制,不影响密码复杂度本身。复杂度由 PASSWORD_VERIFY_FUNCTION 控制,它独立于其他密码参数。
典型误操作:执行了一堆 ALTER PROFILE ... LIMIT ... UNLIMITED,但忘记关验证函数,结果还是无法设简单密码。
-
PASSWORD_LIFE_TIME UNLIMITED→ 密码永不过期 -
PASSWORD_REUSE_TIME UNLIMITED→ 允许立即重用旧密码 -
FAILED_LOGIN_ATTEMPTS UNLIMITED→ 关闭登录失败锁定(可选,但常一起调) - 以上都不动
PASSWORD_VERIFY_FUNCTION,复杂度校验照常运行
为什么 ALTER PROFILE DEFAULT 不影响已有用户?
因为用户创建时已继承 profile 的快照,后续 profile 修改只对新创建用户生效,或需手动重新赋值。这是最容易被忽略的点。
比如你改了 DEFAULT profile,但 SCOTT 用户仍受旧规则约束,改密码时照样报错。
- 查用户实际用的 profile:
SELECT username, profile FROM dba_users WHERE username = 'SCOTT'; - 强制刷新单个用户:
ALTER USER SCOTT PROFILE DEFAULT; - 批量刷新(慎用):
ALTER USER ... PROFILE DEFAULT需逐个执行,没有全局“刷新所有用户”命令 - 新建用户默认用
DEFAULTprofile,所以新用户没问题;老用户得手动同步
生产环境禁用密码验证前必须确认的三件事
这不是一个“执行完就完事”的操作,Oracle 的密码策略是叠加生效的,尤其当数据库启用了 Unified Audit 或配置了 SEC_CASE_SENSITIVE_LOGON=FALSE 时,行为可能反直觉。
- 确认没启用外部密码文件(
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE)——此时部分验证逻辑绕过 profile - 检查是否开启 Oracle Wallet 或 Kerberos 认证,这些路径下 profile 限制可能不触发
- 测试账户必须用 SQL*Plus 或 SQLcl 连接验证,某些 JDBC 驱动(如 ojdbc8)在连接池中缓存认证状态,导致“看起来生效了”实则没真测到
最常漏掉的是:改完 profile 后没重连用户,也没查 dba_users 确认 profile 是否真正绑定成功。










