Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


权限管理

📄字数 16.4K
👁️阅读量 加载中...

XuguDB 中存在多种类型的数据库对象,例如表、视图、存储过程、序列值、包等。

每类对象支持一组特定的操作,例如:

  • 表对象支持的操作包括创建(CREATE)、修改(ALTER)、删除(DROP)、查询(SELECT)、插入(INSERT)、更新(UPDATE)和删除数据(DELETE)等。
  • 包对象支持的操作主要包括创建、删除及执行(EXECUTE)。

执行上述操作通常需要具备相应的权限。

对象的创建者被视为该对象的拥有者,默认拥有对该对象的所有权限。对于大多数数据库对象,初始情况下,仅对象的属主,以及具备高级权限的系统用户(如SYSDBA)和具备数据库管理员角色(如DB_ADMIN)的用户,能够对其执行任意操作。为了允许其他用户访问和使用这些对象,必须通过授权机制将相关权限显式授予目标用户或角色。

为提升权限管理的灵活性和可控性,XuguDB 按对象粒度将权限划分为以下的级别:

  • 系统级权限:控制用户执行影响某个数据库(或跨多个数据库)的系统范围操作,例如创建和删除数据库、进行备份与恢复等。这类操作通常涉及系统稳定性与数据安全,建议仅授予数据库管理员或具有等效角色的用户。
  • 数据库级权限:控制用户对某个数据库中对象的访问和管理权限,例如创建用户、创建模式等操作。
  • 模式级权限:控制用户对特定模式中对象的访问和管理权限。
  • 对象级权限:控制用户对具体数据库对象(如某一张表或视图)的访问和管理权限。

此外,为简化权限管理流程,XuguDB 支持角色管理。角色可以看作是一组权限的集合,数据库管理员可以将权限授予角色,然后将角色分配给用户,从而实现权限的统一授予与集中控制。

在 XuguDB 的权限模型中,权限存在隐式包含机制,即当用户具备某一上层权限时(如表级 SELECT 权限),可能隐式拥有对应的下层权限(如某些列的 SELECT 权限)。此外,权限还存在继承机制,该机制仅适用于角色与用户之间,相关权限会沿着角色授予链进行传递,实现权限的统一管理与复用。

通过精细的权限划分与灵活的角色管理,XuguDB 能够在保障安全性的前提下,提供对数据库资源的有效控制与协同访问能力。

一、权限划分

为提升权限管理的灵活性和可控性,XuguDB 提供了以下两种权限划分方式:

1.1 权限分级

1.1.1 系统级权限

注意

以下对象类型只支持以系统级粒度进行权限控制,后续不再说明:

  • DATABASE
  • DIR(数据库目录)

下表列出了目前支持的系统级权限:

权限名称权限说明
CREATE ANY DATABASE创建任何数据库
ALTER ANY DATABASE修改任何数据库
DROP ANY DATABASE删除任何数据库
BACKUP DATABASE备份任何数据库
BACKUP等同于BACKUP DATABASE
RESTORE DATABASE恢复任何数据库
RESTORE等同于RESTORE DATABASE
CREATE ANY DIR创建任何目录
DROP ANY DIR删除任何目录

1.1.2 数据库级权限

提示

模式(SCHEMA)本质上不是数据库对象,而是对象的容器(命名空间)。然而,在数据库级权限中,模式可以作为授权的单位,因此在这里将其视为一种可授予权限的对象。

