ORA-65096错误本质是Oracle 12c多租户架构强制校验,当前会话在CDB$ROOT时创建用户必须以c##或C##开头;若需普通用户,应先切换至已OPEN的PDB再执行CREATE USER。

不是语法写错了,也不是密码或表空间有问题——ORA-65096 是 Oracle 12c+ 多租户架构下对「容器上下文 + 用户类型」的硬性校验,直接拦截不符合契约的操作。
当前会话在 CDB$ROOT 中,却想建普通用户名
Oracle 12c 默认以 CDB 模式启动,用 sqlplus / as sysdba 连上去后,show con_name 返回的是 CDB$ROOT。此时执行 CREATE USER appuser IDENTIFIED BY pwd,系统按「公用用户」规则校验:必须以 c## 或 C## 开头。哪怕加了 CONTAINER = ALL,前缀检查也绕不过。
- 常见错误现象:
CREATE USER scott IDENTIFIED BY tiger直接报错,不是权限问题,是命名契约失败 - 双引号包裹(如
"scott")无效,Oracle 解析阶段就拒绝 -
COMMON_USER_PREFIX参数控制前缀,默认值就是c##,改它需重启且不推荐
误以为切到 PDB 就万事大吉,但没确认状态
即使执行了 ALTER SESSION SET CONTAINER = mypdb,如果该 PDB 实际是 MOUNTED 状态,CREATE USER 仍会失败——不是 ORA-65096,而是 ORA-65048 或 ORA-01116 等底层错误,容易被忽略。
- 必须先查
SELECT NAME, OPEN_MODE FROM V$PDBS WHERE NAME = 'mypdb',确保是READ WRITE - 若为
MOUNTED,要先ALTER PLUGGABLE DATABASE mypdb OPEN - PDB 内创建用户无需
c##,但所用表空间必须在该 PDB 中存在(CDB 创建的表空间默认不可见)
强行绕过校验用 _oracle_script,副作用比想象中多
在 CDB$ROOT 执行 ALTER SESSION SET "_oracle_script" = TRUE 后,CREATE USER test... 确实不报 ORA-65096,但这个用户仍是公用用户,只是名字没加前缀。
- 该参数是隐藏参数,Oracle 不保证后续版本兼容,补丁升级后可能失效
- 创建的用户依然出现在所有已打开的 PDB 中,权限模型没变,但名字不符合标准,备份/迁移工具可能出错
- 不能写入 SPFILE 全局启用,只对当前 session 生效,脚本化部署时极易遗漏
- DBA 工具(如 OEM、Data Pump)依赖标准命名识别用户类型,可能误判为异常对象
真正容易被忽略的是:哪怕你用了 c##admin 并加了 CONTAINER = ALL,如果目标 PDB 没 open、对应表空间不存在、或者临时表空间不可用,CREATE USER 依然失败——ORA-65096 只是表层提示,背后往往是容器状态或资源缺失。


















