能重置,但必须分清场景:知道原密码、不知道原密码、想保留原密码或让密码永不过期——每种对应不同命令、权限和风险;alter user ... identified by 是最常用方式,需ALTER USER权限,密码明文传输且受复杂度策略约束。
能重置,但必须分清场景:知道原密码、不知道原密码、想保留原密码、或想让密码永不过期——每种情况对应的命令、权限和风险都不同。
用 alter user ... identified by 直接改密码
这是最常用的方式,适用于你知道新密码、且不关心原密码的场景。执行者必须有 ALTER USER 权限(通常是 SYS 或 SYSTEM)。
- 命令格式固定:
alter user scott identified by newpass123; - 密码明文传输,别在脚本里硬编码;如果数据库启用了密码复杂度策略,
newpass123可能被拒绝(比如缺大写字母或特殊字符) - 执行后该用户下次登录必须用新密码,旧密码立即失效
- 如果用户当前是
EXPIRED状态,这条命令也能直接激活账户,无需先解锁
用 identified by values 恢复原密码密文
当应用连接串里密码是密文、你又不知道明文,但需要让该用户继续用“原来那个密码”时,就得从 user$ 表里捞出哈希值再回填。
- 先查密文:
SELECT name, password, spare4 FROM user$ WHERE name = 'SCOTT'; - Oracle 11g 及以前看
password字段(如F894844C34402B67),12c+ 默认用spare4(以S:开头的长字符串) - 还原命令:
alter user scott identified by values 'S:3BF46B2AC692CD7CD80082CB6C7C4B1C323F8A0CE044F1B477ADE2BE807E'; - 注意:
user$是核心字典表,普通 DBA 用户默认查不到,必须用SYS登录(sqlplus / as sysdba) - 这个操作绕过了密码策略校验,但也会让
PASSWORD_REUSE_TIME和PASSWORD_REUSE_MAX失效——相当于“骗过”了 Oracle 的密码历史机制
查并切换用户的 PROFILE 防止密码再过期
单纯改密码不能解决根本问题。如果用户所属的 PROFILE 设置了 PASSWORD_LIFE_TIME 180,90 天后还会提示过期。要一劳永逸,得换 profile 或改 profile。
- 查用户当前 profile:
SELECT username, profile FROM dba_users WHERE username = 'SCOTT'; - 查 profile 限制:
SELECT resource_name, limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_LIFE_TIME'; - 不想影响别人?别动
DEFAULT,新建一个:CREATE PROFILE scott_nolife LIMIT PASSWORD_LIFE_TIME UNLIMITED; - 再把用户绑过去:
ALTER USER scott PROFILE scott_nolife; - 注意:profile 修改后立即生效,但已过期的用户仍需用
identified by values或重设一次密码才能解除EXPIRED(GRACE)状态
遇到 ORA-28003 或 ORA-28007 怎么办
这两个错误常出现在改密码时,说明 Oracle 的密码验证函数(PASSWORD_VERIFY_FUNCTION)拦住了你。
-
ORA-28003:验证函数返回 FALSE,比如新密码和用户名太像、含连续字符、或没满足大小写+数字组合 -
ORA-28007:试图用旧密码重设,但 profile 启用了PASSWORD_REUSE_MAX限制 - 临时绕过验证函数(仅限紧急):
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL;,但之后必须补上安全策略 - 更稳妥的做法是先查 profile 用的函数:
SELECT limit FROM dba_profiles WHERE profile='DEFAULT' AND resource_name='PASSWORD_VERIFY_FUNCTION';,再按规则构造合规密码
真正麻烦的不是命令敲不对,而是改完密码后应用连不上——因为没同步更新连接池配置、没通知中间件重载、或者忘了 profile 里还有 FAILED_LOGIN_ATTEMPTS 锁定机制。每次操作前,先确认用户当前状态(ACCOUNT_STATUS)、所属 profile、以及密码字段是否已加密存储。否则容易修了 A 问题,冒出 B 错误。


















