ora-65096错误是oracle 12c+在cdb$root中创建用户时强制要求用户名以c##开头,且需显式指定container=all;建普通用户须先切换至pdb再执行create user。

ORA-65096:C##前缀不是可选项,是强制校验
在CDB$ROOT中执行CREATE USER appuser IDENTIFIED BY pwd必然报ORA-65096: invalid common user or role name。这不是配置问题,而是Oracle 12c+的硬性策略:只要当前容器是CDB$ROOT(SHOW CON_NAME返回CDB$ROOT),且未显式指定CONTAINER = ALL,就按公共用户规则校验——用户名必须以c##或C##开头。
试图用双引号包裹(如"appuser")或加CONTAINER = ALL但不加前缀,都会被拒绝解析。Oracle在语法层直接拦截,不进入权限或对象检查流程。
想建普通用户?先切到PDB再操作
真正该做的,不是绕过c##,而是确认你要的用户类型:
- 需要跨所有PDB生效(如监控账号)→ 接受
c##前缀,显式加CONTAINER = ALL - 只服务于单个应用库(最常见场景)→ 切到目标PDB,用任意合法名创建,无需前缀
切换步骤很明确:
ALTER SESSION SET CONTAINER = orclpdb;CREATE USER appuser IDENTIFIED BY pwd DEFAULT TABLESPACE users;GRANT CREATE SESSION, CREATE TABLE TO appuser;
注意:SHOW CON_NAME必须返回你的PDB名(如ORCLPDB),否则仍是在CDB上下文中执行。
PDB中用C##用户建表失败?权限没刷到当前容器
即使你连上了PDB(sqlplus c##app/oracle@orclpdb),执行CREATE TABLE t1(id NUMBER)仍可能报ORA-01031: insufficient privileges。根本原因不是密码或连接问题,而是权限作用域没对齐:
-
GRANT RESOURCE TO c##app在CDB$ROOT里执行 → 只在CDB$ROOT生效,PDB里查SESSION_PRIVS为空 - 必须在目标PDB内重新执行授权:
ALTER SESSION SET CONTAINER = orclpdb;后再GRANT CREATE TABLE TO c##app - 别忘了配额:
ALTER USER c##app QUOTA UNLIMITED ON users,否则建表会卡在ORA-01950
tnsnames.ora和服务名不匹配,导致“登录成功但不是你的人”
在PDB里创建了appuser,用sqlplus appuser/pwd@orcl登录却提示ORA-01017,或者能连上但实际登录的是SYS——大概率是服务名指向了CDB而非PDB。
验证方法:SELECT name, pdb FROM v$services; 查看PDB对应的服务名(通常是orclpdb,不是orcl)。然后必须用完整连接串:
sqlplus appuser/pwd@localhost:1521/orclpdb
如果常用SQL Developer或PL/SQL Developer,需在tnsnames.ora里单独配一个条目,SERVICE_NAME填PDB名,不能复用CDB的服务名。