下面的表列出了各对象类型的数据库级权限:

  • SCHEMA

    权限名称权限说明
    CREATE ANY SCHEMA创建任何模式
    ALTER ANY SCHEMA修改任何模式
    DROP ANY SCHEMA删除任何模式
  • TABLE

    权限名称权限说明
    CREATE ANY TABLE创建任何表
    ALTER ANY TABLE修改任何表
    DROP ANY TABLE删除任何表
    SELECT ANY TABLE查询任何表
    INSERT ANY TABLE插入记录到任何表
    UPDATE ANY TABLE更新任何表的记录
    DELETE ANY TABLE删除任何表的记录
    REFERENCES ANY TABLE引用任何表
    ENCRYPT ANY TABLE加密任何表
  • INDEX

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

    权限名称权限说明
    CREATE ANY VIEW创建任何视图
    ALTER ANY VIEW修改任何视图
    DROP ANY VIEW删除任何视图
    SELECT ANY VIEW查询任何视图
    INSERT ANY VIEW插入记录到任何视图
    UPDATE ANY VIEW更新任何视图的记录
    DELETE ANY VIEW删除任何视图的记录
  • TRIGGER

    权限名称权限说明
    CREATE ANY TRIGGER创建任何触发器
    ALTER ANY TRIGGER修改任何触发器
    DROP ANY TRIGGER删除任何触发器
  • PROCEDURE

    权限名称权限说明
    CREATE ANY PROCEDURE创建任何存储过程/函数
    ALTER ANY PROCEDURE修改任何存储过程/函数
    DROP ANY PROCEDURE删除任何存储过程/函数
    EXECUTE ANY PROCEDURE执行任何存储过程/函数
  • PACKAGE

    权限名称权限说明
    CREATE ANY PACKAGE创建任何包
    ALTER ANY PACKAGE修改任何包
    DROP ANY PACKAGE删除任何包
    EXECUTE ANY PACKAGE执行任何包
  • JOB

    权限名称权限说明
    CREATE ANY JOB创建任何作业
    DROP ANY JOB删除任何作业
  • SEQUENCE

    权限名称权限说明
    CREATE ANY SEQUENCE创建任何序列值
    ALTER ANY SEQUENCE修改任何序列值
    DROP ANY SEQUENCE删除任何序列值
    SELECT ANY SEQUENCE查询任何序列值
  • DATABASE LINK

    权限名称权限说明
    CREATE ANY DATABASE LINK创建任何数据库连接
    DROP ANY DATABASE LINK删除任何数据库连接
  • SYNONYM

    权限名称权限说明
    CREATE ANY SYNONYM创建任何同义词
    DROP ANY SYNONYM删除任何同义词
  • PUBLIC SYNONYM

    权限名称权限说明
    CREATE PUBLIC SYNONYM创建任何公共同义词
    DROP ANY PUBLIC SYNONYM删除任何公共同义词
  • USER

    权限名称权限说明
    CREATE ANY USER创建任何用户
    ALTER ANY USER修改任何用户
    DROP ANY USER删除任何用户
  • ROLE

    权限名称权限说明
    CREATE ANY ROLE创建任何角色
    ALTER ANY ROLE修改任何角色
    DROP ANY ROLE删除任何角色
  • OBJECT

    权限名称权限说明
    CREATE ANY OBJECT创建任何用户自定义类型
    DROP ANY OBJECT删除任何用户自定义类型
  • REPLICATION

    权限名称权限说明
    CREATE ANY REPLICATION创建任何数据复制
    DROP ANY REPLICATION删除任何数据复制

1.1.3 模式级权限

注意

以下对象类型不归属于特定的模式,或暂不支持以模式级粒度进行权限控制,因此无法通过模式级权限进行管理:

  • JOB
  • DATABASE LINK
  • PUBLIC SYNONYM
  • USER
  • ROLE
  • REPLICATION

下面的表列出了各对象类型的模式级权限:

  • TABLE

    权限名称权限说明
    CREATE TABLE在默认模式及拥有的模式下创建任何表
    CREATE ANY TABLE IN SCHEMA在指定模式下创建任何表
    ALTER ANY TABLE IN SCHEMA修改指定模式下的任何表
    DROP ANY TABLE IN SCHEMA删除指定模式下的任何表
    SELECT ANY TABLE IN SCHEMA查询指定模式下的任何表
    INSERT ANY TABLE IN SCHEMA插入记录到指定模式下的任何表
    UPDATE ANY TABLE IN SCHEMA更新指定模式下任何表的记录
    DELETE ANY TABLE IN SCHEMA删除指定模式下任何表的记录
    REFERENCES ANY TABLE IN SCHEMA引用指定模式下的任何表
    ENCRYPT ANY TABLE IN SCHEMA加密指定模式下的任何表
  • INDEX

    权限名称权限说明
    CREATE INDEX在默认模式及拥有的模式下创建任何索引
    CREATE ANY INDEX IN SCHEMA在指定模式下创建任何索引
    ALTER ANY INDEX IN SCHEMA修改指定模式下的任何索引
    DROP ANY INDEX IN SCHEMA删除指定模式下的任何索引
  • VIEW

    权限名称权限说明
    CREATE VIEW在默认模式及拥有的模式下创建任何视图
    CREATE ANY VIEW IN SCHEMA在指定模式下创建任何视图
    ALTER ANY VIEW IN SCHEMA修改指定模式下的任何视图
    DROP ANY VIEW IN SCHEMA删除指定模式下的任何视图
    SELECT ANY VIEW IN SCHEMA查询指定模式下的任何视图
    INSERT ANY VIEW IN SCHEMA插入记录到指定模式下的任何视图
    UPDATE ANY VIEW IN SCHEMA更新指定模式下任何视图的记录
    DELETE ANY VIEW IN SCHEMA删除指定模式下任何视图的记录
  • TRIGGER

    权限名称权限说明
    CREATE TRIGGER在默认模式及拥有的模式下创建任何触发器
    CREATE ANY TRIGGER IN SCHEMA在指定模式下创建任何触发器
    ALTER ANY TRIGGER IN SCHEMA修改指定模式下的任何触发器
    DROP ANY TRIGGER IN SCHEMA删除指定模式下的任何触发器
  • PROCEDURE

    权限名称权限说明
    CREATE PROCEDURE在默认模式及拥有的模式下创建任何存储过程/函数
    CREATE ANY PROCEDURE IN SCHEMA在指定模式下创建任何存储过程/函数
    ALTER ANY PROCEDURE IN SCHEMA修改指定模式下的任何存储过程/函数
    DROP ANY PROCEDURE IN SCHEMA删除指定模式下的任何存储过程/函数
    EXECUTE ANY PROCEDURE IN SCHEMA执行指定模式下的任何存储过程/函数
  • PACKAGE

    权限名称权限说明
    CREATE PACKAGE在默认模式及拥有的模式下创建任何包
    CREATE ANY PACKAGE IN SCHEMA在指定模式下创建任何包
    ALTER ANY PACKAGE IN SCHEMA修改指定模式下的任何包
    DROP ANY PACKAGE IN SCHEMA删除指定模式下的任何包
    EXECUTE ANY PACKAGE IN SCHEMA执行指定模式下的任何包
  • SEQUENCE

    权限名称权限说明
    CREATE SEQUENCE在默认模式及拥有的模式下创建任何序列值
    CREATE ANY SEQUENCE IN SCHEMA在指定模式下创建任何序列值
    ALTER ANY SEQUENCE IN SCHEMA修改指定模式下的任何序列值
    DROP ANY SEQUENCE IN SCHEMA删除指定模式下的任何序列值
    SELECT ANY SEQUENCE IN SCHEMA查询指定模式下的任何序列值
  • SYNONYM

    权限名称权限说明
    CREATE SYNONYM在默认模式及拥有的模式下创建任何同义词
    CREATE ANY SYNONYM IN SCHEMA在指定模式下创建任何同义词
    DROP ANY SYNONYM IN SCHEMA删除指定模式下的任何同义词
  • OBJECT

    权限名称权限说明
    CREATE OBJECT在默认模式及拥有的模式下创建任何用户自定义类型
    CREATE ANY OBJECT IN SCHEMA在指定模式下创建任何用户自定义类型
    DROP ANY OBJECT IN SCHEMA删除指定模式下的任何用户自定义类型

