ora-01031权限不足、ora-28003/28007密码校验失败、cdb/pdb容器错位、应用连接池未刷新是alter user...identified by失败的四大主因,需分别检查权限、密码策略、当前容器及应用层缓存。
alter user ... identified by 执行失败:ora-01031 权限不足
没权限改别人密码,是新手最常卡住的地方。只有 dba 角色或被显式授予 alter user 系统权限的用户才能执行这条语句。
常见错误现象:ORA-01031: insufficient privileges
- 用普通业务账号(比如
scott)去改hr密码,肯定报错 - 即使改自己密码,某些 Oracle 版本或配置下也要求有
ALTER USER权限(尤其在 12c+ 的 PDB 场景中) - 确认权限:查
SELECT * FROM SESSION_PRIVS WHERE PRIVILEGE = 'ALTER USER'; - 临时解决:找 DBA 用
SYS或SYSTEM账号执行,或让其授权:GRANT ALTER USER TO your_user;
密码复杂度校验失败:ORA-28003 或 ORA-28007
Oracle 默认启用密码验证函数(如 ora12c_strong_verify_function),强制要求大小写字母、数字、特殊字符组合,且不能包含用户名或倒序用户名。
常见错误现象:ORA-28003: password verification for the specified password failed 或 ORA-28007: the password cannot be reused
- 避免用
abc123、oracle123、Admin@2024这类弱密码——哪怕加了@也可能因含用户名片段被拒 - 查看当前策略:
SELECT profile, resource_name, limit FROM dba_profiles WHERE resource_name = 'PASSWORD_VERIFY_FUNCTION'; - 临时绕过(仅测试环境):把验证函数设为
NULL,例如ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL;,但生产环境严禁这么做 - 安全替代:用至少 8 位、含大小写+数字+符号(如
P@ssw0rd_2024!),且不含账号名
在多租户(CDB/PDB)中改密码:必须先连接到目标 PDB
12c 及以后版本,ALTER USER ... IDENTIFIED BY 只影响当前容器中的用户。连错容器,密码看似改了,实际没生效。
使用场景:应用连的是 HR_PDB,但你在 CDB$ROOT 里改了 hr 用户密码
- 检查当前容器:
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL; - 如果不在目标 PDB,先切换:
ALTER SESSION SET CONTAINER = hr_pdb;(需有SET CONTAINER权限) - 再执行改密:
ALTER USER hr IDENTIFIED BY <strong>new_secure_password</strong>; - 注意:PDB 中的公共用户(如
C##ADMIN)只能在CDB$ROOT改
改密后应用连不上:密码已更新但连接池未刷新
密码生效是即时的,但应用层缓存旧凭据,导致“明明改了却登不进”的假象。
性能 / 兼容性影响:JDBC 连接池(如 HikariCP、Druid)默认复用连接,不会自动感知密码变更
- 重启应用是最直接的办法——别试图“等它自己好”
- 若无法重启,可清空连接池(如 HikariCP 的
hikariDataSource.evictConnections();),但需代码支持 - 数据库侧无延迟:改完立刻生效,不存在“同步时间窗”
- 验证是否真生效:用 sqlplus 手动连一次:
sqlplus hr/<strong>new_secure_password</strong>@//host:port/hr_pdb
真正麻烦的不是语法,是权限在哪、容器在哪、连接池在哪——这三个地方漏一个,就白忙活。










