查用户密码过期状态应直接查询DBA_USERS视图,重点看account_status和expiry_date字段,并关联DBA_PROFILES确认profile中的PASSWORD_LIFE_TIME设置。
查用户密码过期状态用什么SQL
直接查 dba_users 视图最准,别依赖登录报错再反应——等报错时已经锁了。expiry_date 是核心字段,但要注意它可能为 null(说明没设过期策略),也可能显示过去时间(已过期),还可能显示未来时间(但用户仍能登录,因为还有 grace period)。
实操建议:
- 运行
SELECT username, account_status, expiry_date, profile FROM DBA_USERS WHERE username = 'YOUR_USER'; - 重点看
account_status:如果显示EXPIRED(GRACE),说明已过期但还能登一次改密;EXPIRED & LOCKED就真登不进去了 - 别只查
expiry_date,还要连带查该用户所属的profile,因为策略实际在 profile 里
改 PASSWORD_LIFE_TIME 要动哪个 profile
不是改用户,是改 profile。Oracle 密码策略绑定在 profile 上,用户只是“引用”它。默认 profile 叫 DEFAULT,很多环境没新建 profile,所以一调就影响全库用户。
实操建议:
- 先查用户当前 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_LIFE_TIME'; - 修改前务必确认影响范围——改
DEFAULTprofile 就等于改所有没显式指定 profile 的用户 - 如只想调单个用户,应新建 profile 再
ALTER USER ... PROFILE new_profile;
把 PASSWORD_LIFE_TIME 设成 UNLIMITED 安不安全
技术上完全可行,ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; 就生效。但它绕过了 Oracle 默认的安全基线,不是“不安全”,而是把责任转嫁给了外部流程(比如你自己的密码轮换制度或 IAM 系统)。
实操建议:
-
UNLIMITED后,EXPIRY_DATE字段会变为空,但account_status不会自动变回OPEN——已过期的用户仍需ALTER USER ... IDENTIFIED BY ...;手动重置 - 某些审计合规要求(如等保、PCI DSS)明确要求定期改密,设成
UNLIMITED可能通不过检查 - 真正要的是可控,不是无限——比如设成
180天比UNLIMITED更易落地和追踪
改完 profile 为什么用户还是提示密码过期
Profile 修改是即时生效的,但不会“倒推”已过期的状态。也就是说:策略放宽了,但历史过期事实不会被撤销。
常见错误现象:
- 用户仍卡在
ORA-28001: the password has expired,即使 profile 已调成UNLIMITED - 登录后强制跳转改密页,输新密码又报
ORA-28007: the password cannot be reused
实操建议:
- 对已过期用户,必须显式重置密码:
ALTER USER your_user IDENTIFIED BY new_password; - 如果启用了密码历史(
PASSWORD_REUSE_TIME或PASSWORD_REUSE_MAX),新密码不能和近期用过的重复——临时可先设PASSWORD_REUSE_MAX UNLIMITED配合重置 - 确认没被
FAILED_LOGIN_ATTEMPTS锁住账户,有时会和过期状态叠加出现
最常被忽略的一点:改 profile 后不查具体用户的 account_status 和 expiry_date,只看命令执行成功就以为搞定了。其实过期状态是独立存储的,得亲手清掉。

