1.1.4 对象级权限

控制用户对具体数据库对象(如某一张表或视图)的访问和管理权限。

注意

以下对象类型暂不支持以对象级粒度进行权限管理:

  • JOB
  • DATABASE LINK
  • SYNONYM
  • PUBLIC SYNONYM
  • USER
  • ROLE
  • REPLICATION

下面的表列出了各对象类型的对象级权限:

  • TABLE

    权限名称权限说明
    ALL ON TABLE对指定表执行任何操作
    ALL PRIVILEGES ON TABLE对指定表执行任何操作
    ALTER ON TABLE修改指定表
    DROP ON TABLE删除指定表
    SELECT ON TABLE查询指定表
    INSERT ON TABLE插入记录到指定表
    UPDATE ON TABLE更新指定表的记录
    DELETE ON TABLE删除指定表的记录
    REFERENCES ON TABLE引用指定表
    TRIGGER ON TABLE在指定表上创建触发器
    INDEX ON TABLE在指定表上创建索引
  • VIEW

    权限名称权限说明
    ALL ON VIEW对指定视图执行任何操作
    ALL PRIVILEGES ON VIEW对指定视图执行任何操作
    ALTER ON VIEW修改指定视图
    DROP ON VIEW删除指定视图
    SELECT ON VIEW查询指定视图
    INSERT ON VIEW插入记录到指定视图
    UPDATE ON VIEW更新指定视图的记录
    DELETE ON VIEW删除指定视图的记录
  • PROCEDURE

    权限名称权限说明
    ALL ON PROCEDURE对指定存储过程/函数执行任何操作
    ALL PRIVILEGES ON PROCEDURE对指定存储过程/函数执行任何操作
    ALTER ON PROCEDURE修改指定存储过程/函数
    DROP ON PROCEDURE删除指定存储过程/函数
    EXECUTE ON PROCEDURE执行指定存储过程/函数
  • SEQUENCE

    权限名称权限说明
    ALL ON SEQUENCE对指定序列值执行任何操作
    ALL PRIVILEGES ON SEQUENCE对指定序列值执行任何操作
    ALTER ON SEQUENCE修改指定序列值
    DROP ON SEQUENCE删除指定序列值
    SELECT ON SEQUENCE查询指定序列值

