直接改DEFAULT profile是最常用批量方案,但须先查实用户是否真绑定DEFAULT,否则无效;已过期用户必须重置密码才能生效,且需用正确SPARE4值或明文重设。

直接改 DEFAULT profile 是最常用、最有效的批量方案,但必须确认当前所有目标用户确实都绑在它上面——否则会漏掉人。
查清哪些用户真被 DEFAULT profile 控制
别跳过这步。很多系统里,DBA 或应用账号可能早被手动分配了自定义 profile(比如 APP_PROFILE),改 DEFAULT 对它们完全无效。
- 执行
SELECT username, profile FROM dba_users WHERE account_status NOT IN ('EXPIRED', 'LOCKED') AND username NOT IN ('SYS', 'SYSTEM');—— 先筛出活跃应用用户,看 profile 列是不是全是DEFAULT - 如果发现像
TFDS、EKPUSER这类业务用户用了别的 profile,得单独处理它们的 profile,不能只动DEFAULT -
account_status为EXPIRED(GRACE)的用户,密码已过期但还能登一次,这类用户必须重置密码才能真正解锁,光改策略没用
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED 立即生效
这条命令不重启数据库、不锁表、不阻塞连接,执行完就对所有新连接生效。但注意两个关键点:
- 已过期的用户(
account_status = 'EXPIRED')不会自动“复活”,仍需执行ALTER USER ... IDENTIFIED BY ...或IDENTIFIED BY VALUES才能登录 -
PASSWORD_GRACE_TIME默认是 7 天,宽限期内用户会收到 ORA-28002 警告;建议一并设为UNLIMITED,避免干扰日志和监控报警:ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED PASSWORD_GRACE_TIME UNLIMITED; - 如果生产环境有合规要求必须定期换密,不要设
UNLIMITED,而是统一设成90或180,再配合密码轮换脚本
只想改部分用户?别复制 DEFAULT 全量参数
网上常见写法是把 DEFAULT 所有参数原样 CREATE PROFILE 出来,再改 PASSWORD_LIFE_TIME。这容易出错:Oracle 19c 后 PASSWORD_VERIFY_FUNCTION 默认启用,而复制时若漏掉或写错该函数名(比如写成 NULL 而不是 ORA12C_STRONG_VERIFY),会导致后续 IDENTIFIED BY 报 ORA-28003 密码校验失败。
- 安全做法是只创建最小集:
CREATE PROFILE no_expire_app LIMIT PASSWORD_LIFE_TIME UNLIMITED;—— 其他策略继承DEFAULT,不显式声明 - 再执行
ALTER USER app_user PROFILE no_expire_app;,这样既隔离策略,又避免参数冲突 - 验证是否生效:
SELECT username, profile, expiry_date FROM dba_users WHERE username = 'app_user';,确保expiry_date变成NULL
密码已过期的用户必须显式重置,且注意 19c 的 SPARE4 值
这是最容易卡住的地方:策略改完了,用户还是连不上。因为 Oracle 不会自动更新 dba_users.expiry_date 字段,它只在你执行 ALTER USER ... IDENTIFIED BY 或 IDENTIFIED BY VALUES 时才刷新。
- 如果应用配置里硬编码的是明文密码,用
ALTER USER scott IDENTIFIED BY newpass;即可 - 如果密码是密文(比如连接池里存的是哈希值),且你只有
sys.user$.SPARE4值(形如S:3BF46B2A...),必须用ALTER USER scott IDENTIFIED BY VALUES 'S:3BF46B2A...';—— 少了S:前缀或用错字段(比如误用PASSWORD字段)都会报 ORA-01017 - 重置后立刻查
dba_users,确认account_status变成OPEN,expiry_date为NULL
真正麻烦的从来不是命令怎么写,而是改完之后要不要通知所有应用方重启连接池、有没有用户绑了非 DEFAULT profile 却被忽略、以及 19c 下用错 SPARE4 值导致重置失败还查不出原因。











