Oracle 19c CDB中创建公共用户必须以C##或c##开头且显式指定CONTAINER=ALL,否则报ORA-65096;漏写CONTAINER=ALL则用户仅存在于CDB$ROOT,无法跨PDB生效。

创建CDB公共用户必须加 C## 前缀
Oracle 19c多租户环境下,CDB级用户(即能在所有PDB中可见、可登录的通用用户)必须以 C## 或 c## 开头,否则会报 ORA-65096: invalid common user or role name。这不是命名习惯问题,而是强制语法校验——哪怕你在 CDB$ROOT 中执行,不带前缀就直接失败。
常见错误现象:
– 执行 create user admin identified by pwd; → 报 ORA-65096
– 忘记指定 container=all → 用户只在当前容器(如 CDB$ROOT)存在,无法跨PDB访问
- 必须显式写
container=all,不能省略或写成container=current - 用户名区分大小写,但建议全小写避免连接时大小写混淆
- 密码需满足CDB的密码复杂度策略(如含数字、特殊字符),否则报
ORA-28003
CREATE USER 语句中 container 参数不能省略
即使你已用 / as sysdba 登录到 CDB$ROOT,也必须在建用户时明确声明 container=all。Oracle不会根据当前容器自动推断作用域——它默认按 container=current 处理,结果就是只在 CDB$ROOT 创建了用户,其他PDB里查不到这个用户,自然也无法登录。
正确示例:create user c##cdbadmin identified by StrongPass123 container=all;
- 若漏掉
container=all,该用户仅存在于当前容器,SELECT username FROM dba_users WHERE username = 'C##CDBADMIN'在PDB中查不到 -
container=all要求用户必须有CREATE USER权限且在CDB$ROOT下执行;在PDB中执行会直接报ORA-65048 - 创建后需立即授权,否则用户连
CREATE SESSION都没有,登录时提示ORA-01045
给CDB公共用户赋权必须用 container=all
授权和建用户一样,必须同步指定 container=all,否则权限只生效于当前容器。比如你给 c##cdbadmin 授了 DBA,但没加 container=all,那这个DBA权限在PDB里是无效的——用户能连上PDB,但执行 SELECT * FROM dba_tables 会报权限不足。
典型授权命令:grant create session, select any dictionary to c##cdbadmin container=all;
-
container=all是授权语句的硬性要求,不是可选项 - 不要授
sysdba给普通CDB用户,这会导致登录时绕过容器隔离(conn c##cdbadmin/pwd as sysdba会直连CDB$ROOT,失去PDB上下文) - 若需在特定PDB中限制权限,得单独切到该PDB再用
container=current收权,但这种情况极少
验证CDB公共用户是否真正跨容器可用
建完用户、授完权,别急着交付。必须手动切到至少一个PDB里验证登录和基础权限,否则上线后业务连不上库就尴尬了。最容易被忽略的是:用户能连CDB$ROOT ≠ 能连PDB。
验证步骤:
– alter session set container=your_pdb_name;
– conn c##cdbadmin/StrongPass123;
– select sys_context('userenv', 'con_name') from dual; 确认当前容器名是你期望的PDB
- 如果
conn报ORA-01017,先检查是否在PDB里执行了show pdbs确认该PDB是READ WRITE状态 - 如果登录成功但查不到表,确认是否授了
SELECT ANY DICTIONARY或对应PDB的SELECT权限 - 注意监听配置:tnsnames.ora 中的服务名必须指向PDB(如
your_pdb_name.example.com),而不是CDB服务名,否则客户端连的是CDB$ROOT
CDB公共用户的本质是“跨容器元数据副本”,Oracle在每个PDB里都维护一份该用户的定义记录。这意味着创建和授权操作看似只敲一次命令,背后触发的是对所有现有PDB(及未来新插拔的PDB)的元数据同步。一旦漏掉 container=all,这个同步链就断了,后续补救只能删掉重建——没有“事后补加”机制。


