注意

  • 只有 TABLEVIEWPROCEDURESEQUENCE 支持带有对象类型的权限名称。
  • 所有对象类型都支持不带对象类型的权限名称,如下所示(省略 TABLEVIEWPROCEDURESEQUENCE)。
  • INDEX

    权限名称权限说明
    ALL ON对指定索引执行任何操作
    ALL PRIVILEGES ON对指定索引执行任何操作
    ALTER ON修改指定索引
    DROP ON删除指定索引
  • TRIGGER

    权限名称权限说明
    ALL ON对指定触发器执行任何操作
    ALL PRIVILEGES ON对指定触发器执行任何操作
    ALTER ON修改指定触发器
    DROP ON删除指定触发器
  • PACKAGE

    权限名称权限说明
    ALL ON对指定包执行任何操作
    ALL PRIVILEGES ON对指定包执行任何操作
    ALTER ON修改指定包
    DROP ON删除指定包
    EXECUTE ON执行指定包
  • OBJECT

    权限名称权限说明
    ALL ON对指定用户自定义类型执行任何操作
    ALL PRIVILEGES ON对指定用户自定义类型执行任何操作
    DROP ON删除指定用户自定义类型
  • TABLE COLUMN

    权限名称权限说明
    SELECT (column_list) ON TABLE查询指定表的指定列(带 TABLE 的形式)
    SELECT (column_list) ON查询指定表的指定列
    UPDATE (column_list) ON TABLE更新指定表的指定列(带 TABLE 的形式)
    UPDATE (column_list) ON更新指定表的指定列
  • VIEW COLUMN

    权限名称权限说明
    SELECT (column_list) ON查询指定视图的指定列
    UPDATE (column_list) ON更新指定视图的指定列

1.2 管理员权限

每个数据库在初始化时,都会自动创建一些内置角色,并为这些角色预先授予相应的系统管理权限。例如:

  • 系统会将 DBA 权限授予内置角色 DB_ADMIN,用于数据库的整体管理和维护(除安全和审计外的所有权限)。
  • AUDITOR 权限授予内置角色 DB_AUDIT_OPER,用于管理和查询数据库审计信息。
  • SSO 权限授予内置角色 DB_POLICY_OPER,用于安全策略的配置和管理。

在执行不同职责相关的操作时(例如访问安全或审计相关的表和视图等),系统会检查用户是否通过内置角色继承了,或被显式授予了相应的管理权限。只有具备所需权限的用户才能执行这些受控操作,从而实现分权管理和安全隔离。

下表列出了目前支持显式授予的管理员权限:

权限名称权限说明
DBA数据库管理员
AUDITOR数据库审计员
SSO数据库安全员

二、权限授予和撤销

在数据库中,除以下情况外,其他所有权限都需要通过显式的权限授予语句进行授权:

  • 对象属主自动拥有对该对象的完全控制权限。
  • 系统自动创建的角色通常会预先被授予相关权限集。
  • 隐式包含和从角色继承的权限。

使用权限授予语句授予的权限,可以通过权限撤销语句撤销。权限撤销语句仅能撤销用户或角色已获得的、并且是通过权限授予语句授予的权限。

2.1 系统级权限

语法格式

参数说明

  • sys_privileges:表示一个或多个系统级权限名称
  • grantee_list:表示被授予或撤销权限的角色或用户。如果针对某个角色进行权限授予或撤销,该角色下的所有用户将自动获得或失去相应权限。

示例

  • 授予用户删除任何数据库的权限,然后撤销该权限。

    sql
    SQL> CREATE USER usr_test IDENTIFIED BY '123QWE$$&';
    SQL> GRANT CREATE ANY DATABASE TO usr_test;
    SQL> REVOKE CREATE ANY DATABASE FROM usr_test;

2.2 数据库级权限

语法格式

参数说明

  • db_privileges:表示一个或多个数据库级权限名称
  • obj_operation:表示对象操作类型。
  • obj_type:表示对象类型。

注意

对象操作类型必须与对象类型相匹配。例如,对于 PROCEDURE 类型的对象,只能授予 CREATE ANYALTER ANYDROP ANYEXECUTE ANY 权限。

示例

  • 授予用户对当前数据库所有包的操作权限,然后撤销该权限。

    sql
    SQL> GRANT CREATE ANY PACKAGE,ALTER ANY PACKAGE,DROP ANY PACKAGE,EXECUTE ANY PACKAGE TO usr_test;
    SQL> REVOKE CREATE ANY PACKAGE,ALTER ANY PACKAGE,DROP ANY PACKAGE,EXECUTE ANY PACKAGE FROM usr_test;

2.3 模式级权限

语法格式

参数说明

  • sche_privileges:表示一个或多个模式级权限名称。使用 sche_privileges_2 这种形式时,目标模式是用户的默认模式及其拥有的模式。
  • sche_name:表示要授予或撤销权限的目标模式名称。
  • obj_operation:表示对象操作类型。
  • obj_type:表示对象类型。

注意

对象操作类型必须与对象类型相匹配。例如,对于 PROCEDURE 类型的对象,只能授予 CREATE ANYALTER ANYDROP ANYEXECUTE ANY 权限。

示例

  • 授予角色在指定模式下的创表权限,然后撤销该权限。

    sql
    SQL> CREATE ROLE role_test;
    SQL> GRANT CREATE ANY TABLE IN SCHEMA SYSDBA TO role_test;
    SQL> REVOKE CREATE ANY TABLE IN SCHEMA SYSDBA FROM role_test;
  • 授予用户在自身默认模式及拥有的模式下的创表权限,然后撤销该权限。

    sql
    SQL> GRANT CREATE TABLE TO usr_test;
    SQL> REVOKE CREATE TABLE FROM usr_test;

