权限管理
📄字数 16.4K
👁️阅读量 加载中...
XuguDB 中存在多种类型的数据库对象,例如表、视图、存储过程、序列值、包等。
每类对象支持一组特定的操作,例如:
- 表对象支持的操作包括创建(
CREATE
)、修改(ALTER
)、删除(DROP
)、查询(SELECT
)、插入(INSERT
)、更新(UPDATE
)和删除数据(DELETE
)等。 - 包对象支持的操作主要包括创建、删除及执行(
EXECUTE
)。
执行上述操作通常需要具备相应的权限。
对象的创建者被视为该对象的拥有者,默认拥有对该对象的所有权限。对于大多数数据库对象,初始情况下,仅对象的属主,以及具备高级权限的系统用户(如SYSDBA
)和具备数据库管理员角色(如DB_ADMIN
)的用户,能够对其执行任意操作。为了允许其他用户访问和使用这些对象,必须通过授权机制将相关权限显式授予目标用户或角色。
为提升权限管理的灵活性和可控性,XuguDB 按对象粒度将权限划分为以下的级别:
- 系统级权限:控制用户执行影响某个数据库(或跨多个数据库)的系统范围操作,例如创建和删除数据库、进行备份与恢复等。这类操作通常涉及系统稳定性与数据安全,建议仅授予数据库管理员或具有等效角色的用户。
- 数据库级权限:控制用户对某个数据库中对象的访问和管理权限,例如创建用户、创建模式等操作。
- 模式级权限:控制用户对特定模式中对象的访问和管理权限。
- 对象级权限:控制用户对具体数据库对象(如某一张表或视图)的访问和管理权限。
此外,为简化权限管理流程,XuguDB 支持角色管理。角色可以看作是一组权限的集合,数据库管理员可以将权限授予角色,然后将角色分配给用户,从而实现权限的统一授予与集中控制。
在 XuguDB 的权限模型中,权限存在隐式包含机制,即当用户具备某一上层权限时(如表级 SELECT
权限),可能隐式拥有对应的下层权限(如某些列的 SELECT
权限)。此外,权限还存在继承机制,该机制仅适用于角色与用户之间,相关权限会沿着角色授予链进行传递,实现权限的统一管理与复用。
通过精细的权限划分与灵活的角色管理,XuguDB 能够在保障安全性的前提下,提供对数据库资源的有效控制与协同访问能力。
一、权限划分
为提升权限管理的灵活性和可控性,XuguDB 提供了以下两种权限划分方式:
- 按对象粒度分级:将权限划分为四个级别,包括系统级权限、数据库级权限、模式级权限和对象级权限。
- 按角色职责划分:分为
DBA
(除审计和安全外的所有权限)、AUDITOR
(审计权限) 和SSO
(安全权限)。按角色职责划分的三种角色权限均属于管理员权限范畴,但各自负责不同的管理职能。
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 查询指定序列值
注意
- 只有
TABLE
、VIEW
、PROCEDURE
和SEQUENCE
支持带有对象类型的权限名称。 - 所有对象类型都支持不带对象类型的权限名称,如下所示(省略
TABLE
、VIEW
、PROCEDURE
和SEQUENCE
)。
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
:表示被授予或撤销权限的角色或用户。如果针对某个角色进行权限授予或撤销,该角色下的所有用户将自动获得或失去相应权限。
示例:
授予用户删除任何数据库的权限,然后撤销该权限。
sqlSQL> CREATE USER usr_test IDENTIFIED BY '123QWE$$&'; SQL> GRANT CREATE ANY DATABASE TO usr_test; SQL> REVOKE CREATE ANY DATABASE FROM usr_test;
1
2
3
2.2 数据库级权限
语法格式:
参数说明:
db_privileges
:表示一个或多个数据库级权限名称。obj_operation
:表示对象操作类型。obj_type
:表示对象类型。
注意
对象操作类型必须与对象类型相匹配。例如,对于 PROCEDURE
类型的对象,只能授予 CREATE ANY
、ALTER ANY
、DROP ANY
和 EXECUTE ANY
权限。
示例:
授予用户对当前数据库所有包的操作权限,然后撤销该权限。
sqlSQL> 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;
1
2
2.3 模式级权限
语法格式:
参数说明:
sche_privileges
:表示一个或多个模式级权限名称。使用sche_privileges_2
这种形式时,目标模式是用户的默认模式及其拥有的模式。sche_name
:表示要授予或撤销权限的目标模式名称。obj_operation
:表示对象操作类型。obj_type
:表示对象类型。
注意
对象操作类型必须与对象类型相匹配。例如,对于 PROCEDURE
类型的对象,只能授予 CREATE ANY
、ALTER ANY
、DROP ANY
和 EXECUTE ANY
权限。
示例:
授予角色在指定模式下的创表权限,然后撤销该权限。
sqlSQL> 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;
1
2
3授予用户在自身默认模式及拥有的模式下的创表权限,然后撤销该权限。
sqlSQL> GRANT CREATE TABLE TO usr_test; SQL> REVOKE CREATE TABLE FROM usr_test;
1
2
2.4 对象级权限
语法格式:
参数说明:
obj_privileges
:表示一个或多个对象级权限名称。privileges
形式表示非列类型对象的权限名称,col_privileges
形式表示列类型对象的权限名称。ALL PRIVILEGES
和ALL
:表示对象的所有操作权限。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
类型的对象,只能授予ALTER
、DROP
和EXECUTE
权限(ALL PRIVILEGES
和ALL
表示这三种权限的集合)。
示例:
授予用户对特定表对象的操作权限,然后撤销该权限。
sqlSQL> 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;
1
2
3授予用户对特定表某列的操作权限,然后撤销该权限。
sqlSQL> GRANT SELECT,UPDATE (a) ON tab_test TO usr_test; SQL> REVOKE SELECT,UPDATE (a) ON tab_test FROM usr_test;
1
2授予用户对特定表的查询权限以及权限的转授权,然后转授权限给角色,接着撤销转授权,最后撤销用户和角色的权限。
sqlSQL> 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;
1
2
3
4
5
6
7
8
9
2.5 管理员权限
语法格式:
参数说明:
admin_privilege
:表示一个管理员权限名称。
注意
用户和角色不能同时拥有管理员、审计员及安全员权限中的两项及以上。
示例:
授予用户系统管理员权限,然后撤销该权限。
sqlSQL> GRANT DBA TO usr_test; SQL> REVOKE DBA FROM usr_test;
1
2
三、权限查询
用户和角色拥有的权限的来源不同,查询方式也有所不同,可分为以下两种方式:
- 方式一:对象属主的完全控制权限
- 对
PACKAGE
等类型的对象,查询系统表SYS_OBJECTS
,获取用户所拥有的对象。 - 对
JOB
等类型的对象,可通过查询与对象类型对应的系统表(如SYS_JOBS
),获取用户拥有的对象。 - 对
USER
、ROLE
等不归属于任何用户的对象,参考方式二。
- 对
- 方式二:通过授予或继承获得的其他权限
本章节仅说明权限查询的方式二。
3.1 查询系统表
系统表 SYS_ACLS
记录了数据库中所有用户和角色的访问控制信息,包括各类权限的授予情况。通过查询该表,可以了解用户和角色的权限配置信息。
字段名称 | 字段类型 | 字段说明 |
---|---|---|
DB_ID | INTEGER | 库 ID |
GRANTOR_ID | INTEGER | 授权者 ID |
GRANTEE_ID | INTEGER | 被授权者 ID |
OBJECT_ID | INTEGER | 授权对象 ID |
OBJECT_TYPE | INTEGER | 授权对象类型 |
AUTHORITY | BIGINT | 权限值 |
REGRANT | BIGINT | 可转授的权限值 |
ORG_GRANTOR_ID | INTEGER | 权限的原始拥有者 ID |
IS_SYS | BOOLEAN | 是否系统内建(暂未使用) |
注意
AUTHORITY
字段以十进制数值形式存储和显示,由表 3.3 权限标志中定义的各权限标志按位或组合而成。
系统表 SYS_ROLE_MEMBERS
记录了数据库中角色的成员信息。通过查询该表,可以了解用户所属的角色信息。
字段名称 | 字段类型 | 字段说明 |
---|---|---|
DB_ID | INTEGER | 库 ID |
USER_ID | INTEGER | 用户 ID |
ROLE_ID | INTEGER | 角色 ID |
查询通过权限授予显式获得的权限:
- 查询
SYS_USERS
获取用户或角色的ID
。 - 查询
SYS_ACLS
获取GRANTEE_ID
和ID
匹配的记录。
查询通过角色授予继承获得的权限:
- 查询
SYS_USERS
获取用户的ID
。 - 查询
SYS_ROLE_MEMBERS
获取用户所属的所有角色的ID
。 - 查询
SYS_ACLS
获取GRANTEE_ID
和任一角色ID
匹配的记录。
3.2 权限记录解析
对系统表 SYS_ACLS
中的每条权限配置记录,可以根据 OBJECT_ID
、OBJECT_TYPE
和 AUTHORITY
字段解析出用户或角色所拥有的具体权限。详情参考解析流程和解析示例。
3.2.1 解析流程

