ORA-28003报错主因是PASSWORD_VERIFY_FUNCTION启用且新密码不合规,需查profile绑定的验证函数;其仅返回TRUE/FALSE,不提示具体规则失败;临时设为NULL可快速验证,但须及时恢复;函数需DETERMINISTIC、三VARCHAR2参数、SYS下创建或授权执行;PASSWORD_LIFE_TIME与验证函数机制独立。
ALTER USER IDENTIFIED BY 被拒绝,先查 PASSWORD_VERIFY_FUNCTION 是否启用
用户执行 alter user username identified by newpass 报 ora-28003: password verification for the specified password failed,根本原因不是权限不足,而是当前 profile 绑定的密码验证函数拦住了——它不关心你有没有 alter user 权限,只校验新密码是否合规。
常见误判是以为“DBA 都改不了,肯定是权限问题”,其实 DBA 也得过这一关。关键检查步骤如下:
- 查用户用的是哪个 profile:
SELECT profile FROM dba_users WHERE username = 'YOUR_USER'; - 查该 profile 的验证函数:
SELECT limit FROM dba_profiles WHERE profile = 'YOUR_PROFILE' AND resource_name = 'PASSWORD_VERIFY_FUNCTION'; - 若返回值是
VERIFY_FUNCTION、VERIFY_FUNCTION_11G或自定义函数名(如my_pwd_verify),说明校验已启用;若为NULL或空,则跳过此环节
密码验证函数报错但不提示具体哪条规则失败
Oracle 的密码验证函数只返回 TRUE 或 FALSE,不会告诉你“长度不够”还是“缺数字”。用户反复试错、DBA 翻源码调试,效率极低。
解决办法是临时绕过校验,快速定位是否真是策略问题:
- 用
SYS或SYSTEM登录,执行:ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL; - 再试一次改密:
ALTER USER scott IDENTIFIED BY abc123!;—— 如果这次成功,基本可断定是验证函数逻辑卡住了 - 事后必须恢复:
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION VERIFY_FUNCTION_11G;(或你实际用的函数名)
注意:PASSWORD_VERIFY_FUNCTION NULL 是全局停用,别在生产环境留超过 10 分钟。
自定义 verify_function 函数签名或权限不对,导致静默失效
函数创建成功、profile 也绑定了,但改密时仍无校验效果,甚至直接忽略规则——大概率是函数没被真正调用。两个高频坑:
- 函数未声明
DETERMINISTIC,或参数不是严格三个VARCHAR2(username、password、old_password),Oracle 会跳过执行,不报错也不校验 - 函数在非
SYS用户下创建,但没显式授权:GRANT EXECUTE ON my_pwd_verify TO PUBLIC;或至少授给目标用户所属 profile 对应的角色 - 函数体里用了
DBMS_OUTPUT.PUT_LINE或查询表(如SELECT COUNT(*) FROM ...),违反确定性要求,创建 profile 时可能不报错,但运行时被静默跳过
PROFILE 中 PASSWORD_LIFE_TIME 和 PASSWORD_VERIFY_FUNCTION 是两套独立机制
用户密码过期(EXPIRY_DATE 到期)+ 锁定(ACCOUNT_STATUS = EXPIRED(GRACE) 或 LOCKED),和密码强度校验完全无关。但实操中常被混为一谈。
典型场景:用户密码已过期,想用 ALTER USER ... IDENTIFIED BY 重置,结果被 ORA-28003 拦住。此时必须一条语句同时处理两项:
-
ALTER USER hfxf IDENTIFIED BY newpass123 ACCOUNT UNLOCK;——ACCOUNT UNLOCK解锁,IDENTIFIED BY重置密码,且新密码仍要过PASSWORD_VERIFY_FUNCTION校验 - 如果只想让密码永不过期,改的是
PASSWORD_LIFE_TIME:ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;,和验证函数无关 -
PASSWORD_VERIFY_FUNCTION不控制“能不能改”,只控制“改成什么样才被接受”;真要禁止改密,得回收ALTER USER权限
最易被忽略的是:哪怕你把 PASSWORD_VERIFY_FUNCTION 设为 NULL,只要 PASSWORD_LIFE_TIME 是 180 天,用户到期后仍无法登录,必须由 DBA 手动解锁或重置——验证函数管不着这事。











