Oracle 系统权限与对象权限详解

Oracle 系统权限与对象权限详解

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


1. 概述

Oracle 权限分为系统权限对象权限两类[1]:

类型作用示例
系统权限执行特定操作的权利CREATE TABLE
对象权限操作特定对象的权利SELECT ON emp

2. 系统权限

2.1 常用系统权限

会话与连接

权限说明
CREATE SESSION登录数据库
RESTRICTED SESSION限制模式登录
ALTER SESSION修改会话参数
DEBUG CONNECT SESSION调试会话

用户与安全

权限说明
CREATE USER创建用户
ALTER USER修改用户
DROP USER删除用户
BECOME USER切换用户身份
GRANT ANY PRIVILEGE授予任何系统权限
GRANT ANY ROLE授予任何角色

权限说明
CREATE TABLE创建表
CREATE ANY TABLE在任何模式创建表
ALTER ANY TABLE修改任何表
DROP ANY TABLE删除任何表
SELECT ANY TABLE查询任何表
INSERT ANY TABLE插入任何表
UPDATE ANY TABLE更新任何表
DELETE ANY TABLE删除任何表数据
LOCK ANY TABLE锁定任何表
COMMENT ANY TABLE注释任何表

索引

权限说明
CREATE ANY INDEX创建任何索引
ALTER ANY INDEX修改任何索引
DROP ANY INDEX删除任何索引

视图

权限说明
CREATE VIEW创建视图
CREATE ANY VIEW创建任何视图
DROP ANY VIEW删除任何视图

过程/函数/包

权限说明
CREATE PROCEDURE创建过程
CREATE ANY PROCEDURE创建任何过程
ALTER ANY PROCEDURE修改任何过程
DROP ANY PROCEDURE删除任何过程
EXECUTE ANY PROCEDURE执行任何过程

序列

权限说明
CREATE SEQUENCE创建序列
CREATE ANY SEQUENCE创建任何序列
ALTER ANY SEQUENCE修改任何序列
DROP ANY SEQUENCE删除任何序列
SELECT ANY SEQUENCE查询任何序列

表空间

权限说明
CREATE TABLESPACE创建表空间
ALTER TABLESPACE修改表空间
DROP TABLESPACE删除表空间
UNLIMITED TABLESPACE任何表空间无限配额
MANAGE TABLESPACE管理表空间

数据库管理

权限说明
ALTER DATABASE修改数据库
ALTER SYSTEM修改系统
CREATE DATABASE创建数据库
DROP DATABASE删除数据库
SYSDBASYSDBA 特权
SYSOPERSYSOPER 特权

2.2 ANY 关键字

ANY 表示任何模式

-- 仅在自己模式创建表
GRANT CREATE TABLE TO scott;

-- 在任何模式创建表
GRANT CREATE ANY TABLE TO admin;
-- admin 可创建 scott.tab1, hr.tab2 等

2.3 授予系统权限

-- 基本授予
GRANT CREATE SESSION TO scott;
GRANT CREATE TABLE TO scott;

-- WITH ADMIN OPTION:可转授
GRANT CREATE TABLE TO admin WITH ADMIN OPTION;

-- 多个权限
GRANT 
  CREATE SESSION, 
  CREATE TABLE, 
  CREATE VIEW, 
  CREATE PROCEDURE
TO developer_role;

2.4 撤销系统权限

REVOKE CREATE TABLE FROM scott;
REVOKE CREATE ANY TABLE FROM admin;

2.5 查看系统权限

-- 用户拥有的系统权限
SELECT * FROM user_sys_privs;

-- 所有用户的系统权限
SELECT * FROM dba_sys_privs WHERE grantee='SCOTT';

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

-- 当前会话启用的权限
SELECT * FROM session_privs;

3. 对象权限

3.1 对象权限类型

对象可用权限
TABLESELECT, INSERT, UPDATE, DELETE, ALTER, INDEX, REFERENCES, ON COMMIT REFRESH, QUERY REWRITE, DEBUG, FLASHBACK
VIEWSELECT, INSERT, UPDATE, DELETE, DEBUG, FLASHBACK
PROCEDURE/FUNCTION/PACKAGEEXECUTE, DEBUG
SEQUENCESELECT, ALTER
TYPEEXECUTE, DEBUG, UNDER
DIRECTORYREAD, WRITE
MATERIALIZED VIEWSELECT, ON COMMIT REFRESH, ALTER, QUERY REWRITE
SYNONYM同 TABLE/VIEW

