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 | 删除数据库 |
| SYSDBA | SYSDBA 特权 |
| SYSOPER | SYSOPER 特权 |
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 对象权限类型
| 对象 | 可用权限 |
|---|---|
| TABLE | SELECT, INSERT, UPDATE, DELETE, ALTER, INDEX, REFERENCES, ON COMMIT REFRESH, QUERY REWRITE, DEBUG, FLASHBACK |
| VIEW | SELECT, INSERT, UPDATE, DELETE, DEBUG, FLASHBACK |
| PROCEDURE/FUNCTION/PACKAGE | EXECUTE, DEBUG |
| SEQUENCE | SELECT, ALTER |
| TYPE | EXECUTE, DEBUG, UNDER |
| DIRECTORY | READ, WRITE |
| MATERIALIZED VIEW | SELECT, 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. 最佳实践
- 最小权限原则:仅授必要权限
- 避免 ANY 权限:用视图代替
- 慎用 PUBLIC:仅授予只读字典
- 使用角色:简化权限管理
- 不用 WITH ADMIN OPTION:除非必要
- 定期审计权限:DBA_PRIVS
- PL/SQL 中直接授权:不依赖角色
- 撤销危险包的 PUBLIC 权限:UTL_FILE/UTL_HTTP
- 使用统一审计(12c+)
- 多租户分级授权: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