应先查清用户绑定的PROFILE及PASSWORD_LIFE_TIME值,再针对性修改;设为UNLIMITED才真正禁用过期机制,且需ALTER USER重置密码以更新EXPIRY_DATE。

查清用户当前绑定的 PROFILE 是哪一种
直接改 DEFAULT 不一定生效——很多用户被显式指定了其他 PROFILE,比如 APP_PROFILE 或 SECURE_PROFILE。不查清楚就动手,等于在改别人家的配置。
执行这两条语句确认:
SELECT username, profile FROM dba_users WHERE username = 'YOUR_USER';
SELECT resource_name, limit FROM dba_profiles WHERE profile = 'YOUR_PROFILE_NAME' AND resource_type = 'PASSWORD';
-
resource_name = 'PASSWORD_LIFE_TIME'的值才是关键:可能是180、90、UNLIMITED或DEFAULT -
DEFAULT不等于“不限制”,它表示继承 Oracle 内置默认值(通常是 180 天) - 如果查出来是
UNLIMITED,但用户仍提示过期,说明expiry_date字段还没刷新(见下节)
PASSWORD_LIFE_TIME 设多少才算真正起效
PASSWORD_LIFE_TIME 只在用户**下次认证时**重新计算过期时间,不是实时倒计时。已有连接不会中断,也不会立刻触发提醒。
- 设为
0:密码创建后立即过期,登录即报ORA-28001 - 设为正整数(如
90):从密码最后一次修改时间开始计时 - 设为
UNLIMITED:才真正禁用过期机制 - 设为
DEFAULT:回退到该PROFILE创建时的默认值(通常仍是 180)
注意:ALTER PROFILE 后,已登录用户不受影响;新连接才会按新规则重算 EXPIRY_DATE。
已有用户过期了,改 PROFILE 没用怎么办
这是最常踩的坑:把 PASSWORD_LIFE_TIME 改成 UNLIMITED,但 DBA_USERS.EXPIRY_DATE 还是显示过去的时间,用户照样报 ORA-28001 或 ORA-28002。
- Oracle 不会自动刷新已有用户的
EXPIRY_DATE,哪怕你改了PROFILE - 必须让密码“被修改一次”才能重置倒计时起点——哪怕用原密码重设也行
- 执行:
ALTER USER your_user IDENTIFIED BY "same_password" REPLACE "old_password";
- 如果用户已被锁(
ACCOUNT_STATUS = 'EXPIRED(GRACE)'或'LOCKED'),先解锁:ALTER USER your_user ACCOUNT UNLOCK;
要不要动 DEFAULT PROFILE?
生产环境里,直接 ALTER PROFILE DEFAULT LIMIT ... 最快,但风险明确:所有没显式指定 PROFILE 的用户都会被波及,包括未来新建的账号。
- 如果只是几个应用账号要永不过期,建议新建专用
PROFILE:CREATE PROFILE no_expire LIMIT PASSWORD_LIFE_TIME UNLIMITED;
ALTER USER app_user PROFILE no_expire;
- 如果确实要全局放开,至少顺手把
PASSWORD_GRACE_TIME也设成UNLIMITED,否则过期后仍有ORA-28002提醒 -
DEFAULT被改过之后,新用户创建时会继承这个新值,无需再单独赋PROFILE
真正麻烦的从来不是改参数,而是忘记已有用户的 EXPIRY_DATE 不会自动更新——它卡在那儿,直到你手动触发一次密码变更。


















