必须用select username, profile from dba_users where username = 'your_user';查用户实际绑定的profile,不可默认default;因生产环境常显式指定自定义profile,跳过此步易导致策略修改无效。

怎么查用户实际绑定的 PROFILE 而不是瞎猜
Oracle 不是在用户身上直接设密码有效期,而是在 PROFILE 上定义 PASSWORD_LIFE_TIME,再把 PROFILE 绑给用户。所以第一步必须确认目标用户用的是哪个 PROFILE,不能默认是 DEFAULT——很多生产库会显式指定自定义 PROFILE。
执行这条语句查实:
SELECT username, profile FROM dba_users WHERE username = 'YOUR_USER';
如果返回空行,说明要么用户不存在,要么你没 DBA 权限;得换有权限账号操作。别跳过这步,否则后面改错地方,白忙活。
ALTER PROFILE 修改 PASSWORD_LIFE_TIME 的写法和常见报错
PASSWORD_LIFE_TIME 是大小写敏感的参数名,漏写 LIMIT、拼错参数、或用小写都会失败。
- 正确写法:
ALTER PROFILE your_profile_name LIMIT PASSWORD_LIFE_TIME 90; - 错误示例:
ALTER PROFILE DEFAULT password_life_time 90;→ 报ORA-02379: profile limit does not exist -
UNLIMITED才禁用过期,DEFAULT不等于不限制(它继承 Oracle 默认值,通常是 180 天) -
0表示“创建即过期”,不是“永不过期”
改完立刻验证:
SELECT limit FROM dba_profiles WHERE profile = 'YOUR_PROFILE' AND resource_name = 'PASSWORD_LIFE_TIME';
输出必须是 90 或 UNLIMITED,不是数字字符串或空值。
为什么改了 PROFILE 还提示 ORA-28001 密码过期
PROFILE 修改只影响「下次认证」,不影响当前已过期状态。只要用户 account_status 是 EXPIRED 或 EXPIRED(GRACE),哪怕 PROFILE 已设 UNLIMITED,登录照样被拒。
必须补这一步:
ALTER USER your_user IDENTIFIED BY <strong>same_password_as_before</strong> ACCOUNT UNLOCK;
注意:这不是“重置密码”,而是强制刷新该用户的 expiry_date 字段。已有用户的 expiry_date 不会因 PROFILE 修改自动重算,只有改密或首次创建时才按新规则推算。
分配 PROFILE 给用户后,如何确认策略真生效了
光改 PROFILE 不够,还得确保用户绑定了它。用 ALTER USER ... PROFILE 显式绑定,而不是指望默认继承。
验证三件事:
-
SELECT profile FROM dba_users WHERE username = 'YOUR_USER';—— 确认字段值已更新 -
SELECT expiry_date FROM dba_users WHERE username = 'YOUR_USER';—— 若为NULL或远期时间(如4000-01-01),说明新策略已触发计算 - 新开一个连接测试登录,再执行任意 DML(比如
SELECT 1 FROM DUAL)—— Oracle 在首次需要校验密码的操作时才真正检查过期,不是登录瞬间
最容易被忽略的是最后一点:长连接、连接池里的会话不会立即响应 PROFILE 变更,得断开重连或等连接重建才触发校验。











