查出所有密码已过期的用户需执行SELECT username, account_status, expiry_date FROM dba_users WHERE account_status LIKE 'EXPIRED%';,该语句精准定位状态为'EXPIRED'或'EXPIRED(GRACE)'的问题账户,注意大小写敏感且需结合profile策略检查与ACCOUNT UNLOCK操作确保完全恢复访问。
查出所有密码已过期的用户
密码过期用户在 dba_users 视图中状态为 'expired' 或 'expired(grace)',直接查就能定位到问题账户:
SELECT username, account_status, expiry_date FROM dba_users WHERE account_status LIKE 'EXPIRED%';- 注意:
account_status字段区分大小写,不能写成'expired';'EXPIRED(GRACE)'表示宽限期已过但尚未锁定,仍需重置密码才能登录 - 如果查询结果为空,但仍有用户报
ORA-28001,可能是连接时用了旧密码缓存,或用户被锁(LOCKED),需一并检查
批量重置密码并解锁账户
Oracle 不支持一条 SQL 批量改多个用户的密码(ALTER USER ... IDENTIFIED BY 无法用子查询动态赋值),必须生成语句再执行。安全做法是先拼出脚本,人工审核后再运行:
- 生成修改语句(以统一新密码
'NewPass123'为例):
SELECT 'ALTER USER ' || username || ' IDENTIFIED BY NewPass123 ACCOUNT UNLOCK;' FROM dba_users WHERE account_status LIKE 'EXPIRED%';
ALTER USER 语句,在 SQL*Plus 或 SQL Developer 中逐条执行(不要直接 EXECUTE IMMEDIATE 动态执行,风险高)IDENTIFIED BY VALUES,但需先查 dba_users.password(11g)或 sys.user$.password(19c+),操作更复杂且不推荐用于批量为什么不能只改密码,还要 ACCOUNT UNLOCK
密码过期后若用户持续尝试登录失败,可能触发账户自动锁定(尤其启用了 FAILED_LOGIN_ATTEMPTS),此时仅改密码无效:
-
account_status显示为'EXPIRED(GRACE)'→ 改密码即可 -
account_status显示为'EXPIRED & LOCKED'或'LOCKED(TIMED)'→ 必须加ACCOUNT UNLOCK - 建议统一加上
ACCOUNT UNLOCK,避免漏判;该子句对未锁定账户无副作用
改完密码后仍连不上?检查 profile 是否真生效
即使密码重置成功,如果用户 profile 的 PASSWORD_LIFE_TIME 还是 180 天,下次到期还会复现。批量处理前应优先确认策略是否已解除:
- 查当前 DEFAULT profile 设置:
SELECT limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_LIFE_TIME'; - 若返回不是
'UNLIMITED',先执行:ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; - 该操作立即生效,不影响正在连接的会话,但新密码将不再受有效期约束
- 特别注意:有些环境自定义了 profile(如
'APP_PROFILE'),需确认目标用户实际关联的是哪个 profile,用SELECT username, profile FROM dba_users WHERE username IN (...);核对
dba_users.profile 分组确认,否则修完一批,另一批过两天又报 ORA-28001。











