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 tiger
  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 new_pwd;

-- 修改默认表空间
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 模式对象

类型 示例
TABLE employees, departments
INDEX idx_emp_name
VIEW emp_view
SEQUENCE emp_seq
SYNONYM emp_syn
PROCEDURE update_salary
FUNCTION get_total
PACKAGE employee_pkg
TRIGGER emp_trigger
TYPE employee_type
MATERIALIZED VIEW emp_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 admin_pwd;

-- 授予权限给角色
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 pwd
  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 pwd
  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