宽限期(password_grace_time)绑定在profile而非用户上,需先查用户profile再查对应profile的limit值;修改default profile立即生效,多租户下须切至目标pdb操作;其仅在password_life_time到期后触发。

查清当前宽限期设置在哪
宽限期(PASSWORD_GRACE_TIME)不是用户级配置,而是绑定在 profile 上的。直接查用户看不到这个值,得先确认用户用的是哪个 profile,再查该 profile 的限制项。
常见错误是只查 dba_users 里的 expiry_date,但宽限期是否生效、多久结束,全看 profile 里 PASSWORD_GRACE_TIME 的 limit 值。
- 查用户 profile:
SELECT username, profile FROM dba_users WHERE username = 'YOUR_USER'; - 查 profile 宽限期:
SELECT resource_name, limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_GRACE_TIME'; - 若结果为
UNLIMITED,说明过期后仍可无限期登录(不推荐);若为数字(如7),单位是天;若为空行,说明该 profile 未显式设置,继承 Oracle 默认行为(通常是 7 天)
修改 DEFAULT profile 的宽限期
绝大多数业务用户没单独指定 profile,都走 DEFAULT。改它就覆盖所有未显式指定 profile 的用户。
注意:修改立即生效,无需重启数据库,也不需要重连已建立的会话——但新连接或密码过期后的首次登录会按新规则校验。
- 设为 7 天:
ALTER PROFILE DEFAULT LIMIT PASSWORD_GRACE_TIME 7; - 设为 0(过期即锁,无宽限):
ALTER PROFILE DEFAULT LIMIT PASSWORD_GRACE_TIME 0; - 设为不限:
ALTER PROFILE DEFAULT LIMIT PASSWORD_GRACE_TIME UNLIMITED;(慎用,安全审计通常不接受) - 执行后验证:
SELECT limit FROM dba_profiles WHERE profile='DEFAULT' AND resource_name='PASSWORD_GRACE_TIME';
多租户环境(PDB)下必须切容器再操作
Oracle 12c+ 多租户架构中,dba_profiles 视图默认查的是 CDB$ROOT 的 profile。如果你要改某个 PDB(比如 QMS)里用户的宽限期,不切换容器就改,等于改错地方——查不到用户、改了也不生效。
- 先确认当前容器:
SHOW CON_NAME;,如果不是目标 PDB,执行ALTER SESSION SET CONTAINER = QMS; - 再查 profile:
SELECT * FROM dba_profiles WHERE profile='DEFAULT' AND resource_name='PASSWORD_GRACE_TIME';(此时查到的是 PDB 级的) - 修改语句一样,但作用域仅限当前 PDB
- 切回 CDB$ROOT 后,该修改对其他 PDB 无影响
宽限期和密码过期时间的关系别搞混
PASSWORD_GRACE_TIME 只在 PASSWORD_LIFE_TIME 到期后才起作用。如果密码根本不会过期(PASSWORD_LIFE_TIME 是 UNLIMITED),那宽限期压根不触发。
- 典型组合:生命周期 90 天 + 宽限期 3 天 → 第 91–93 天还能登录,但每次登录会弹警告;第 94 天起报
ORA-28001 - 单独改宽限期没用:如果
PASSWORD_LIFE_TIME是 180,但宽限期设成 0,用户第 181 天直接锁,不会给任何缓冲机会 - 查用户实际状态,始终以
dba_users.account_status为准:EXPIRED(GRACE)表示已过期但在宽限期内;EXPIRED表示宽限期也结束了
宽限期本身不解决密码过期问题,只是给运维留出响应窗口。真正要避免频繁报错,得结合生命周期策略、监控告警和自动化重置流程——单靠调大宽限期,只是把问题往后推。











