ALTER USER改密失败主因是PROFILE密码策略校验,需检查当前PROFILE及验证函数;紧急时可临时设PASSWORD_VERIFY_FUNCTION为NULL,但须及时恢复;密码过期锁定需同条语句执行IDENTIFIED BY与ACCOUNT UNLOCK。
ALTER USER 修改密码时被拒绝:PROFILE 密码策略在拦路
oracle 不是改完 alter user ... identified by 就完事,背后 profile 会实时校验。如果当前用户分配的 profile(比如 default)启用了密码复杂度规则,而新密码不满足要求,命令直接报错:ora-28003: password verification failed。
常见现象:DBA 自己执行也失败;用简单密码(如 '123456' 或 'oracle')必跪;但换一个含大小写字母+数字+特殊字符的密码就通过。
- 查当前用户 PROFILE:
SELECT profile FROM dba_users WHERE username = 'YOUR_USER'; - 查该 PROFILE 的密码验证函数:
SELECT resource_name, limit FROM dba_profiles WHERE profile = 'YOUR_PROFILE' AND resource_name = 'PASSWORD_VERIFY_FUNCTION'; - 若返回值是
VERIFY_FUNCTION或ORA12C_STRONG_VERIFY_FUNCTION,说明校验已启用
绕过密码校验的临时方案:只适用于紧急维护
不是所有场景都适合关校验,但当应用连接中断、密码过期又无法立即合规时,临时停用是最快路径。注意:这不是“跳过”,而是让 Oracle 暂时不调用验证函数。
- 用
sys或system登录,执行:ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL; - 再执行改密:
ALTER USER scott IDENTIFIED BY newpass123; - 事后务必恢复:
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION ORA12C_STRONG_VERIFY_FUNCTION;
风险提示:PASSWORD_VERIFY_FUNCTION NULL 会让整个 PROFILE 下所有用户失去密码强度控制,别在线上长期开着。
自定义密码验证函数:为什么别直接抄网上的 PL/SQL 脚本
Oracle 允许用 PL/SQL 写自己的验证函数,但网上流传的示例常忽略两个关键点:函数签名必须严格匹配,且必须声明为 DETERMINISTIC,否则 CREATE PROFILE 会报 ORA-06553: PLS-306: wrong number or types of arguments。
- 函数必须接收 3 个
VARCHAR2参数:username,password,old_password - 必须返回
BOOLEAN,且函数体开头加DETERMINISTIC - 不能在函数里查表或调用
DBMS_RANDOM等非确定性函数,否则创建 PROFILE 时被拒 - 示例骨架:
CREATE OR REPLACE FUNCTION my_pwd_verify ( username VARCHAR2, password VARCHAR2, old_password VARCHAR2 ) RETURN BOOLEAN DETERMINISTIC IS BEGIN IF LENGTH(password) < 8 THEN RETURN FALSE; END IF; RETURN TRUE; END;
密码过期后用户连不上:光改密码不够,还得重置账户状态
用户状态变成 EXPIRED(GRACE) 或 EXPIRED & LOCKED 时,仅执行 ALTER USER ... IDENTIFIED BY 不会自动解锁或清除过期标记。连接仍会报:ORA-28001: the password has expired 或 ORA-28000: the account is locked。
- 先确认状态:
SELECT username, account_status FROM dba_users WHERE username = 'SCOTT'; - 正确操作是合并执行:
ALTER USER scott IDENTIFIED BY newpass123 ACCOUNT UNLOCK; - 如果 PROFILE 中设置了
PASSWORD_LIFE_TIME,改密后下次登录仍可能再次过期,需同步调整:ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 90;
最易漏的一点:ACCOUNT UNLOCK 和 IDENTIFIED BY 必须写在同一条 ALTER USER 语句里。拆成两条,第二条执行前账户仍是锁定态,改密操作会被拒绝。










