必须用SELECT username, profile FROM dba_users WHERE username = 'YOUR_USERNAME'查询用户实际绑定的PROFILE,而非默认假设为DEFAULT;查实后方可执行ALTER PROFILE修改密码策略。
如何查看当前用户使用的 PROFILE
oracle 用户密码过期策略由其关联的 profile 控制,不是直接设在用户上。先确认目标用户用的是哪个 profile:
SELECT username, profile FROM dba_users WHERE username = 'YOUR_USERNAME';
常见结果是 DEFAULT,但不能假设——必须查实。如果返回空行,说明用户不存在或你没 DBA 权限,需换有权限账号操作。
修改 PROFILE 的 PASSWORD_LIFE_TIME 为 UNLIMITED
找到 PROFILE 名后(比如 DEFAULT),执行 ALTER PROFILE:
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
注意几点:
-
PASSWORD_LIFE_TIME是区分大小写的参数名,写成password_life_time会报错ORA-02379: profile limit does not exist - 该语句不立即生效于已过期用户;对已处于
EXPIRED(GRACE)或EXPIRED状态的用户,仍需手动解锁+重置密码 - 如果 PROFILE 被多个用户共用,此修改会影响所有使用它的用户,不是单用户隔离操作
验证修改是否生效
改完 PROFILE 后,查 dba_profiles 确认值已更新:
SELECT resource_name, limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_LIFE_TIME';
正确结果应为 UNLIMITED。若仍显示数字(如 180),说明语句未成功执行,或连接用户无 ALTER PROFILE 权限。
另外,别忘了检查 PASSWORD_GRACE_TIME 和 FAILED_LOGIN_ATTEMPTS ——它们和 PASSWORD_LIFE_TIME 同属密码策略,常被一并调整,但不是本问题必需项。
为什么改了 PROFILE 还提示密码过期?
这是最常被忽略的环节:PROFILE 修改只影响「未来」的密码生命周期,不影响「当前」已过期状态。如果用户当前状态是 EXPIRED,即使 PROFILE 已设为 UNLIMITED,登录仍会失败。
必须补一步解锁并重置(哪怕设回原密码):
ALTER USER your_user IDENTIFIED BY <strong>same_password_as_before</strong> ACCOUNT UNLOCK;
或者更稳妥地用新密码:
ALTER USER your_user IDENTIFIED BY new_secure_password ACCOUNT UNLOCK;
否则,下次登录时 Oracle 仍按旧过期时间校验,直接拒绝连接,不会重新读 PROFILE 再判断。


