2.4 对象级权限

语法格式

参数说明

  • obj_privileges:表示一个或多个对象级权限名称privileges 形式表示非列类型对象的权限名称,col_privileges 形式表示列类型对象的权限名称。
  • ALL PRIVILEGESALL:表示对象的所有操作权限。
  • obj_operation:表示非列对象操作类型。
  • col_obj_operation:表示列对象操作类型。
  • obj_name:表示非列对象名称,支持的对象类型见对象级权限
  • col_obj_name:表示列对象名称。
  • WITH GRANT OPTION:指定该参数时,表示此权限可以转授,即允许被授予方将其再授予其他用户或角色。
  • GRANT OPTION FOR:指定该参数时,表示仅撤销此权限的转授权,用户或角色仍拥有该权限;不指定该参数时,表示撤销用户或角色的该权限以及转授权。
  • alter_behavior
    • 省略参数时:等同于 RESTRICT
    • RESTRICT:不撤销转授的权限。
    • CASCADE:撤销转授的权限。
    • CASCADE CONSTRAINTS:等同于 CASCADE

注意

  • 对象操作类型必须与对象类型相匹配。例如,对于 PROCEDURE 类型的对象,只能授予 ALTERDROPEXECUTE 权限(ALL PRIVILEGESALL 表示这三种权限的集合)。

示例

  • 授予用户对特定表对象的操作权限,然后撤销该权限。

    sql
    SQL> CREATE TABLE tab_test (a INT,b VARCHAR);
    SQL> GRANT ALL PRIVILEGES ON TABLE tab_test TO usr_test;
    SQL> REVOKE ALL PRIVILEGES ON TABLE tab_test FROM usr_test;
  • 授予用户对特定表某列的操作权限,然后撤销该权限。

    sql
    SQL> GRANT SELECT,UPDATE (a) ON tab_test TO usr_test;
    SQL> REVOKE SELECT,UPDATE (a) ON tab_test FROM usr_test;
  • 授予用户对特定表的查询权限以及权限的转授权,然后转授权限给角色,接着撤销转授权,最后撤销用户和角色的权限。

    sql
    SQL> GRANT SELECT ON tab_test TO usr_test WITH GRANT OPTION;
    -- 用户 usr_test 转授权限给角色 role_test
    SQL> SET SESSION AUTHORIZATION usr_test;
    SQL> GRANT SELECT ON sysdba.tab_test TO role_test;
    SQL> SET SESSION AUTHORIZATION sysdba;
    -- 撤销用户 usr_test 的转授权
    SQL> REVOKE GRANT OPTION FOR SELECT,UPDATE (a) ON tab_test FROM usr_test;
    -- 撤销用户 usr_test 的权限以及转授给角色 role_test 的权限
    SQL> REVOKE SELECT,UPDATE (a) ON tab_test FROM usr_test CASCADE;

2.5 管理员权限

语法格式

参数说明

注意

用户和角色不能同时拥有管理员、审计员及安全员权限中的两项及以上。

示例

  • 授予用户系统管理员权限,然后撤销该权限。

    sql
    SQL> GRANT DBA TO usr_test;
    SQL> REVOKE DBA FROM usr_test;

三、权限查询

用户和角色拥有的权限的来源不同,查询方式也有所不同,可分为以下两种方式:

  • 方式一:对象属主的完全控制权限
    • PACKAGE 等类型的对象,查询系统表 SYS_OBJECTS,获取用户所拥有的对象。
    • JOB 等类型的对象,可通过查询与对象类型对应的系统表(如 SYS_JOBS),获取用户拥有的对象。
    • USERROLE 等不归属于任何用户的对象,参考方式二。
  • 方式二:通过授予或继承获得的其他权限
    • 通过权限授予显式获得的权限,查询系统表 SYS_ACLS
    • 通过角色授予继承获得的权限,先查询系统表 SYS_ROLE_MEMBERS 获取用户所属角色,再查询 SYS_ACLS 获取角色的权限。
    • 通过隐式包含获得的表列和视图列的权限,可通过查询 SYS_ACLSSYS_ROLE_MEMBERS,获取所属表或视图的权限后再进行判断。

本章节仅说明权限查询的方式二。

3.1 查询系统表

系统表 SYS_ACLS 记录了数据库中所有用户和角色的访问控制信息,包括各类权限的授予情况。通过查询该表,可以了解用户和角色的权限配置信息。

