应查DBA_USERS的PASSWORD_DATE和EXPIRY_DATE字段:PASSWORD_DATE记录密码最后修改时间(对应USER$.PTIME),EXPIRY_DATE为推算出的过期时间点,二者需结合DBA_PROFILES中PASSWORD_LIFE_TIME策略解读,且EXPIRY_DATE为NULL通常表示永不过期或策略未生效。
查 DBA_USERS 的 PTIME 和 EXPIRY_DATE 字段最直接
oracle 不在 dba_users 中直接暴露“最后修改时间”字段,真正记录密码修改时间的是底层表 user$ 中的 ptime,但该表不推荐直接查;而 dba_users 提供了两个关键字段:password_date(11g+)和 expiry_date。前者是密码上次修改时间(对应 ptime),后者是计算出的过期时间点。
执行以下语句即可一次性看到这两个时间:
SELECT username, account_status, password_date, expiry_date, profile FROM dba_users WHERE username = 'SCOTT';
-
PASSWORD_DATE为空?说明该用户从未改过密,或使用的是外部认证(如 OS auth)、或 Oracle 版本低于 11g(此时需查USER$.PTIME) -
EXPIRY_DATE为NULL?通常表示该用户所属 profile 的PASSWORD_LIFE_TIME是UNLIMITED,或该用户被显式设为永不过期 -
EXPIRY_DATE显示过去时间,但ACCOUNT_STATUS仍是OPEN?可能是处于 grace period(宽限期),还没到锁定阶段
DBA_PROFILES 决定 EXPIRY_DATE 怎么算
EXPIRY_DATE 不是固定值,而是由 PASSWORD_DATE + DBA_PROFILES 中该用户 profile 的 PASSWORD_LIFE_TIME 推导出来的。所以只看 DBA_USERS 不够,必须关联 profile 查策略来源。
例如,查用户 SCOTT 所属 profile 的密码有效期设置:
SELECT dp.resource_name, dp.limit FROM dba_profiles dp JOIN dba_users du ON du.profile = dp.profile WHERE du.username = 'SCOTT' AND dp.resource_name = 'PASSWORD_LIFE_TIME';
- 如果
limit是数字(如180),EXPIRY_DATE = PASSWORD_DATE + 180 - 如果
limit是UNLIMITED,Oracle 就不会写EXPIRY_DATE,字段值为NULL - 注意:即使你把 profile 改成
UNLIMITED,已过期用户的EXPIRY_DATE不会自动清空,ACCOUNT_STATUS也不会变回OPEN
为什么 PASSWORD_DATE 和 PTIME 有时对不上
PASSWORD_DATE 是 DBA_USERS 视图从 USER$.PTIME 抽取的,但不是简单映射——它受密码策略开关影响。比如当 profile 中 PASSWORD_REUSE_MAX 或 PASSWORD_REUSE_TIME 生效时,Oracle 可能延迟更新 PASSWORD_DATE,或在重用旧密码时不刷新该字段。
- 直接查
USER$.PTIME更原始,但需要SELECT ANY TABLE权限,且结果依赖NLS_DATE_FORMAT设置 - 常见坑:执行
ALTER USER ... IDENTIFIED BY VALUES(用 hash 值改密)不会触发PASSWORD_DATE更新,PTIME也不变 - 用
ALTER USER ... IDENTIFIED BY显式改密,才会同时更新PASSWORD_DATE和PTIME
查不到 PASSWORD_DATE?确认 Oracle 版本和权限
PASSWORD_DATE 字段从 Oracle 11gR2 开始引入。如果你用的是 10g 或更早版本,DBA_USERS 里根本没有这个字段,只能查 USER$.PTIME。
- 没权限查
DBA_USERS?普通用户只能看自己的状态:SELECT username, account_status, expiry_date FROM user_users;,但user_users没有PASSWORD_DATE - 连
USER$都查不了?说明当前用户没被授予SELECT_CATALOG_ROLE或更高权限,这时只能让 DBA 帮忙查 - 某些云平台(如 Oracle Cloud ATP)屏蔽了
USER$访问,PASSWORD_DATE是唯一可用的时间线索
真正容易被忽略的不是怎么查,而是查完后误以为 EXPIRY_DATE 是绝对截止点——它只是策略推算值,实际是否锁账户还取决于 ACCOUNT_STATUS 和数据库是否启用 SEC_MAX_FAILED_LOGIN_ATTEMPTS 等联动机制。


















