有效,但需用SYSTEM或SYS等具ALTER PROFILE权限的用户执行,且普通用户授予权限时须带WITH ADMIN OPTION;修改DEFAULT profile不影响已绑定自定义profile的用户,仅对创建时未指定profile的新用户生效。
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED 有效吗
有效,但必须用具有 alter profile 权限的用户(通常是 system 或 sys)执行,普通用户即使被授予权限也常因缺少 admin option 而失败。
常见错误现象:ORA-01031: insufficient privileges —— 不是权限没给,而是没带 WITH ADMIN OPTION 授予;或误用 ALTER USER 想绕过 profile,实际无效。
- 执行前先确认当前 profile:
SELECT profile FROM dba_users WHERE username = 'YOUR_USER'; - 默认 profile 名是
DEFAULT,大小写敏感,不能写成default或"default" - 修改后不会立即影响已存在的会话,新密码策略只在下次改密或新建用户时生效
为什么改了 DEFAULT profile,某些用户密码还是过期
因为用户可能没用 DEFAULT 概要文件,而是绑定了自定义 profile。Oracle 优先使用用户显式指定的 profile,而非 fallback 到 DEFAULT。
使用场景:DBA 给运维账号建了 admin_profile 并设了 PASSWORD_LIFE_TIME 90,此时改 DEFAULT 完全不影响它。
- 查用户真实使用的 profile:
SELECT username, profile FROM dba_users WHERE username IN ('USER1', 'USER2'); - 若需统一控制,要么批量改用户 profile:
ALTER USER user1 PROFILE DEFAULT;,要么直接改对应 custom profile -
DEFAULTprofile 只对创建时未指定 profile 的用户生效,已有用户不会自动“继承”变更
PASSWORD_LIFE_TIME UNLIMITED 和 0 的区别
Oracle 文档说 UNLIMITED 和 0 都表示永不过期,但行为有细微差别:前者明确禁用过期检查,后者在部分旧版本(如 10g)可能被解释为“立即过期”,尤其配合 PASSWORD_GRACE_TIME 时容易触发锁定。
参数差异与兼容性影响:
- 推荐统一用
UNLIMITED,语义清晰,所有 11g+ 版本行为一致 -
0在 12c 以后基本等价,但审计或合规工具可能将其识别为异常配置 - 如果系统启用了
SEC_CASE_SENSITIVE_LOGON=TRUE(默认),密码策略仍独立生效,和大小写无关
改完 profile 后,如何验证是否生效
不能只看 dba_profiles 表里字段值,得结合用户状态和密码历史判断。最直接的方式是模拟一次密码到期流程。
实操建议:
- 查 profile 当前设置:
SELECT resource_name, limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_LIFE_TIME'; - 查目标用户账户状态:
SELECT username, account_status, expiry_date FROM dba_users WHERE username = 'TEST_USER';—— 若expiry_date是NULL或远超当前时间,说明策略已应用 - 注意:
account_status显示EXPIRED(GRACE)是 grace time 阶段,不是策略失效;真正失效是变成EXPIRED & LOCKED
复杂点在于:profile 修改不重置现有用户的密码计时器。比如某用户密码已用 89 天,你把 PASSWORD_LIFE_TIME 改成 UNLIMITED,他的 expiry_date 字段仍保持原值,只是后续不再推进——这点容易被监控脚本误报。

















