oracle要求alter user必须带identified by才能真正解锁,因为account unlock仅解除锁定状态,无法清除密码过期(expired)状态;而登录认证先检查过期再检查锁定,故需同时重置密码并解锁。

不能“无密码更改”地解锁账户——Oracle 要求对已过期或锁定用户执行 ALTER USER ... IDENTIFIED BY 才能恢复可用状态,哪怕你只想沿用旧密码,也必须显式重设一次。
为什么直接 ACCOUNT UNLOCK 不够?
Oracle 的账户状态是复合的:锁定(LOCKED)和过期(EXPIRED 或 EXPIRED(GRACE))独立存在。只执行 ALTER USER scott ACCOUNT UNLOCK 只解除了锁定,但如果该用户密码已过期(常见于 DEFAULT profile 密码有效期 180 天到期后),登录时仍会报 ORA-28001: the password has expired。
根本原因在于:Oracle 在认证阶段先检查密码是否过期,再检查账户是否锁定。过期状态不因解锁而自动清除。
ALTER USER ... ACCOUNT UNLOCK 必须搭配 IDENTIFIED BY
要真正让用户可登录,必须同时处理两个状态。即使你“不想改密码”,也得用原密码重设一遍:
-
ALTER USER scott IDENTIFIED BY tiger ACCOUNT UNLOCK;—— 正确:既重置了密码校验时间戳,又解除锁定 -
ALTER USER scott ACCOUNT UNLOCK;—— 错误:仅解锁,过期状态仍在,登录失败 -
ALTER USER scott IDENTIFIED BY tiger;—— 半正确:密码被重设(触发重置过期时间),但若账户仍为LOCKED状态,登录仍报ORA-28000
所以「安全解锁」的最小完整操作就是带 IDENTIFIED BY 的单条语句,它原子性地更新密码哈希(刷新过期计时器)并清除锁定标记。
如何避免反复手动重设?查 profile 并设 PASSWORD_LIFE_TIME UNLIMITED
频繁遇到解锁问题,说明密码策略太激进。但注意:ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED 不会 retroactively 修复当前已过期用户——它只影响未来密码的有效期。
必须分两步走:
- 先查用户实际绑定的 profile:
SELECT username, profile FROM dba_users WHERE username = 'SCOTT'; - 再修改对应 profile:
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; - 最后对每个已过期用户执行一次
ALTER USER ... IDENTIFIED BY ... ACCOUNT UNLOCK
漏掉第三步,就等于只改了“合同条款”,没给员工发新工牌——人还是进不了门。
别忽略 FAILED_LOGIN_ATTEMPTS 导致的隐性锁定
有些用户看似没被手动锁,但登录失败超限(默认 profile 是 10 次)也会自动进入 LOCKED(TIMED) 状态,15 分钟后自动解锁。这种锁定不会显示在 dba_users.account_status 里为 LOCKED,而是 OPEN,但实际无法登录。
验证方式:SELECT username, account_status, lock_date FROM dba_users WHERE username = 'SCOTT'; 若 lock_date 非空,说明是 timed lock;此时仍需 ACCOUNT UNLOCK 强制解除,不能等。
临时缓解可调高限制:ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 30;,但更推荐配合应用层登录风控,而非放宽数据库层阈值。











