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 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 ******
-- 修改表空间
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. 最佳实践
- 管理用 Common User:c##dba 等
- 业务用 Local User:每个 PDB 独立
- 不滥用 Common User:仅必要管理用户
- Common User 权限最小化:仅必需权限
- Local User 命名清晰:业务相关
- 密码统一管理:Common User 密码在 ROOT 修改
- Profile 分级:Common Profile 与 Local Profile
- 审计用户操作:Common User 跨 PDB 操作
- 避免在 PDB 修改 Common User:在 ROOT 统一管理
- 多租户隔离:业务用户严格 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/