Oracle 用户、模式、权限、角色

Oracle 用户、模式、权限、角色

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


1. 概述

Oracle 安全模型由四个核心概念构成[1]:

概念作用
用户(User)数据库账户
模式(Schema)用户拥有的对象集合
权限(Privilege)执行特定操作的权利
角色(Role)权限集合

2. 用户(User)

2.1 创建用户

CREATE USER scott IDENTIFIED BY ******
  DEFAULT TABLESPACE users
  TEMPORARY TABLESPACE temp
  QUOTA 100M ON users
  QUOTA 50M ON example_ts
  PROFILE default
  PASSWORD EXPIRE
  ACCOUNT UNLOCK;

2.2 用户属性

SELECT 
  username,
  default_tablespace,
  temporary_tablespace,
  account_status,
  lock_date,
  expiry_date,
  default_tablespace,
  profile
FROM dba_users
WHERE username='SCOTT';

2.3 修改用户

-- 修改密码
ALTER USER scott IDENTIFIED BY ******

-- 修改默认表空间
ALTER USER scott DEFAULT TABLESPACE users;

-- 锁定/解锁
ALTER USER scott ACCOUNT LOCK;
ALTER USER scott ACCOUNT UNLOCK;

-- 密码过期
ALTER USER scott PASSWORD EXPIRE;

-- 修改配额
ALTER USER scott QUOTA UNLIMITED ON users;
ALTER USER scott QUOTA 0 ON example_ts;

2.4 删除用户

-- 删除用户(无对象)
DROP USER scott;

-- 删除用户及其对象
DROP USER scott CASCADE;

3. 模式(Schema)

3.1 模式 = 用户

Oracle 中用户和模式一一对应,用户名即模式名[1]:

-- 查看模式
SELECT DISTINCT owner FROM dba_objects ORDER BY owner;

-- 查看模式对象
SELECT object_name, object_type 
FROM dba_objects 
WHERE owner='SCOTT';

3.2 模式对象

类型示例
TABLEemployees, departments
INDEXidx_emp_name
VIEWemp_view
SEQUENCEemp_seq
SYNONYMemp_syn
PROCEDUREupdate_salary
FUNCTIONget_total
PACKAGEemployee_pkg
TRIGGERemp_trigger
TYPEemployee_type
MATERIALIZED VIEWemp_mv

3.3 跨模式访问

-- 必须有对象权限
SELECT * FROM scott.employees;

-- 同义词简化
CREATE PUBLIC SYNONYM emp FOR scott.employees;
SELECT * FROM emp;

4. 权限(Privilege)

4.1 系统权限

-- 创建用户权限
GRANT CREATE USER TO admin;

-- 创建会话权限(必需)
GRANT CREATE SESSION TO scott;

-- 创建表权限
GRANT CREATE TABLE TO scott;

-- 创建任何表
GRANT CREATE ANY TABLE TO admin;

-- 删除任何表
GRANT DROP ANY TABLE TO admin;

-- 查询任何表
GRANT SELECT ANY TABLE TO admin;

-- unlimited tablespace
GRANT UNLIMITED TABLESPACE TO scott;

4.2 对象权限

-- 表权限
GRANT SELECT ON scott.employees TO hr_user;
GRANT INSERT, UPDATE ON scott.employees TO hr_user;
GRANT ALL ON scott.employees TO admin_user;

-- 列级权限
GRANT UPDATE (salary, dept_id) ON scott.employees TO hr_user;

-- 视图权限
GRANT SELECT ON scott.emp_view TO hr_user;

-- 存储过程权限
GRANT EXECUTE ON scott.update_salary TO hr_user;

4.3 撤销权限

-- 撤销系统权限
REVOKE CREATE TABLE FROM scott;

-- 撤销对象权限
REVOKE SELECT ON scott.employees FROM hr_user;

4.4 查看权限

-- 系统权限
SELECT * FROM dba_sys_privs WHERE grantee='SCOTT';

