必须先查用户绑定的PROFILE:SELECT username, profile FROM dba_users WHERE username = 'YOUR_USER';再针对该PROFILE执行ALTER PROFILE ... LIMIT PASSWORD_LIFE_TIME UNLIMITED,并重置已过期用户密码,否则修改无效。
查清当前用户用的是哪个 profile
很多问题其实卡在第一步:你以为改了 default 就万事大吉,但目标用户可能压根没用这个 profile。必须先确认:
SELECT username, profile FROM dba_users WHERE username = 'YOUR_USER';- 如果返回的
profile不是DEFAULT(比如是APP_PROFILE),后续所有修改都得针对那个 profile,否则无效 - 特别注意 Oracle 12c 多租户环境:若用户在 PDB 中,需先
ALTER SESSION SET CONTAINER = your_pdb;再查
改 profile 的 PASSWORD_LIFE_TIME 为 UNLIMITED
这是核心操作,但容易漏掉关键细节:
- 用
SYS或具备ALTER PROFILE权限的用户执行:ALTER PROFILE your_profile LIMIT PASSWORD_LIFE_TIME UNLIMITED; - 别只改
PASSWORD_LIFE_TIME,顺手把PASSWORD_GRACE_TIME也设成UNLIMITED,否则过期后仍会触发 ORA-28002 警告弹窗 - 修改立即生效,不需重启数据库或 PDB;但对已过期的用户不“回溯修复”——这点极易被忽略
已过期用户必须重置密码(哪怕用原密码)
这是最常踩的坑:profile 改完,用户还是连不上,报 ORA-28001: the password has expired。
- 原因:Oracle 不会自动刷新已有用户的密码到期时间戳,只对新密码生效
- 必须显式执行:
ALTER USER your_user IDENTIFIED BY VALUES '<old_hash_value>';</old_hash_value>——但更稳妥、兼容性更好的做法是直接重输原密码:ALTER USER your_user IDENTIFIED BY "your_old_password"; - 如果用户已被锁(
ACCOUNT_STATUS = 'EXPIRED(GRACE)'或'LOCKED'),加ACCOUNT UNLOCK:ALTER USER your_user ACCOUNT UNLOCK IDENTIFIED BY "your_old_password"; - 注意双引号:若原密码含特殊字符或大小写敏感,必须用双引号包裹,否则可能报错
验证是否真正生效
别信“执行成功”就完事,要实打实看结果:
- 查用户当前状态:
SELECT username, account_status, expiry_date FROM dba_users WHERE username = 'YOUR_USER';——expiry_date应为NULL - 查 profile 实际限制:
SELECT resource_name, limit FROM dba_profiles WHERE profile = 'YOUR_PROFILE' AND resource_name IN ('PASSWORD_LIFE_TIME', 'PASSWORD_GRACE_TIME'); - 如果
expiry_date还有值,说明重置密码那步没执行,或执行时用了错误的密码/未加双引号
UNLIMITED 变成摆设。


