3.2 授予对象权限

-- 表权限
GRANT SELECT ON scott.employees TO hr;
GRANT INSERT, UPDATE ON scott.employees TO hr;
GRANT DELETE ON scott.employees TO hr;
GRANT ALL ON scott.employees TO admin;

-- 列级权限(仅 INSERT/UPDATE/REFERENCES)
GRANT UPDATE (salary, dept_id) ON scott.employees TO hr;
GRANT INSERT (id, name) ON scott.employees TO hr;

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

-- 过程权限
GRANT EXECUTE ON scott.update_salary TO hr;

-- 序列权限
GRANT SELECT ON scott.emp_seq TO hr;

-- 类型权限
GRANT EXECUTE ON scott.employee_type TO hr;

-- 目录权限
GRANT READ, WRITE ON DIRECTORY data_dir TO etl_user;

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

3.3 撤销对象权限

REVOKE SELECT ON scott.employees FROM hr;
REVOKE INSERT, UPDATE ON scott.employees FROM hr;
REVOKE ALL ON scott.employees FROM admin;

3.4 查看对象权限

-- 表权限
SELECT * FROM user_tab_privs;
SELECT * FROM dba_tab_privs WHERE grantee='SCOTT';

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

-- 我授出的权限
SELECT * FROM user_tab_privs_made;
SELECT * FROM user_tab_privs_recd;

3.5 WITH GRANT OPTION 的级联特性

SYS → GRANT SELECT ON emp TO A WITH GRANT OPTION
A   → GRANT SELECT ON emp TO B

SYS 撤销 A 的 SELECT:
- A 失去权限
- B 也失去权限(级联撤销)

对比 WITH ADMIN OPTION

SYS → GRANT CREATE TABLE TO A WITH ADMIN OPTION
A   → GRANT CREATE TABLE TO B

SYS 撤销 A 的 CREATE TABLE:
- A 失去权限
- B 保留权限(不级联)

4. 权限传递图

系统权限(WITH ADMIN OPTION):
SYSDBA → 授予 CREATE TABLE TO A WITH ADMIN OPTION
A     → 授予 CREATE TABLE TO B
A     → 授予 CREATE TABLE TO C
A 撤销:B、C 仍保留权限

对象权限(WITH GRANT OPTION):
SCOTT → 授予 SELECT ON emp TO A WITH GRANT OPTION
A     → 授予 SELECT ON emp TO B
A     → 授予 SELECT ON emp TO C
SCOTT 撤销 A:B、C 也被撤销(级联)

5. PUBLIC 角色

PUBLIC 是一个特殊的角色,所有用户都属于[2]:

-- 授予 PUBLIC
GRANT SELECT ON scott.lookup TO PUBLIC;

-- 所有用户都可查询
SELECT * FROM scott.lookup;

风险:慎用 PUBLIC 授权

-- 查看 PUBLIC 的权限
SELECT * FROM dba_tab_privs WHERE grantee='PUBLIC';
SELECT * FROM dba_sys_privs WHERE grantee='PUBLIC';

-- 撤销 PUBLIC 权限
REVOKE EXECUTE ON UTL_FILE FROM PUBLIC;
REVOKE EXECUTE ON UTL_HTTP FROM PUBLIC;

6. 数据字典视图

6.1 系统权限视图

-- 用户拥有的系统权限
USER_SYS_PRIVS

-- 所有用户系统权限(需 DBA)
DBA_SYS_PRIVS

-- 角色拥有的系统权限
ROLE_SYS_PRIVS

-- 当前会话启用的权限
SESSION_PRIVS

6.2 对象权限视图

-- 用户拥有的对象权限
USER_TAB_PRIVS

-- 所有对象权限
DBA_TAB_PRIVS

-- 列级权限
USER_COL_PRIVS
DBA_COL_PRIVS