-- 对象权限
SELECT * FROM dba_tab_privs WHERE grantee='SCOTT';

-- 列权限
SELECT * FROM dba_col_privs WHERE grantee='SCOTT';

-- 用户授出的权限
SELECT * FROM dba_tab_privs WHERE grantor='SCOTT';

4.5 WITH ADMIN OPTION / WITH GRANT OPTION

-- WITH ADMIN OPTION:可转授系统权限
GRANT CREATE TABLE TO admin WITH ADMIN OPTION;

-- WITH GRANT OPTION:可转授对象权限
GRANT SELECT ON scott.employees TO admin WITH GRANT OPTION;

区别

  • WITH ADMIN OPTION:撤销时不级联(被授者的转授权限保留)
  • WITH GRANT OPTION:撤销时级联(被授者的转授权限也撤销)

5. 角色(Role)

5.1 概念

角色是权限的集合,简化权限管理[2]:

角色 → 权限1, 权限2, ...

用户 → 角色 → 权限

5.2 预定义角色

角色作用
CONNECT创建会话
RESOURCE创建对象(表、过程等)
DBA数据库管理员
SYSDBA最高管理特权
SYSOPER运维操作
EXP_FULL_DATABASE导出全库
IMP_FULL_DATABASE导入全库
SELECT_CATALOG_ROLE查询数据字典
EXECUTE_CATALOG_ROLE执行字典包

5.3 创建角色

-- 创建角色
CREATE ROLE app_role;

-- 创建密码保护角色
CREATE ROLE admin_role IDENTIFIED BY ******

-- 授予权限给角色
GRANT CREATE TABLE TO app_role;
GRANT SELECT, INSERT ON scott.employees TO app_role;

-- 授予角色给用户
GRANT app_role TO scott;
GRANT app_role TO hr_user;

5.4 角色管理

-- 启用/禁用角色
SET ROLE app_role;
SET ROLE ALL EXCEPT admin_role;
SET ROLE NONE;  -- 禁用所有角色

-- 修改默认角色
ALTER USER scott DEFAULT ROLE app_role;
ALTER USER scott DEFAULT ROLE ALL;
ALTER USER scott DEFAULT ROLE ALL EXCEPT admin_role;

-- 删除角色
DROP ROLE app_role;

5.5 查看角色

-- 用户拥有的角色
SELECT * FROM dba_role_privs WHERE grantee='SCOTT';

-- 角色拥有的权限
SELECT * FROM role_sys_privs WHERE role='APP_ROLE';

-- 角色拥有的对象权限
SELECT * FROM role_tab_privs WHERE role='APP_ROLE';

-- 角色嵌套
SELECT * FROM role_role_privs WHERE role='APP_ROLE';

-- 当前会话启用的角色
SELECT * FROM session_roles;

6. 多租户(CDB/PDB)用户

6.1 Common User(公共用户)

-- 必须以 c## 开头
CREATE USER c##admin IDENTIFIED BY ******
  DEFAULT TABLESPACE users
  QUOTA UNLIMITED ON users
  CONTAINER=ALL;  -- 所有 PDB

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

6.2 Local User(本地用户)

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

CREATE USER sales_admin IDENTIFIED BY ******
  DEFAULT TABLESPACE users;

GRANT CREATE SESSION TO sales_admin;

6.3 查询

-- CDB 视图
SELECT username, common, con_id FROM cdb_users;

-- PDB 视图
SELECT username FROM dba_users;

7. Profile(资源限制)

7.1 创建 Profile