字段名称字段类型字段说明
DB_IDINTEGER库 ID
GRANTOR_IDINTEGER授权者 ID
GRANTEE_IDINTEGER被授权者 ID
OBJECT_IDINTEGER授权对象 ID
OBJECT_TYPEINTEGER授权对象类型
AUTHORITYBIGINT权限值
REGRANTBIGINT可转授的权限值
ORG_GRANTOR_IDINTEGER权限的原始拥有者 ID
IS_SYSBOOLEAN是否系统内建(暂未使用)

注意

AUTHORITY 字段以十进制数值形式存储和显示,由表 3.3 权限标志中定义的各权限标志按位或组合而成。

系统表 SYS_ROLE_MEMBERS 记录了数据库中角色的成员信息。通过查询该表,可以了解用户所属的角色信息。

字段名称字段类型字段说明
DB_IDINTEGER库 ID
USER_IDINTEGER用户 ID
ROLE_IDINTEGER角色 ID

查询通过权限授予显式获得的权限

  1. 查询 SYS_USERS 获取用户或角色的 ID
  2. 查询 SYS_ACLS 获取 GRANTEE_IDID 匹配的记录。

查询通过角色授予继承获得的权限

  1. 查询 SYS_USERS 获取用户的 ID
  2. 查询 SYS_ROLE_MEMBERS 获取用户所属的所有角色的 ID
  3. 查询 SYS_ACLS 获取 GRANTEE_ID 和任一角色 ID 匹配的记录。

3.2 权限记录解析

对系统表 SYS_ACLS 中的每条权限配置记录,可以根据 OBJECT_IDOBJECT_TYPEAUTHORITY 字段解析出用户或角色所拥有的具体权限。详情参考解析流程解析示例

3.2.1 解析流程

权限解析流程图
图 3.1 权限解析流程图

以下是图 3.1 权限解析流程图需要参考的表,表 3.3 权限标志表 3.4 对象类型

表 3.3 权限标志

  • 系统级权限、数据库级权限、模式级权限、管理员权限

    权限标志权限值权限名称
    ACL_READ_ANY0x1SELECT ANY
    ACL_UPDATE_ANY0x2UPDATE ANY
    ACL_INSERT_ANY0x4INSERT ANY
    ACL_DELETE_ANY0x8DELETE ANY
    ACL_REF_ANY0x10REFERENCES ANY
    ACL_EXECUTE_ANY0x20EXECUTE ANY
    ACL_INDEX_ANY0x40保留权限标志
    ACL_CREATE0x80CREATE
    ACL_CRE_ANY0x100CREATE ANY
    ACL_ALT_ANY0x200ALTER ANY
    ACL_DROP_ANY0x400DROP ANY
    ACL_BACKUP_ANY0x800BACKUP
    ACL_RESTORE_ANY0x1000RESTORE
    ACL_VACUUM_ANY0x2000保留权限标志
    ACL_REPLICATION_ANY0x4000保留权限标志
    ACL_REFRESH_ANY0x8000保留权限标志
    ACL_GRANT_ANY0x10000特殊权限标志,表示可授权
    ACL_ENCRYPT_ANY0x20000ENCRYPT ANY
    ACL_CRE_JOB0x40000保留权限标志
    ACL_TRACE0x80000保留权限标志
    ACL_DBA0x7FFFFFDBA
    ACL_AUDITOR0x10000000AUDITOR
    ACL_AUDIT_ADMIN0x30000000特殊权限标志,表示审计管理权
    ACL_SSO0x40000000SSO
    ACL_SS_ADMIN0xC0000000特殊权限标志,表示安全管理权
  • 对象级权限

    权限标志权限值权限名称
    ACL_READ0x1SELECT
    ACL_UPDATE0x2UPDATE
    ACL_INSERT0x4INSERT
    ACL_DELETE0x8DELETE
    ACL_REF0x10REFERENCES
    ACL_EXECUTE0x20EXECUTE ANY
    ACL_INDEX0x40INDEX
    ACL_ALTER0x80ALTER
    ACL_DROP0x100DROP
    ACL_TRIG0x200TRIGGER
    ACL_VACUUM0x400保留权限标志
    ACL_TAB_ALL0x7DFALL
    ACL_PROC_ALL0x1A0ALL
    ACL_VIEW_ALL0x18FALL
    ACL_PACK_ALL0x1A0ALL
    ACL_SEQ_ALL0x183ALL
    ACL_UDT_ALL0x1A0ALL

注意

权限标志说明

  • 解析 AUTHORITY 时,忽略所有的保留权限标志。
  • 仅系统内建用户和角色,以及被授予系统内建角色的用户,其权限配置记录的 AUTHORITY 字段才可能包含特殊权限标志。

表 3.4 对象类型

对象类型值对象类型名
1DATABASE
4SCHEMA
5TABLE
6TABLE COLUMN
7PROCEDURE
8SEQUENCE
9VIEW
10INDEX
11TRIGGER
12DATABASE LINK
13REPLICATION
15SYNONYM
16USER
17ROLE
18PACKAGE
19OBJECT
20DIR
22JOB
28VIEW COLUMN
35PUBLIC SYNONYM

