DBA_USERS的EXPIRY_DATE是依据PASSWORD_DATE与DBA_PROFILES中PASSWORD_LIFE_TIME推算出的快照值,并非实时更新;其为空表示策略为UNLIMITED或未触发计算,需结合ACCOUNT_STATUS和profile策略综合判断过期状态。

查 DBA_USERS 的 EXPIRY_DATE 字段最直接
密码过期时间不是“存在哪”,而是由策略推算出来的快照值,DBA_USERS.EXPIRY_DATE 就是这个结果。它不实时刷新,但当前登录、改密或数据库触发重算时会更新。
-
EXPIRY_DATE是 未来时间:说明按当前策略,密码将在那天过期(哪怕状态还是OPEN) -
EXPIRY_DATE < SYSDATE:已过期,但ACCOUNT_STATUS可能仍是OPEN(宽限期未结束)或已变成EXPIRED(GRACE)/EXPIRED & LOCKED -
EXPIRY_DATE IS NULL:不等于“永不过期”,只表示该用户没被赋予明确的到期日——可能因为 profile 是UNLIMITED,也可能刚创建还没触发计算逻辑
必须关联 DBA_PROFILES 看 PASSWORD_LIFE_TIME
EXPIRY_DATE 是怎么算出来的?靠 PASSWORD_DATE + DBA_PROFILES 里该用户 profile 的 PASSWORD_LIFE_TIME。只看 DBA_USERS 会误判。
- 执行:
SELECT resource_name, limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_LIFE_TIME'; - 如果
limit是数字(如180),那EXPIRY_DATE = PASSWORD_DATE + 180 - 如果
limit是UNLIMITED,Oracle 不写EXPIRY_DATE,字段值为NULL;但已有用户的EXPIRY_DATE不会自动清空——哪怕你刚把 profile 改成UNLIMITED
PASSWORD_DATE 为空或不准怎么办
PASSWORD_DATE 是密码上次修改时间,但它受策略开关影响,不是每次改密都更新。
-
PASSWORD_DATE IS NULL:常见于用户从未改过密、用外部认证(如 OS auth)、或 Oracle 版本低于 11g(此时需查底层USER$.PTIME) - 即使你重设了密码,
PASSWORD_DATE也可能没变——比如启用了PASSWORD_REUSE_MAX或PASSWORD_REUSE_TIME,Oracle 会延迟刷新该字段 - 真要查原始时间,可查
USER$.PTIME,但需要SELECT ANY TABLE权限,且结果依赖NLS_DATE_FORMAT设置,不推荐日常使用
宽限期和锁定状态比 EXPIRY_DATE 更关键
用户能不能连,不取决于 EXPIRY_DATE 是不是过了,而取决于 ACCOUNT_STATUS 和当前是否在 grace period 内。
-
ACCOUNT_STATUS = 'EXPIRED(GRACE)':还能登录一次,但必须改密(报ORA-28002) -
ACCOUNT_STATUS = 'EXPIRED & LOCKED':彻底锁死,连ALTER USER都得用SYS登录操作 -
EXPIRY_DATE显示过去时间,但状态仍是OPEN?大概率是 profile 刚改成UNLIMITED,但用户没重置过密码,EXPIRY_DATE没被清空
EXPIRY_DATE 看半天,却漏掉 ACCOUNT_STATUS 和 profile 实际 limit 值,结果判断全错。


