CREATE PROFILE app_profile LIMIT
  SESSIONS_PER_USER 5              -- 每用户最多 5 个会话
  CPU_PER_SESSION 10000            -- 单会话最多 10000 厘秒 CPU
  CPU_PER_CALL 1000                -- 单次调用最多 1000 厘秒
  CONNECT_TIME 60                  -- 单会话最长 60 分钟
  IDLE_TIME 15                     -- 空闲超时 15 分钟
  LOGICAL_READS_PER_SESSION 100000 -- 单会话最多 100000 逻辑读
  LOGICAL_READS_PER_CALL 10000     -- 单次调用最多 10000 逻辑读
  FAILED_LOGIN_ATTEMPTS 5          -- 失败登录 5 次锁定
  PASSWORD_LIFE_TIME 90            -- 密码 90 天过期
  PASSWORD_REUSE_TIME 365          -- 365 天内不能复用
  PASSWORD_REUSE_MAX 5             -- 修改 5 次后才能复用
  PASSWORD_LOCK_TIME 1             -- 锁定 1 天
  PASSWORD_GRACE_TIME 7            -- 过期后 7 天宽限
  PASSWORD_VERIFY_FUNCTION ora12c_strong_verify_function;

7.2 分配 Profile

ALTER USER scott PROFILE app_profile;

7.3 启用资源限制

ALTER SYSTEM SET resource_limit=TRUE SCOPE=BOTH;

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


8. 安全最佳实践

8.1 用户管理

  • 最小权限原则:仅授必要权限
  • 不用 SYS/SYSTEM 做日常:创建管理员
  • 密码强度要求:复杂密码
  • 定期修改密码:3-6 个月
  • 锁定默认账户:SCOTT、HR 等

8.2 角色管理

  • 业务用自定义角色:精细控制
  • 避免 RESOURCE 角色:包含 UNLIMITED TABLESPACE
  • 审计角色授予:DBA_ROLE_PRIVS
  • 使用 Password Protected Role:敏感操作

8.3 权限审计

-- 审计权限授予
AUDIT GRANT ANY PRIVILEGE BY ACCESS;
AUDIT GRANT ANY OBJECT PRIVILEGE BY ACCESS;
AUDIT GRANT ANY ROLE BY ACCESS;

-- 查看审计
SELECT * FROM dba_audit_trail 
WHERE action_name LIKE '%GRANT%'
ORDER BY timestamp DESC;

9. 常见坑与排错

9.1 ORA-01045: 缺少 CREATE SESSION

现象:用户无法登录。

修复

GRANT CREATE SESSION TO scott;

9.2 ORA-01950: 表空间无配额

现象:用户无法创建对象。

修复

ALTER USER scott QUOTA UNLIMITED ON users;

9.3 ORA-01031: 权限不足

现象:执行 DDL 失败。

修复

-- 检查权限
SELECT * FROM dba_sys_privs WHERE grantee='SCOTT';
SELECT * FROM dba_role_privs WHERE grantee='SCOTT';

-- 授予权限
GRANT CREATE TABLE TO scott;

9.4 角色未启用

现象:用户有角色但权限不可用。

修复

-- 检查默认角色
SELECT * FROM dba_role_privs WHERE grantee='SCOTT' AND default_role='YES';

-- 设置默认角色
ALTER USER scott DEFAULT ROLE app_role;

9.5 PDB 用户看不到 CDB 用户

原因:Common User 与 Local User 区分。

修复

-- 在 CDB 根查看所有用户
SELECT username, common FROM cdb_users;

-- 在 PDB 查看 PDB 用户
ALTER SESSION SET CONTAINER = salespdb;
SELECT username FROM dba_users;

10. 最佳实践

  1. 最小权限原则:仅授必要权限
  2. 用角色管理权限:简化维护
  3. 创建管理员用户:不用 SYS 做日常
  4. 设置 Profile:限制资源
  5. 密码复杂度:使用 VERIFY_FUNCTION
  6. 定期审计:DBA_PRIVS / DBA_ROLES
  7. 多租户分级管理:Common / Local
  8. 锁定默认账户:SCOTT、HR
  9. 审计特权操作:SYSDBA 操作
  10. 使用统一审计(12c+):更精细

11. 参考资料

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

[2] Oracle Database Administrator’s Guide 19c, “Administering User Accounts” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/administering-user-accounts-security.html