3.2.2 解析示例

提示

解析出 AUTHORITY 对应的权限标志,以及 OBJECT_IDOBJECT_TYPE 对应的对象后,组合权限名称和对象类型(和对象名称)就得到了实际的权限配置。

  • 系统内建角色的权限配置:

    sql
    -- 系统首次启动后执行查询(GRANTEE_ID 为 5,6,7,8,9 分别对应 DB_ADMIN、DB_POLICY_ADMIN、DB_POLICY_OPER、DB_AUDIT_ADMIN、DB_AUDIT_OPER)
    SQL> SELECT grantee_id,object_id,object_type,authority,regrant,org_grantor_id FROM SYS_ACLS WHERE db_id=1 AND grantor_id=-1;
    +------------+-----------+-------------+------------+---------+----------------+
    | GRANTEE_ID | OBJECT_ID | OBJECT_TYPE | AUTHORITY  | REGRANT | ORG_GRANTOR_ID |
    +------------+-----------+-------------+------------+---------+----------------+
    | 5          | 0         | 0           | 8388607    | 0       | -1             |
    | 6          | 0         | 0           | 3221225472 | 0       | -1             |
    | 8          | 0         | 0           | 805306368  | 0       | -1             |
    | 7          | 0         | 0           | 1073741824 | 0       | -1             |
    | 9          | 0         | 0           | 268435456  | 0       | -1             |
    +------------+-----------+-------------+------------+---------+----------------+
    -- AUTHORITY    十六进制形式    权限标志(非对象级)
    -- 8388607      0x7FFFFF       ACL_DBA
    -- 3221225472   0xC0000000     ACL_SS_ADMIN
    -- 805306368    0x30000000     ACL_AUDIT_ADMIN
    -- 1073741824   0x40000000     ACL_SSO
    -- 268435456    0x10000000     ACL_AUDITOR
  • 系统级权限:

    sql
    SQL> CREATE USER usr_test_1 IDENTIFIED BY '123QWE$$&';
    SQL> GRANT CREATE ANY DATABASE,BACKUP,CREATE ANY DIR TO usr_test_1;
    SQL> SELECT
             grantor_id,
             grantee_id,
             object_id,
             object_type,
             authority
         FROM
             SYS_ACLS sa
         JOIN SYS_USERS su ON
             sa.grantee_id = su.user_id
             AND sa.db_id = su.db_id
         WHERE
             user_name = 'USR_TEST_1';
    +------------+------------+-----------+-------------+-----------+
    | GRANTOR_ID | GRANTEE_ID | OBJECT_ID | OBJECT_TYPE | AUTHORITY |
    +------------+------------+-----------+-------------+-----------+
    | 1          | 101        | 0         | 1           | 256       |
    | 1          | 101        | 0         | 0           | 2048      |
    | 1          | 101        | 0         | 20          | 256       |
    +------------+------------+-----------+-------------+-----------+
    -- AUTHORITY    十六进制形式    权限标志(非对象级)            OBJECT_TYPE    OBJECT_NAME
    -- 256          0x100          ACL_CRE_ANY                   1              DATABASE
    -- 2048         0x800          BACKUP(BACKUP DATABASE)       0              NONE
    -- 256          0x100          ACL_CRE_ANY                   20             DIR
  • 数据库级权限:

    sql
    SQL> CREATE USER usr_test_2 IDENTIFIED BY '123QWE$$&';
    SQL> GRANT CREATE ANY SCHEMA,DROP ANY SCHEMA,SELECT ANY TABLE TO usr_test_2;
    SQL> SELECT
             grantor_id,
             grantee_id,
             object_id,
             object_type,
             authority
         FROM
             SYS_ACLS sa
         JOIN SYS_USERS su ON
             sa.grantee_id = su.user_id
             AND sa.db_id = su.db_id
         WHERE
             usr_name = 'USR_TEST_2';
    +------------+------------+-----------+-------------+-----------+
    | GRANTOR_ID | GRANTEE_ID | OBJECT_ID | OBJECT_TYPE | AUTHORITY |
    +------------+------------+-----------+-------------+-----------+
    | 1          | 101        | 0         | 4           | 1280      |
    | 1          | 101        | 0         | 5           | 1         |
    +------------+------------+-----------+-------------+-----------+
    -- AUTHORITY    十六进制形式    权限标志(非对象级)            OBJECT_TYPE    OBJECT_NAME
    -- 1280         0x500          ACL_CRE_ANY | ACL_DROP_ANY    4              SCHEMA
    -- 1            0x1            ACL_READ_ANY                  5              TABLE
  • 模式级权限:

    sql
    SQL> CREATE USER usr_test_3 IDENTIFIED BY '123QWE$$&';
    SQL> GRANT CREATE ANY TABLE,SELECT ANY TABLE IN SCHEMA usr_test_2 TO usr_test_3;
    SQL> GRANT CREATE PACKAGE TO usr_test_3;
    SQL> SELECT
             grantor_id,
             grantee_id,
             object_id,
             object_type,
             authority
         FROM
             SYS_ACLS sa
         JOIN SYS_USERS su ON
             sa.grantee_id = su.user_id
             AND sa.db_id = su.db_id
         WHERE
             user_name = 'USR_TEST_3';
    +------------+------------+-----------+-------------+-----------+
    | GRANTOR_ID | GRANTEE_ID | OBJECT_ID | OBJECT_TYPE | AUTHORITY |
    +------------+------------+-----------+-------------+-----------+
    | 1          | 102        | -101      | 5           | 257       |
    | 1          | 102        | 0         | 18          | 128       |
    +------------+------------+-----------+-------------+-----------+
    -- AUTHORITY    十六进制形式    权限标志(非对象级)            OBJECT_TYPE    OBJECT_NAME
    -- 257          0x101          ACL_CRE_ANY | ACL_READ_ANY    5              TABLE
    -- 128          0x80           ACL_CREATE                    18             PACKAGE
  • 对象级权限:

    sql
    SQL> CREATE USER usr_test_4 IDENTIFIED BY '123QWE$$&';
    SQL> CREATE TABLE tab_test (a INT);
    -- 非列对象权限
    SQL> GRANT ALL ON TABLE tab_test TO usr_test_4;
    -- 表列对象权限
    SQL> GRANT SELECT,UPDATE (a) ON TABLE tab_test TO usr_test_4;
    SQL> SELECT
             grantor_id,
             grantee_id,
             object_id,
             object_type,
             authority
         FROM
             SYS_ACLS sa
         JOIN SYS_USERS su ON
             sa.grantee_id = su.user_id
             AND sa.db_id = su.db_id
         WHERE
             user_name = 'USR_TEST_4';
    +------------+------------+------------+-------------+-----------+
    | GRANTOR_ID | GRANTEE_ID | OBJECT_ID  | OBJECT_TYPE | AUTHORITY |
    +------------+------------+------------+-------------+-----------+
    | 1          | 103        | 1048576    | 5           | 2015      |
    | 1          | 103        | 1073741824 | 6           | 3         |
    +------------+------------+------------+-------------+-----------+
    -- AUTHORITY    十六进制形式    权限标志(对象级)         OBJECT_TYPE    OBJECT_NAME    OBJECT_ID    OBJECT
    -- 2015         0x7DF          ACL_TAB_ALL              5              TABLE          1048576      tab_test
    -- 3            0x3            ACL_READ | ACL_UPDATE    6              TABLE COLUMN   1073741824   tab_test.a