图 3.1 权限解析流程图
以下是图 3.1 权限解析流程图需要参考的表,表 3.3 权限标志和表 3.4 对象类型。
表 3.3 权限标志
系统级权限、数据库级权限、模式级权限、管理员权限
权限标志 权限值 权限名称 ACL_READ_ANY 0x1 SELECT ANY ACL_UPDATE_ANY 0x2 UPDATE ANY ACL_INSERT_ANY 0x4 INSERT ANY ACL_DELETE_ANY 0x8 DELETE ANY ACL_REF_ANY 0x10 REFERENCES ANY ACL_EXECUTE_ANY 0x20 EXECUTE ANY ACL_INDEX_ANY 0x40 保留权限标志 ACL_CREATE 0x80 CREATE ACL_CRE_ANY 0x100 CREATE ANY ACL_ALT_ANY 0x200 ALTER ANY ACL_DROP_ANY 0x400 DROP ANY ACL_BACKUP_ANY 0x800 BACKUP ACL_RESTORE_ANY 0x1000 RESTORE ACL_VACUUM_ANY 0x2000 保留权限标志 ACL_REPLICATION_ANY 0x4000 保留权限标志 ACL_REFRESH_ANY 0x8000 保留权限标志 ACL_GRANT_ANY 0x10000 特殊权限标志,表示可授权 ACL_ENCRYPT_ANY 0x20000 ENCRYPT ANY ACL_CRE_JOB 0x40000 保留权限标志 ACL_TRACE 0x80000 保留权限标志 ACL_DBA 0x7FFFFF DBA ACL_AUDITOR 0x10000000 AUDITOR ACL_AUDIT_ADMIN 0x30000000 特殊权限标志,表示审计管理权 ACL_SSO 0x40000000 SSO ACL_SS_ADMIN 0xC0000000 特殊权限标志,表示安全管理权 对象级权限
权限标志 权限值 权限名称 ACL_READ 0x1 SELECT ACL_UPDATE 0x2 UPDATE ACL_INSERT 0x4 INSERT ACL_DELETE 0x8 DELETE ACL_REF 0x10 REFERENCES ACL_EXECUTE 0x20 EXECUTE ANY ACL_INDEX 0x40 INDEX ACL_ALTER 0x80 ALTER ACL_DROP 0x100 DROP ACL_TRIG 0x200 TRIGGER ACL_VACUUM 0x400 保留权限标志 ACL_TAB_ALL 0x7DF ALL ACL_PROC_ALL 0x1A0 ALL ACL_VIEW_ALL 0x18F ALL ACL_PACK_ALL 0x1A0 ALL ACL_SEQ_ALL 0x183 ALL ACL_UDT_ALL 0x1A0 ALL
注意
权限标志说明
- 解析
AUTHORITY
时,忽略所有的保留权限标志。 - 仅系统内建用户和角色,以及被授予系统内建角色的用户,其权限配置记录的
AUTHORITY
字段才可能包含特殊权限标志。
表 3.4 对象类型
对象类型值 | 对象类型名 |
---|---|
1 | DATABASE |
4 | SCHEMA |
5 | TABLE |
6 | TABLE COLUMN |
7 | PROCEDURE |
8 | SEQUENCE |
9 | VIEW |
10 | INDEX |
11 | TRIGGER |
12 | DATABASE LINK |
13 | REPLICATION |
15 | SYNONYM |
16 | USER |
17 | ROLE |
18 | PACKAGE |
19 | OBJECT |
20 | DIR |
22 | JOB |
28 | VIEW COLUMN |
35 | PUBLIC SYNONYM |
3.2.2 解析示例
提示
解析出 AUTHORITY
对应的权限标志,以及 OBJECT_ID
和 OBJECT_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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17系统级权限:
sqlSQL> 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26数据库级权限:
sqlSQL> 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24模式级权限:
sqlSQL> 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25对象级权限:
sqlSQL> 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
提示
列对象权限配置记录的 OBJECT_ID
:假设表或视图的 ID
为 a
,列字段序号为 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;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32