Oracle Common User 与 Local User

适用版本:Oracle Database 12c / 19c / 23ai
文档版本:v1.0 / 2026-07


1. 概述

多租户架构中用户分为两类[1]:

类型 作用域 命名
Common User 所有容器(CDB+PDB) c## 或 C## 开头
Local User 单个 PDB 任意

2. Common User

2.1 创建

-- 必须在 CDB$ROOT 创建
ALTER SESSION SET CONTAINER = CDB$ROOT;

-- Common User 必须 c## 或 C## 开头
CREATE USER c##admin IDENTIFIED BY pwd 
  DEFAULT TABLESPACE users 
  TEMPORARY TABLESPACE temp
  CONTAINER=ALL;

2.2 权限授予

-- 授予所有容器
GRANT CREATE SESSION TO c##admin CONTAINER=ALL;
GRANT CREATE TABLE TO c##admin CONTAINER=ALL;

-- 仅授予 ROOT
GRANT CREATE SESSION TO c##admin CONTAINER=CDB$ROOT;

-- WITH ADMIN OPTION
GRANT CREATE TABLE TO c##admin CONTAINER=ALL WITH ADMIN OPTION;

2.3 查看 Common User

-- CDB 视图
SELECT username, common 
FROM cdb_users 
WHERE common='YES';

-- PDB 视图(仅 Local)
SELECT username, common 
FROM dba_users 
WHERE common='NO';

2.4 Common User 在 PDB 中

-- Common User 在所有 PDB 中存在
SELECT username, con_id 
FROM cdb_users 
WHERE username='C##ADMIN';

--  CON_ID USERNAME
--  1     C##ADMIN  (CDB$ROOT)
--  2     C##ADMIN  (PDB$SEED)
--  3     C##ADMIN  (HRPDB)

3. Local User

3.1 创建

-- 在 PDB 中创建
ALTER SESSION SET CONTAINER = hrpdb;

-- Local User 命名无限制
CREATE USER hr_admin IDENTIFIED BY pwd 
  DEFAULT TABLESPACE users 
  TEMPORARY TABLESPACE temp
  QUOTA UNLIMITED ON users;

GRANT CREATE SESSION TO hr_admin;
GRANT CREATE TABLE TO hr_admin;

3.2 Local User 仅存在当前 PDB

-- 在 HRPDB 创建的 hr_admin 在 SALESPDB 中不存在
ALTER SESSION SET CONTAINER = salespdb;
SELECT username FROM dba_users WHERE username='HR_ADMIN';
-- 无结果

3.3 多个 PDB 同名 Local User

-- HRPDB 中
ALTER SESSION SET CONTAINER = hrpdb;
CREATE USER admin IDENTIFIED BY pwd;

-- SALESPDB 中
ALTER SESSION SET CONTAINER = salespdb;
CREATE USER admin IDENTIFIED BY pwd;
-- 不同的用户,互不影响

4. Common Role 与 Local Role

4.1 Common Role

-- Common Role 也必须 c## 开头
CREATE ROLE c##dba_role CONTAINER=ALL;

-- 授予权限
GRANT CREATE SESSION TO c##dba_role CONTAINER=ALL;
GRANT CREATE TABLE TO c##dba_role CONTAINER=ALL;

-- 授予用户
GRANT c##dba_role TO c##admin CONTAINER=ALL;

4.2 Local Role

-- PDB 中创建
ALTER SESSION SET CONTAINER = hrpdb;
CREATE ROLE hr_admin_role;

GRANT SELECT ON employees TO hr_admin_role;
GRANT hr_admin_role TO hr_admin;

5. 权限层级

5.1 Common Privilege

-- Common User 的 Common 权限
GRANT CREATE SESSION TO c##admin CONTAINER=ALL;
-- c##admin 在所有容器中都有 CREATE SESSION

5.2 Local Privilege

-- Common User 的 Local 权限
ALTER SESSION SET CONTAINER = hrpdb;
GRANT SELECT ON employees TO c##admin;
-- c##admin 仅在 hrpdb 中有此权限

-- Local User 的 Local 权限
GRANT SELECT ON employees TO hr_admin;

5.3 权限矩阵

用户类型 权限作用域 说明
Common User Common 权限 所有容器
Common User Local 权限 单个 PDB
Local User Local 权限 单个 PDB
Local User Common 权限 不支持

6. 用户管理操作

6.1 修改 Common User

-- 必须在 CDB$ROOT 修改
ALTER SESSION SET CONTAINER = CDB$ROOT;

-- 修改密码
ALTER USER c##admin IDENTIFIED BY new_pwd;

-- 修改表空间
ALTER USER c##admin DEFAULT TABLESPACE users;

-- 锁定
ALTER USER c##admin ACCOUNT LOCK;

6.2 修改 Local User

-- 在 PDB 中修改
ALTER SESSION SET CONTAINER = hrpdb;

ALTER USER hr_admin IDENTIFIED BY new_pwd;
ALTER USER hr_admin QUOTA UNLIMITED ON users;

6.3 删除

-- 删除 Common User(CDB$ROOT)
ALTER SESSION SET CONTAINER = CDB$ROOT;
DROP USER c##admin CASCADE;