提示

列对象权限配置记录的 OBJECT_ID:假设表或视图的 IDa,列字段序号为 b,则 OBJECT_ID = (a << 10) + b

四、权限包含与继承机制

4.1 权限包含

权限存在隐式包含机制,即当用户具备某一上层权限时,可能隐式拥有对应的下层权限。例如:

  • 用户或角色拥有某个表(视图)的 SELECT(或 UPDATE)权限时,隐式拥有对该表(视图)所有列的 SELECT(或 UPDATE)权限。

隐式拥有的下层权限不会记录在系统表中,也无法撤销。

4.2 权限继承

将角色授予用户后,用户将继承该角色的权限。这些继承的权限不会单独记录在系统表中,也无法通过权限撤销语句直接撤销。此外,一个用户可以从多个角色继承权限。权限继承示例如下:

sql
-- 创建两个角色 role_test_1 和 role_test_2
SQL> CREATE ROLE role_test_1;
SQL> CREATE ROLE role_test_2;

-- 给这两个角色分别授予 SELECT ANY TABLE 和 DROP ANY TABLE 权限
SQL> GRANT SELECT ANY TABLE TO role_test_1;
SQL> GRANT DROP ANY TABLE TO role_test_2;

-- 创建表 tab_test 和用户 usr_test
SQL> CREATE TABLE tab_test (a INT);
SQL> CREATE USER usr_test IDENTIFIED BY '123QWE$$&';

-- 用户 usr_test 没有查询和删除表的权限
SQL> SET SESSION AUTHORIZATION usr_test;
SQL> SELECT * FROM sysdba.tab_test;
Error: [E18012] 权限不够
SQL> DROP TABLE sysdba.tab_test;
Error: [E18012] 权限不够

-- 将角色授予用户
SQL> SET SESSION AUTHORIZATION sysdba;
SQL> GRANT ROLE role_test_1 TO usr_test;
SQL> GRANT ROLE role_test_2 TO usr_test;

-- 用户 usr_test 继承了查询和删除表的权限
SQL> SET SESSION AUTHORIZATION usr_test;
SQL> SELECT * FROM sysdba.tab_test;
+---+
| A |
+---+
+---+
SQL> DROP TABLE sysdba.tab_test;