Oracle Common User 与 Local User

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 ****** 
  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 ****** 
  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 ******

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

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 UserCommon 权限所有容器
Common UserLocal 权限单个 PDB
Local UserLocal 权限单个 PDB
Local UserCommon 权限不支持

6. 用户管理操作

6.1 修改 Common User

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

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

-- 修改表空间
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 ******
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 ******

7.2 Local User 密码独立

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

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

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 ******
-- 不是 admin

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

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

修复

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

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

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/