-- 删除 Local User
ALTER SESSION SET CONTAINER = hrpdb;
DROP USER hr_admin CASCADE;

7. 密码管理

7.1 Common User 密码统一

-- 在 CDB$ROOT 修改密码,所有 PDB 同步
ALTER SESSION SET CONTAINER = CDB$ROOT;
ALTER USER c##admin IDENTIFIED BY new_pwd;

7.2 Local User 密码独立

-- 每个 PDB 中独立修改
ALTER SESSION SET CONTAINER = hrpdb;
ALTER USER hr_admin IDENTIFIED BY pwd;

ALTER SESSION SET CONTAINER = salespdb;
ALTER USER hr_admin IDENTIFIED BY different_pwd;

8. SYS/SYSTEM 与 Common User

8.1 SYS/SYSTEM 是 Common User

SELECT username, common 
FROM cdb_users 
WHERE username IN ('SYS','SYSTEM');
-- COMMON = YES

8.2 SYSDBA/SYSOPER

-- SYSDBA 权限是 Common 权限
GRANT SYSDBA TO c##admin CONTAINER=ALL;

-- 查看
SELECT username, sysdba 
FROM v$pwfile_users;

详细内容见:Oracle SYS / SYSTEM / SYSDBA / SYSOPER 区别。


9. Profile 与用户

9.1 Common Profile

-- CDB$ROOT 创建 Common Profile
CREATE PROFILE c##secure_profile LIMIT
  FAILED_LOGIN_ATTEMPTS 5
  PASSWORD_LIFE_TIME 90
  CONTAINER=ALL;

-- 分配给 Common User
ALTER USER c##admin PROFILE c##secure_profile CONTAINER=ALL;

9.2 Local Profile

-- PDB 中创建 Local Profile
ALTER SESSION SET CONTAINER = hrpdb;
CREATE PROFILE hr_profile LIMIT
  SESSIONS_PER_USER 5;

-- 分配给 Local User
ALTER USER hr_admin PROFILE hr_profile;

详细内容见:Oracle Profile 与资源限制。


10. 查询用户

10.1 CDB 视图(所有容器)

SELECT username, common, con_id 
FROM cdb_users 
ORDER BY con_id, username;

10.2 DBA 视图(当前容器)

SELECT username, common 
FROM dba_users;

10.3 用户权限

-- Common User 在各 PDB 的权限
SELECT 
  p.name AS pdb_name,
  u.username,
  sp.privilege
FROM cdb_users u, v$pdbs p, cdb_sys_privs sp
WHERE u.username='C##ADMIN'
  AND u.con_id = p.con_id
  AND sp.grantee = u.username;

11. 常见坑与排错

11.1 ORA-65096: 无效 Common User 名

现象:创建 c## 开头的用户失败。

修复:

-- Common User 必须 c## 或 C## 开头
CREATE USER c##admin IDENTIFIED BY pwd;
-- 不是 admin

11.2 ORA-65049: 不允许 Local User 在 ROOT

现象:在 CDB$ROOT 创建普通用户失败。

修复:

-- 方法 1:使用 Common User
CREATE USER c##admin IDENTIFIED BY pwd;

-- 方法 2:在 PDB 中创建 Local User
ALTER SESSION SET CONTAINER = hrpdb;
CREATE USER hr_admin IDENTIFIED BY pwd;

11.3 ORA-65050: Common 权限需 CONTAINER=ALL

现象:授予 Common User 权限失败。

修复:

-- 在 CDB$ROOT 授予
ALTER SESSION SET CONTAINER = CDB$ROOT;
GRANT CREATE SESSION TO c##admin CONTAINER=ALL;

11.4 Common User 在 PDB 中无权限

现象:c##admin 在 PDB 中登录失败。

修复:

-- 1. 检查权限
SELECT * FROM cdb_sys_privs 
WHERE grantee='C##ADMIN' AND con_id=3;

-- 2. 授予 Common 权限
ALTER SESSION SET CONTAINER = CDB$ROOT;
GRANT CREATE SESSION TO c##admin CONTAINER=ALL;

11.5 Common Role 在 PDB 中无效

现象:c##role 在 PDB 中授予失败。

修复:

-- Common Role 必须 CONTAINER=ALL 授予
GRANT c##role TO c##admin CONTAINER=ALL;

12. 最佳实践

  1. 管理用 Common User:c##dba 等
  2. 业务用 Local User:每个 PDB 独立
  3. 不滥用 Common User:仅必要管理用户
  4. Common User 权限最小化:仅必需权限
  5. Local User 命名清晰:业务相关
  6. 密码统一管理:Common User 密码在 ROOT 修改
  7. Profile 分级:Common Profile 与 Local Profile
  8. 审计用户操作:Common User 跨 PDB 操作
  9. 避免在 PDB 修改 Common User:在 ROOT 统一管理
  10. 多租户隔离:业务用户严格 Local

13. 参考资料

[1] Oracle Multitenant Administrator’s Guide 19c, “Common Users and Local Users”
https://docs.oracle.com/en/database/oracle/oracle-database/19/multi/administering-common-users-and-local-users.html

[2] Oracle Database Security Guide 19c, “Multitenant Environment Security”
https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/