-- 我授出的权限
USER_TAB_PRIVS_MADE

-- 我收到的权限
USER_TAB_PRIVS_RECD

6.3 角色视图

-- 用户拥有的角色
USER_ROLE_PRIVS
DBA_ROLE_PRIVS

-- 角色拥有的角色(嵌套)
ROLE_ROLE_PRIVS

-- 角色拥有的系统权限
ROLE_SYS_PRIVS

-- 角色拥有的对象权限
ROLE_TAB_PRIVS

-- 当前会话启用的角色
SESSION_ROLES

7. 权限审计

7.1 启用审计

-- 启用审计
ALTER SYSTEM SET audit_trail='DB,EXTENDED' SCOPE=SPFILE;
-- 重启生效

-- 审计权限使用
AUDIT SELECT TABLE BY scott BY ACCESS;
AUDIT INSERT TABLE BY scott BY ACCESS;

-- 审计特权操作
AUDIT SYSDBA BY ACCESS;
AUDIT CREATE USER BY ACCESS;
AUDIT GRANT ANY PRIVILEGE BY ACCESS;

7.2 查看审计

-- 传统审计
SELECT 
  timestamp,
  username,
  action_name,
  obj_name,
  returncode
FROM dba_audit_trail
WHERE timestamp > SYSDATE-1
ORDER BY timestamp DESC;

-- 统一审计(12c+)
SELECT 
  event_timestamp,
  dbusername,
  action_name,
  object_name
FROM unified_audit_trail
WHERE event_timestamp > SYSDATE-1
ORDER BY event_timestamp DESC;

详细内容见:Oracle Audit 与 Unified Audit Trail


8. 常见坑与排错

8.1 ORA-01031: insufficient privileges

排查

-- 1. 检查系统权限
SELECT * FROM session_privs;

-- 2. 检查角色
SELECT * FROM session_roles;

-- 3. 检查对象权限
SELECT * FROM user_tab_privs WHERE table_name='EMPLOYEES';

8.2 WITH GRANT OPTION 导致权限丢失

现象:撤销中间用户权限,被授者也丢失权限。

修复:直接授予最终用户权限,避免级联。

8.3 ANY 权限过宽

风险

GRANT SELECT ANY TABLE TO app_user;
-- app_user 可查询 SYS 表,安全风险

修复

  • 仅授予必要权限
  • 使用视图代替 ANY
  • 使用 SELECT_CATALOG_ROLE 仅查字典

8.4 PUBLIC 权限过多

风险:UTL_FILE、UTL_HTTP 等危险包的执行权限。

修复

-- 撤销危险权限
REVOKE EXECUTE ON UTL_FILE FROM PUBLIC;
REVOKE EXECUTE ON UTL_HTTP FROM PUBLIC;
REVOKE EXECUTE ON UTL_TCP FROM PUBLIC;

-- 仅授予必要用户
GRANT EXECUTE ON UTL_FILE TO etl_user;

8.5 角色不能用于 PL/SQL definer’s rights

现象:在存储过程中角色无效。

原因:definer’s rights 模式下,仅直接授予的权限有效,角色不生效。

修复

-- 1. 直接授予权限(推荐)
GRANT SELECT ON scott.emp TO procedure_owner;

-- 2. 或使用 invoker's rights
CREATE OR REPLACE PROCEDURE proc_name AUTHID CURRENT_USER AS
...

9. 最佳实践

  1. 最小权限原则:仅授必要权限
  2. 避免 ANY 权限:用视图代替
  3. 慎用 PUBLIC:仅授予只读字典
  4. 使用角色:简化权限管理
  5. 不用 WITH ADMIN OPTION:除非必要
  6. 定期审计权限:DBA_PRIVS
  7. PL/SQL 中直接授权:不依赖角色
  8. 撤销危险包的 PUBLIC 权限:UTL_FILE/UTL_HTTP
  9. 使用统一审计(12c+)
  10. 多租户分级授权:Common/Local

10. 参考资料

[1] Oracle Database Security Guide 19c, “System Privileges” https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/administering-privileges.html

[2] Oracle Database SQL Language Reference 19c, “GRANT” https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/GRANT.html