Oracle 12c+中C##前缀是多租户架构下公共用户的强制安全策略,由底层函数硬编码校验,common_user_prefix参数已弃用且无法绕过该限制。
Oracle 12c+ 中 C## 前缀限制的本质是什么
这不是一个能“屏蔽”的功能,而是 oracle 多租户(cdb/pdb)架构下的强制安全策略。只要数据库启用了 cdb$root,且你用的是公共用户(即在 cdb 级创建、能跨 pdb 登录的用户),用户名就必须以 c## 或 c## 开头。这是硬编码校验,不是靠参数开关控制的。
为什么 common_user_prefix 参数不起作用
这个参数确实存在,但它的作用被严重误解了:
• 它只影响「新创建的公共用户」是否必须匹配该前缀,不改变已有校验逻辑
• 即使设为 ''(空字符串),Oracle 仍会检查是否为 C## 开头——因为底层校验函数 ksuCheckCommonUserName 写死判断了该前缀
• 在 12.1 及之后版本中,该参数已被标记为 deprecated,官方文档明确说明“不建议修改”
实际可行的绕过方式(仅限开发/测试环境)
生产环境不该绕过,但如果你在本地 PDB 做快速验证,有两条路可走:
- 在 PDB 内创建本地用户(非公共用户):不经过 CDB 校验,用户名任意,例如
CREATE USER app_user IDENTIFIED BY pwd; - 用
ALTER SESSION SET CONTAINER = pdb_name;切到目标 PDB 后再执行用户操作,确保当前 session 不在CDB$ROOT - 如果必须用公共用户,就接受
C##前缀——它只是命名约定,不影响权限、对象访问或应用连接逻辑
常见报错与对应场景
遇到这些错误时,别急着改参数:
-
ORA-65094: invalid local user name→ 你在 CDB$ROOT 里试图建本地用户,应先ALTER SESSION SET CONTAINER=pdb_name -
ORA-65096: invalid common user or role name→ 在 CDB$ROOT 创建公共用户但没加C##前缀 -
ORA-01917: user or role 'XXX' does not exist→ 用户存在但不在当前 container,检查SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL;
真正容易被忽略的点是:common_user_prefix 的修改必须在 CDB$ROOT 执行,且需重启实例才生效——但即便重启,也无法让非 C## 用户通过公共用户校验。这点很多人试到一半才发现白折腾了。

















