3.3. 权限和角色管理 ¶
-
关于权限与角色
-
授权对象
-
管理特权
-
系统特权
-
管理角色
-
对象权限
-
授予用户和角色权限
-
撤销用户和角色权限
-
管理public角色
-
SET ROLE的使用
-
用户权限和角色的系统视图和字典
3.3.1. 关于权限与角色 ¶
KingbaseES 使用角色的概念管理数据库访问权限。一个角色可以被看成是一个数据库用户或者是一个数据库用户组,这取决于角色被怎样设置。角色可以拥有数据库对象(例如,表和函数)并且能够把那些对象上的权限赋予给其他角色来控制谁能访问哪些对象。此外,还可以把一个角色中的成员资格授予给另一个角色,这样允许成员角色使用被赋予给另一个角色的权限。
为了方便权限管理,用户可以建立多个角色,对角色进行授权和权限回收,并把角色授予其他用户。用户建立连接后即具有默认角色的所有权限,新建用户没有设置默认角色时,其默认角色为空。用户可通过 SET ROLE 语句改变当前生效的角色,通过 ALTER ROLE 语句修改用户的默认角色。
权限是执行一种特殊类型的SQL 语句或存取某一用户的对象的权力,包括系统权限、对象权限和列级权限。
-
系统权限:是执行特定操作的权限。一类是以用户或角色的属性存在的系统权限,这些权限包括:CREATE DATABASE、CREATE USER、CREATE ROLE 的权限,具体分为SUPERUSER、SSO、SAO、CREATEDB 和CREATEROLE 五个系统权限;一类是通过GRANT/REVOKE 语句来授予和回收的系统权限,如ANY 系统权限。
-
对象权限:是对给定的用户授予在给定对象(例如表)上执行的操作集。这些操作可以指明为INSERT、SELECT 等,具体各类对象具有的权限类型可参见GRANT 和REVOKE 语句的说明。
-
列级权限:是对给定的用户授予在给定表或视图上某些列执行操作集。此动作只能为INSERT、UPDATE和REFERENCES。
当前用户是其所创建的对象的拥有者,对象的拥有者在其上具有所有特权。只有当用户有适当系统权限或对象权限时,才能执行相应操作,否则执行失败,并返回权限不足的错误提示信息。对象在创建时会被分配一个所有者,所有者通常是执行创建语句的角色。对于大部分类型的对象,初始状态下只有所有者(或者超级用户)能够对该对象做任何事情。为了允许其他角色使用它,必须分配权限。
3.3.2. 授权对象 ¶
向用户授予权限,以便他们可以完成工作所需的任务。您应该只将权限授予需要该权限才能完成必要工作的用户。过度授予不必要的特权可能会危及数据库安全。例如,您不应将superuser管理权限授予不执行管理任务的用户。 您可以通过两种方式向用户授予权限:
-
您可以明确地向用户授予权限。例如,您可以显式授予用户test查询订单表的权限。
-
您可以将权限授予一个角色(一组命名的权限),然后将该角色授予一个或多个用户。例如,您可以将订单表的选择、插入、更新和删除的权限授予名为my_role的角色,而该角色又可以授予用户user1和user2。
-
因为角色允许更轻松和更好地管理权限,所以您通常应该将权限授予角色而不是特定用户。
3.3.3. 管理特权 ¶
3.3.3.1. 超级用户 ¶
授予superuser新用户将成为一个超级用户,拥有所有数据库最高权限,可以对数据库做任何操作。所以对此权限的授予需要非常谨慎,通常一个数据库只有一个超级用户。
3.3.3.2. 备份恢复权限 ¶
SYSBACKUP是KingbaseES的一种管理特权,允许物理备份 sys_basebackup 连接到目标数据库,执行物理备份操作。详情参见插件 backup_pri 。
3.3.3.2.1. 加载插件 ¶
修改 kingbase.conf 文件中shared_preload_libraries 参数后重启数据库。
shared_preload_libraries = 'backup_pri' create extension backup_pri;
3.3.3.2.2. 参数配置 ¶
backup_pri.enable_backup_pri
启用备份恢复权限功能,取值范围为 on或者 off,缺省为off。
\c - system create extension backup_pri; SHOW backup_pri.enable_backup_pri; backup_pri.enable_backup_pri ------------------------------- off (1 row) ALTER SYSTEM SET backup_pri.enable_backup_pri to on; select sys_reload_conf(); SHOW backup_pri.enable_backup_pri; backup_pri.enable_backup_prih ------------------------------- t (1 row)
3.3.3.2.3. SYSBACKUP权限查询示例 ¶
如何赋予和收回这个新的权限用例。
\c - system create extension backup_pri; create user test; select * from sys_privilege; userid | sysbackup --------+----------- 16401 | f (1 row) alter user test sysbackup; select * from sys_privilege; userid | sysbackup --------+----------- 16401 | t (1 row) alter user test nosysbackup; select * from sys_privilege; userid | sysbackup --------+----------- 16401 | f (1 row) create user test1 sysbackup; select * from sys_privilege; userid | sysbackup --------+----------- 16401 | f 16402 | t (2 rows) drop user test; select * from sys_privilege; userid | sysbackup --------+----------- 16402 | t (1 row) drop user test1; select * from sys_privilege; userid | sysbackup --------+----------- (0 rows)
3.3.3.2.4. 相关系统视图 ¶
-
backup_pri.dba_sys_privs
查询出所有的用户的sysbackup权限和其他系统权限,若用户没有sysbackup权限,有可能显示的是空,或者nosysbackup两种情况。
backup_pri.dba_sys_privs 视图的每个字段意义如下表所示:
表 3.3.11 backup_pri.dba_sys_privs视图 ¶ 列名
描述
username
用户名
userid
用户 id
superuser
超级用户
inherit
继承
createrole
创建角色
createdb
创建库
canlogin
登录
replication
流复制
bypassrls
安全测试 RLS
sysbackup
备份恢复
-
backup_pri.user_sys_privs
查询出当前的用户的sysbackup权限和其他系统权限,若当前用户没有sysbackup权限,有可能显示的是空,或者 nosysbackup两种情况。
backup_pri.user_sys_privs 视图的每个字段意义如下表所示:
表 3.3.12 backup_pri.user_sys_privs视图 ¶ 列名
描述
username
用户名
userid
用户id
superuser
超级用户
inherit
继承
createrole
创建角色
createdb
创建库
canlogin
登录
replication
流复制
bypassrls
安全测试 RLS
sysbackup
备份恢复
-
backup_pri.role_sys_privs
查询出角色的 sysbackup 权限和其他系统权限,若角色没有 sysbackup 权限,有可能显示的是空,或者 nosysbackup两种情况。
backup_pri.role_sys_privs 视图的每个字段意义如下表所示:
表 3.3.13 backup_pri.role_sys_privs视图 ¶ 列名
描述
rolename
角色名
roleid
角色id
superuser
超级用户
inherit
继承
createrole
创建角色
createdb
创建库
canlogin
登录
replication
流复制
bypassrls
安全测试 RLS
sysbackup
备份恢复
3.3.3.3. 系统ANY 权限 ¶
系统ANY 权限是KingbaseES的一种管理特权,通过授予用户ANY 权限,允许用户操作所有的某种类型的数据库对象的某种操作,不包括系统对象。
3.3.3.3.1. 加载插件 ¶
修改 kingbase.conf 文件中shared_preload_libraries 参数后重启数据库。
shared_preload_libraries = 'sysprivilege'
3.3.3.3.2. ANY权限列表 ¶
ANY权限包含了四种数据库对象和八种操作类型。
数据库对象包括:TABLE,VIEW,SEQUENCE,PROCEDURE。
操作类型包括:CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,DROP,EXECUTE。
ANY 权限还为每种权限设置了 ADMIN 选项,标志是否为当前权限的 ADMIN 用户,如果是 ADMIN 用户, 那么允许当前用户授权 ANY权限给其他用户。
注意
ANY权限不可以操作数据库系统对象。
ANY权限如下表所示:
权限名称 |
描述 |
---|---|
CREATE ANY TABLE |
可以在任何模式或任何表空间下创建表 |
ALTER ANY TABLE |
可以在任何模式或任何表空间下修改表 |
DROP ANY TABLE |
可以在任何模式或任何表空间下删除表 |
SELECT ANY TABLE |
可以在任何模式或任何表空间下查询表 |
INSERT ANY TABLE |
可以在任何模式或任何表空间下的表中插入数据 |
DELETE ANY TABLE |
可以在任何模式或任何表空间下清除表 |
UPDATE ANY TABLE |
可以在任何模式或任何表空间下更新表 |
CREATE ANY VIEW |
可以在任何模式或任何表空间下创建视图(注意:需要先获得所依赖表的查询权限) |
DROP ANY VIEW |
可以在任何模式或任何表空间下删除视图(注意:需要先获得所依赖表的查询权限) |
CREATE ANY SEQUENCE |
可以在任何模式或任何表空间下创建序列 |
ALTER ANY SEQUENCE |
可以在任何模式或任何表空间下修改序列 |
DROP ANY SEQUENCE |
可以在任何模式或任何表空间下删除序列 |
SELECT ANY SEQUENCE |
可以在任何模式或任何表空间下查询序列 |
UPDATE ANY SEQUENCE |
可以在任何模式或任何表空间下更新序列 |
CREATE ANY PROCEDURE |
可以在任何模式或任何表空间下创建存储过程或函数 |
ALTER ANY PROCEDURE |
可以在任何模式或任何表空间下修改存储过程或函数 |
DROP ANY PROCEDURE |
可以在任何模式或任何表空间下删除存储过程或函数 |
EXECUTE ANY PROCEDURE |
可以在任何模式或任何表空间下执行存储过程或函数 |
3.3.3.3.3. ANY权限操作示例 ¶
如何赋予和收回 ANY 权限用例。以表举例:
CREATE USER SYS WITH SUPERUSER; CREATE USER U1; CREATE USER U2; CREATE SCHEMA S1; CREATE TABLE TEST(ID INT); CREATE TABLE S1.ST(ID INT); -- ALL SHOULD BE ERROR, BECAUSE NO ANY PRIVILEGE SET SESSION AUTHORIZATION U1; CREATE TABLE S1.UT(ID INT); ERROR: permission denied for schema s1 LINE 1: CREATE TABLE S1.UT(ID INT); ^ SELECT * FROM S1.ST; ERROR: permission denied for schema s1 LINE 1: SELECT * FROM S1.ST; ^ INSERT INTO S1.ST VALUES(1); ERROR: permission denied for schema s1 LINE 1: INSERT INTO S1.ST VALUES(1); ^ DELETE FROM S1.ST WHERE ID = 1; ERROR: permission denied for schema s1 LINE 1: DELETE FROM S1.ST WHERE ID = 1; ^ UPDATE S1.ST SET ID = 2 WHERE ID = 1; ERROR: permission denied for schema s1 LINE 1: UPDATE S1.ST SET ID = 2 WHERE ID = 1; ^ ALTER TABLE S1.ST RENAME TO STT; ERROR: permission denied for schema s1 ALTER TABLE S1.ST ADD COLUMN NAME VARCHAR(10); ERROR: permission denied for schema s1 DROP TABLE S1.ST; ERROR: permission denied for schema s1 -- GIVEN ALL TABLE SYSTEM ANY PRIVILEGE SET SESSION AUTHORIZATION SYS; GRANT CREATE ANY TABLE TO U1; GRANT SELECT ANY TABLE TO U1; GRANT ALTER ANY TABLE TO U1; GRANT INSERT ANY TABLE TO U1; GRANT DELETE ANY TABLE TO U1; GRANT UPDATE ANY TABLE TO U1; GRANT DROP ANY TABLE TO U1; SELECT * FROM SYS_SYSPRIVILEGE; grantee | privilege | admin_option ---------+-----------+-------------- 16386 | 1 | f 16386 | 4 | f 16386 | 2 | f 16386 | 5 | f 16386 | 6 | f 16386 | 7 | f 16386 | 3 | f (7 rows) -- ALL SHOULD BE RIGHT, BECAUSE HAVE ANY PRIVILEGE SET SESSION AUTHORIZATION U1; CREATE TABLE S1.UT(ID INT); SELECT * FROM S1.ST; id ---- (0 rows) INSERT INTO S1.ST VALUES(1); DELETE FROM S1.ST WHERE ID = 1; UPDATE S1.ST SET ID = 2 WHERE ID = 1; ALTER TABLE S1.ST RENAME TO STT; ALTER TABLE S1.STT ADD COLUMN NAME VARCHAR(10); DROP TABLE S1.STT CASCADE; NOTICE: drop cascades to view s1.sv -- CLEAN SET SESSION AUTHORIZATION SYS; REVOKE CREATE ANY TABLE FROM U1; REVOKE SELECT ANY TABLE FROM U1; REVOKE ALTER ANY TABLE FROM U1; REVOKE INSERT ANY TABLE FROM U1; REVOKE DELETE ANY TABLE FROM U1; REVOKE UPDATE ANY TABLE FROM U1; REVOKE DROP ANY TABLE FROM U1; SELECT * FROM SYS_SYSPRIVILEGE; grantee | privilege | admin_option ---------+-----------+-------------- (0 rows) DROP TABLE S1.UT;
3.3.3.3.4. 相关表和视图 ¶
-
sys_sysprivilege是一个系统表,查询出所有拥有系统ANY权限的用户。
sys_sysprivilege 视图的每个字段意义:
grantee
privilege
admin_option
用户 OID
权限 ID
是否是 ADMIN 用户
-
user_any_privs是一个系统视图,用于提供权限 ID 的转换,显示为权限具体的名字。每个用户只可以查看自己的拥有的ANY权限。
user_any_privs 视图的每个字段意义:
grantee
privilege
admin_option
用户 OID
权限名字
是否是 ADMIN 用户
3.3.4. 系统特权 ¶
3.3.4.1. 系统权限介绍 ¶
系统权限是执行特定操作的权限。这些权限包括:CREATE DATABASE、CREATE USER、CREATE ROLE 的权限等,KingbaseES的特权如下所示:
-
SUPERUSER NOSUPERUSER
这些子句决定新角色是否是一个“超级用户”,它可以越过数据库内的所有访问限制。超级用户状态很危险并且只应该在确实需要时才用。要创建一个新超级用户,你必须自己是一个超级用户。如果没有指定,默认值是NOSUPERUSER。
-
CREATEDB NOCREATEDB
这些子句定义一个角色创建数据库的能力。如果指定了CREATEDB,被定义的角色将被允许创建新的数据库。指定NOCREATEDB 将否定一个角色创建数据库的能力。如果没有指定,默认值是NOCREATEDB。
-
CREATEROLE NOCREATEROLE
这些子句决定一个角色是否被允许创建新的角色(也就是执行CREATE ROLE)。一个带有CREATEROLE 特权的角色也能修改和删除其他角色。如果没有指定,默认值是NOCREATEROLE。
-
INHERIT NOINHERIT
如果新的角色是其他角色的成员,这些子句决定新角色是否从那些角色中“继承”特权,把新角色作为成员的角色称为新角色的父角色。一个带有INHERIT 属性的角色能够自动使用已经被授予给其直接或间接父角色的任何数据库特权。如果没有INHERIT,在另一个角色中的成员关系只会把SET ROLE 的能力授予给那个其他角色,只有在这样做后那个其他角色的特权才可用。如果没有指定,默认值是INHERIT。
-
LOGIN NOLOGIN
这些子句决定一个角色是否被允许登录,也就是在客户端连接期间该角色是否能被给定为初始会话认证名称。一个具有LOGIN 属性的角色可以被考虑为一个用户。没有这个属性的角色对于管理数据库特权很有用,但是却不是用户这个词的通常意义。如果没有指定,默认值是NOLOGIN,不过当CREATE ROLE 被通过CREATE USER 调用时默认值会是LOGIN。
-
REPLICATION NOREPLICATION
这些子句决定一个角色是否为复制角色。角色必须具有这个属性(或者成为一个超级用户)才能以复制模式(物理复制或者逻辑复制)连接到服务器以及创建或者删除复制槽。一个具有REPLICATION 属性的角色是一个具有非常高特权的角色,并且只应被用于确实需要复制的角色上。如果没有指定,默认值是 NOREPLICATION。
-
BYPASSRLS NOBYPASSRLS
这些子句决定是否一个角色可以绕过每一条行级安全性(RLS)策略。默认是 NOBYPASSRLS。 注意 sys_dump 将默认把 row_security 设置为 OFF,以确保一个表的所有内容被转储出来。如果运行 sys_dump 的用户不具有适当的权限,将会返回一个错误。超级用户和被转储表的拥有者总是可以绕过 RLS。
3.3.4.2. 限制系统特权 ¶
由于系统特权非常强大,创建用户是默认只拥有LOGIN权限。LOGIN、SUPERUSER、CREATEDB和CREATEROLE等特权被认为是一种特殊权限,但是它们从来不会像数据库对象上的普通权限那样被继承。要使用这些属性,你必须使用 SET ROLE 到一个有这些属性之一的特定角色。
3.3.4.3. 系统特权的授予和撤销 ¶
可以在创建用户的时候指定特权,或者使用alter语句修改用户特权,例如,向test授予CREATEDB特权,
ALTER USER test CREATEDB ;
然后又撤销:
ALTER USER test NOCREATEDB ;
3.3.4.4. 授予系统特权的用户 ¶
只有两种类型的用户可以向其他用户授予系统权限或撤销这些权限:
-
被授予特定系统特权的用户
-
具有超级权限的用户
因此,请仅将这些权限授予受信任的用户。
3.3.5. 管理角色 ¶
3.3.5.1. 关于角色 ¶
角色是一组权限的集合,使用角色让权限管理的工作更加简单有效。数据库管理员可以将角色授予用户或者其他角色,有创建角色(CREATE ROLE)的系统权限的用户可以将自己创建的角色授予给用户和其他角色。 创建一个新的用户时,其默认角色为空,但可通过ALTER USER 指定该用户的默认角色。 一个用户只能有一个默认角色。当该用户连接数据库时,自动激活该角色。当不再需要一个角色时,可以删除这个角色。
一个初始化的数据库系统总是包含一个预定义角色,默认是一个”superuser”,并且在默认情况下(除非在运行 initdb 时修改)角色的名字和初始化数据库集簇的操作系统用户相同。习惯上,这个角色将被命名为SYSTEM。若想创建更多角色,首先必须以初始角色的身份连接数据库。
每一个到数据库服务器的连接都是使用某个特定角色名建立的,并且这个角色决定发起连接的命令的初始访问权限。用于特定数据库连接的角色名称由以特定于应用程序的方式启动连接请求的客户端指示。例如,ksql程序使用-U命令行选项来指定以哪个角色连接。很多应用假定该名字默认是当前操作系统用户(包括createuser 和 ksql)。因此在角色和操作系统用户之间维护一个名字对应关系通常是很方便的。
一个给定客户端连接能够用来连接的数据库角色的集合由该客户端的认证设置决定,详见 用户的客户端认证 (因此,一个客户端不止限于以匹配其操作系统用户的角色连接,就像一个人的登录名不需要匹配他的真实名字一样)。因为角色身份决定一个已连接客户端可用的权限集合,在设置一个多用户环境时要小心地配置权限。
3.3.5.2. 安装预定义角色 ¶
KingbaseES提供了一组默认角色,它们提供对特定的、通常需要的、需要特权的功能和信息的访问。管理员可以把这些角色 GRANT 给其环境中的用户或者其他角色,让这些用户能够访问指定的功能和信息。
角色 |
描述 |
---|---|
sys_read_all_settings |
读取所有配置变量,甚至是那些通常只对超级用户可见的变量。 |
sys_read_all_stats |
读取所有的sys_stat_*视图并且使用与扩展相关的各种统计信息,甚至是那些通常只对超级用户可见的信息。 |
sys_stat_scan_tables |
执行可能会在表上取得 ACCESS SHARE 锁的监控函数(可能会持锁很长时间)。 |
sys_monitor |
读取/执行各种监控视图和功能。这个角色是sys_read_all_settings 、sys_read_all_stats和sys_stat_scan_tables 的成员 |
sys_signal_backend |
通知另一个后端取消查询或终止其会话. |
sys_read_server_files |
允许使用 COPY 以及其他文件访问函数从服务器上该数据库可访问的任意位置读取文件。 |
sys_write_server_files |
允许使用COPY以及其他文件访问函数在服务器上该数据库可访问的任意位置中写入文件。 |
sys_execute_server_program |
允许用运行该数据库的用户执行数据库服务器上的程序来配合 COPY 和其他允许执行服务器端程序的函数。 |
3.3.5.3. 创建角色 ¶
CREATE ROLE 向KingbaseES数据库集簇增加一个新的角色。创建角色必须具有 CREATEROLE特权或者成为 超级管理员。角色是定义在数据库集簇层面上的,并且因此在集簇中的所有数据库中都可用。例如:
CREATE ROLE name;
3.3.5.4. 角色授权类型 ¶
一个数据库角色可以有一些属性,它们定义角色的权限并且与客户端认证系统交互。
-
login privilege
只有具有 LOGIN 或 ACCOUNT UNLOCK 属性的角色才能被用于一个数据库连接的初始角色名称。一个带有 LOGIN 或 ACCOUNT UNLOCK 属性的角色可以被认为和一个“数据库用户”相同。要创建一个带有登录权限的角色,使用三者之一:
CREATE ROLE name LOGIN; CREATE USER name; CREATE USER name ACCOUNT UNLOCK; (CREATE USER 和 CREATE ROLE 等效,除了 CREATE USER 默认假定有 LOGIN,而 CREATE ROLE 没有)。
-
superuser status
一个数据库超级用户会绕开所有权限检查,除了登入的权限。这是一个危险的权限并且应该小心使用,最好用一个不是超级用户的角色来完成大部分工作,您必须作为一个超级用户来完成这些。要创建一个新数据库超级用户,使用:
CREATE ROLE name SUPERUSER;
-
database creation
一个角色必须被显式给予权限才能创建数据库(除了超级用户,因为它们会绕开所有权限检查)。要创建这样一个角色,使用:
CREATE ROLE name CREATEDB;
-
role creation
一个角色必须被显式给予权限才能创建更多角色(除了超级用户,因为它们会绕开所有权限检查)。要创建这样一个角色,使用
CREATE ROLE name CREATEROLE;
一个带有 CREATEROLE权限的角色也可以修改和删除其他角色,还可以授予或回收角色中的成员关系。然而,要创建、修改、删除或修改一个超级用户角色的成员关系,需要以超级用户的身份操作。CREATEROLE 不足以完成这一切。
-
initiating replication
一个角色必须被显式给予权限才能发起流复制(除了超级用户,因为它们会绕开所有权限检查)。一个被用于流复制的角色必须也具有 LOGIN 权限。要创建这样一个角色,使用:
CREATE ROLE name REPLICATION LOGIN;
-
password
只有当客户端认证方法要求用户在连接数据库时提供一个口令时,一个口令才有意义。password 和 md5 认证方法使用口令。数据库口令与操作系统命令独立。在角色创建时指定一个口令:
CREATE ROLE name PASSWORD “string“;
3.3.5.5. 修改角色 ¶
ALTER ROLE 更改一个KingbaseES角色的属性。数据库超级用户能够更改任何角色的任何这些设置。具有 CREATEROLE特权的角色能够更改任何这些设置,但是只能为非超级用户和非复制角色修改。普通角色只能更改它们自己的口令。示例如下:
更改一个角色的口令:
ALTER ROLE test WITH PASSWORD 'hu8jmn3';
让一个角色能够创建其他角色和新的数据库:
ALTER ROLE test CREATEROLE CREATEDB;
更改一个口令的失效日期,指定该口令应该在2015年5月4日中午(在一个比UTC快1小时的时区)过期:
ALTER ROLE test VALID UNTIL 'May 4 12:00:00 2015 +1';
3.3.5.6. 删除角色 ¶
DROP ROLE 删除一个数据库角色。删除角色需要注意以下几点:
-
删除一个数据库管理员角色,必须本身就是一个数据库管理员。
-
删除一个非数据库管理员角色,必须具有 CREATEROLE特权。
-
如果一个角色仍然被集簇中任何数据库中引用,它就不能被移除。如果尝试删除将会抛出一个错误。在删除该角色前,必须删除(或者重新授予所有权)它所拥有的所有对象并且收回该已经授予给该角色的在其他对象上的特权。
-
没有必要删除涉及该角色的角色成员关系。DROP ROLE 会自动收回目标角色在其他角色中的成员关系,以及其他角色在目标角色中的成员关系。其他角色不会被删除也不会被影响。
例如,要删除一个角色:
DROP ROLE test;
3.3.5.7. 角色启用禁用 ¶
在不删除角色的前提下,在本地库内使角色失效,使失效的角色再生效。详见插件 roledisable 。
3.3.5.7.1. 加载插件 ¶
修改 kingbase.conf 文件中 shared_preload_libraries
参数。
shared_preload_libraries = 'roledisable' create extension roledisable;
3.3.5.7.2. 查看角色状态 ¶
SYSTEM 可以通过roledisable.sys_role_status视图来查看系统所有角色在当前库内的启用/禁用状态。
SELECT * FROM roledisable.sys_role_status;
字段说明
oid
角色在数据库内的ID。
rolename
角色在数据库内的名称。
status
角色的状态 Enable表示角色被启用,Disable 表示角色被禁用。
3.3.5.7.3. 启用角色 ¶
将角色设置为启用状态。
ALTER ROLE rolename ENABLE;
-
执行权限: 需要以系统管理员权限执行,以非系统管理员执行时报告错误。
-
角色要求:被启用的角色需事先存在。
-
新建角色:新创建的角色默认为启用状态。
3.3.5.7.4. 禁用角色 ¶
将角色设置为禁用状态。
ALTER ROLE rolename DISABLE;
-
执行权限:需要以系统管理员权限执行,以非系统管理员执行时报告错误。
-
角色要求:被禁用的角色需事先存在。
-
系统内置角色;系统内置角色无法被禁用。如初始化用户、sao、sso等无法被禁用。
3.3.5.7.5. 被禁用角色的表现 ¶
-
当角色被禁用后,断开权限继承关系,不能从该角色直接和间接继承权限,间接使用被禁用角色的权限时应该报角色被禁用或权限错误。
-
以 SET ROLE 切换到被禁用的角色时报告错误。
-
当会话使用的系统管理员角色被禁用时,因系统管理员绕过权限检查因此不会对其造成权限的影响。
-
当前会话使用的非系统管理员角色被禁用时,被禁用角色对权限继承关系产生影响因缓存机制可能不会立即生效,当切换角色权限检查或重新登录后生效。
-
角色在使用期间被禁用时,以被禁用角色(非系统管理员)执行需检查权限的操作时,报当前角色被禁用错误。
-
角色被禁用状态下,可以修改角色权限和角色关系。如使用 GRANT 和 REVOKE 对其操作,使用 ALTER ROLE 对其操作。
3.3.6. 对象权限 ¶
3.3.6.1. 关于对象权限 ¶
对象权限是授予用户对数据库对象的权限,包括数据库对象表、列、视图、外部表、序列、数据库、外部数据包装器、外部服务器、函数、过程、过程语言、模式或表空间上的特权。主要的对象权限类型如下所示:
-
SELECT
允许从表、视图、物化视图或其他类似表的对象的任何列或特定列中进行SELECT。也允许使用 COPY 。在 UPDATE 或 DELETE 中引用现有列值时也需要此特权。对于序列,这个特权还允许使用 currval 函数。对于大型对象,此特权允许读取对象。
-
INSERT
允许INSERT将新行插入到表、视图等中。可以在特定的列上授予,在这种情况下,只有那些列可以在 INSERT命令中分配(因此其他列将接收默认值)。
-
UPDATE
允许 UPDATE 表、视图等的任何列或特定列 (实际上,任何重要的 UPDATE 命令也需要 SELECT 特权,因为它必须引用表列来确定要更新哪些行,以及/或计算列的新值)。除了 SELECT特权之外, SELECT ... FOR UPDATE和 SELECT ... FOR SHARE需要至少一个列上的这个特权。对于序列,这个特权允许使用nextval 和 setval函数。对于大型对象,此特权允许写入或截断对象。
-
DELETE
允许从表、视图等中DELETE一行(实际上,任何重要的DELETE命令都需要SELECT特权,因为它必须引用表列来确定要删除哪些行)。
-
TRUNCATE
允许对表、视图等进行 TRUNCATE。
-
REFERENCES
允许创建引用表或表的特定列的外键约束。
-
TRIGGER
允许在表、视图等上创建触发器。
-
CREATE
对于数据库,允许在数据库中创建新的模式和表空间。
对于模式,允许在模式中创建新对象。要重命名一个现有对象,您必须拥有对象和对包含的模式有这个特权。
对于表空间,允许在表空间中创建表、索引和临时文件,并允许创建将表空间作为默认表空间的数据库。(注意,撤销此特权不会改变现有对象的位置。)
-
CONNECT
允许受让人连接到数据库。此特权在连接启动时进行检查 (除了检查强加的任何sys_hba.conf 限制)。
-
TEMPORARY
允许在使用数据库时创建临时表。
-
EXECUTE
允许调用函数或过程,包括使用在函数上实现的任何操作符。这是唯一适用于函数和过程的特权类型。
-
USAGE
-
对于过程语言
允许使用该语言创建该语言中的函数。这是惟一适用于过程性语言的特权类型。
-
对于模式
允许访问模式中包含的对象 (假设也满足对象自己的特权要求)。本质上,这允许被授予者在模式中“查找”对象。没有这个权限,仍然可以看到对象名,例如通过查询系统目录。此外,在撤销此权限之后,现有会话可能具有先前执行此查找的语句,因此这不是防止对象访问的完全安全的方法。
-
对于序列
允许使用 currval 和 nextval 函数。
-
对于类型和域
允许在创建表、函数和其他模式对象时使用类型或域。(请注意,此特权并不控制该类型的所有“使用”,例如查询中出现的类型值。它只会阻止创建依赖于类型的对象。此特权的主要目的是控制哪些用户可以创建对类型的依赖项,这可以防止所有者稍后更改类型。)
-
对于外部数据包装器
允许使用外部数据包装器创建新服务器。
-
对于外部服务器
允许使用该服务器创建外部表。受资助者还可以创建、更改或删除与该服务器关联的自己的用户映射。
-
在创建对象时,KingbaseES 默认将某些类型的对象的权限授予 public。对于表、表列、序列、外部数据包装器、外部服务器、大型对象、模式或表空间,public 缺省情况下不授予任何特权。对于其他类型的对象,授予 public 的默认权限如下:
-
数据库的 CONNECT 和 TEMPORARY (创建临时表) 权限;
-
函数和程序的EXECUTE 权限;
-
语言和数据类型 (包括域) 的 USAGE 权限。
当然,对象所有者可以撤销的默认权限和明确授予的权限。(为了获得最大的安全性,在创建对象的同一事务中发出撤销; 那么就没有其他用户可以在其中使用该对象的窗口。)
3.3.6.2. 授予和撤销对象权限 ¶
3.3.6.2.1. 授予权限 ¶
每种类型的对象都有相关联的权限。通过grant来授予权限,可以将一个数据库对象上的指定特权交给一个或多个角色。
在 KingbaseES 中,ALL PRIVILEGES指授予对象类型的所有可用特权。例如:把视图 kinds上的所有可用特权授予给用户 manuel:
GRANT ALL PRIVILEGES ON kinds TO manuel;
关键词public指示特权要被授予给所有角色,包括那些可能稍后会被创建的角色。public可以被认为是一个被隐式定义的总是包含所有角色的组。任何特定角色都将具有直接授予给它的特权、授予给它作为成员所在的任何角色的特权以及被授予给 public的特权。例如,把表films上的插入特权授予给所有用户:
GRANT INSERT ON films TO public;
如果指定了 WITH GRANT OPTION,特权的接收者可以接着把它授予给其他人。如果没有授权选项,接收者就不能这样做。
3.3.6.2.2. 撤销权限 ¶
REVOKE命令收回之前从一个或者更多角色授予的权限。用户只能回收由它直接授出的特权。例如,如果用户A已经把一个带有授予选项的特权授予给了用户B,并且用户 B 接着把它授予给了用户 C,那么用户 A 无法直接从 C 收回该特权。反而,用户 A 可以从用户 B 收回该授予选项并且使用 CASCADE选项,这样该特权会被依次从用户C回收。对于另一个例子,如果A和B都把同一个特权授予给了C,A能够收回它们自己的授权但不能收回B的授权,因此C实际上仍将拥有该特权。
在 KingbaseES 中,同样可以通过指定ALL PRIVILEGES来撤销授予对象的所有可用特权。例如,从用户 manuel收回视图kinds上的所有特权:
REVOKE ALL PRIVILEGES ON kinds FROM manuel;
通过revoke from public可以回收所有用户在对象上的特权。例如:从public收回表 films 上的插入特权:
REVOKE INSERT ON films FROM public;
但public 收回特权并不一定会意味着所有角色都会失去在该对象上的特权:那些直接被授予的或者通过另一个角色被授予的角色仍然会拥有它。类似地,从一个用户收回权限后,如果public或者另一个成员关系角色仍有该权限,该用户还是可以使用该权限。如果指定了 GRANT OPTION FOR,只会回收该特权的授予选项,特权本身不被回收。否则,特权及其授予选项都会被回收。
3.3.6.3. 授予对象特权的用户 ¶
一般情况下,只有对象拥有者(或者超级用户)可以授予或撤销一个对象上的权限。但是可以在授予权限时使用”with grant option” 来允许接收人将权限转授给其他人。如果授予被撤销,则所有从接收人那里获得的权限(直接或者通过授权链获得)都将被撤销。
3.3.6.4. 管理表权限 ¶
表的对象权限可分为 DML(数据操作语言)或 DDL(数据定义语言)类型的两种权限级别,以及列级权限。
3.3.6.4.1. DML语言权限 ¶
您可以授予权限以对表或视图使用 DELETE、INSERT、SELECT 和 UPDATE操作。 仅将这些权限授予需要查询或操作表中数据的用户和角色。
您可以将表的 INSERT 和 UPDATE 权限限制为表的特定列。 使用选择性 INSERT 权限,特权用户可以插入一行,其中包含选定列的值,所有其他列为null。 使用选择性 UPDATE 权限,用户只能更新行的特定列值。 您可以使用选择性的 INSERT 和 UPDATE 权限来限制用户对敏感数据的访问。
例如,如果您不希望数据输入用户更改订单表的运费列,则可以选择性授予INSERT 或UPDATE 权限来排除运费列。 或者,排除运费列的视图也可以满足这种安全性的需求。
3.3.6.4.2. DDL语言权限 ¶
TRUNCATE、REFERENCES等权限允许对表执行 DDL 操作。由于这些权限允许其他用户更改或创建对表的依赖关系,因此您应该谨慎授予这些权限。尝试对表执行 DDL 操作的用户可能需要额外的系统或对象权限。例如,要在表上创建触发器,用户需要TRIGGER 权限。
与 INSERT 和 UPDATE 权限一样,您可以授予对表的特定列的 REFERENCES 权限。 REFERENCES 特权使被授权者能够在引用表上创建外键约束。此操作由特殊权限控制,因为外键的存在限制了可以对父键进行的数据操作和表更改。特定于列的 REFERENCES 特权将被授权者限制为使用命名列上(当然,这些列必须包括父表的至少一个主键或唯一键)。
3.3.6.4.3. 管理列级特权 ¶
列级权限是对给定的用户授予在表或视图上某些列执行操作集。此动作只能为INSERT、UPDATE和REFERENCES。
例如,以下语句向用户授予orders表的freight列的插入特权:
GRANT INSERT (freight) ON orders TO test;
3.3.6.5. 管理视图权限 ¶
3.3.6.5.1. 关于视图权限 ¶
视图是从一个或多个表(可能包括其他视图)中选择的数据的表示形式。视图显示基础表的结构。其所选数据可以被视为存储查询的结果。视图不包含任何实际数据,而是从它所基于的表和视图中派生它所显示的内容。您可以查询视图,并更改其表示的数据。可以更新或删除视图中的数据,并插入新数据。这些操作直接更改视图所基于的表,并且受基表的完整性约束和触发器的约束。
您可以将 DML 对象权限应用于视图,类似于表。视图的对象特权允许各种 DML 操作,如前所述,这些操作会影响从中派生视图的基表。 此外,在向其他用户授予您查看的权限之前,您必须对具有子句的基本对象具有对象特权,或者对子句具有适当的系统特权。如果您没有这些权限,则无法向其他用户授予访问您的视图的权限。如果尝试,则会引发错误,提示您没有足够的权限。
3.3.6.5.2. 使用视图的安全性 ¶
要使用视图,用户必须具有适当的权限,但仅限于视图本身,而不是其基础对象。但是,如果删除了视图基础对象的访问权限,则用户将不再具有访问权限。如果撤销了用户对视图基表的特权,则该视图将变为无效。因此,即使已向用户授予了对视图的访问权限,如果撤销用户对视图基表的特权,则该用户也可能无法使用该视图。
视图为表添加了另外两个安全级别,列级安全性和基于值的安全性,如下所示:
-
视图可以提供对基表选定列的访问。
例如,在orders表上定义一个视图,访问其中三列:
CREATE VIEW ORDER_QRY AS SELECT ORDERID,CUSTOMERID,ORDERDATE FROM orders;
-
视图可以为表中的信息提供基于值的安全性。视图定义中的子句仅显示基表的选定行。
例如,允许访问表中顾客编号为''的订单记录:
CREATE VIEW ORDER_QRY AS SELECT ORDERID,CUSTOMERID,ORDERDATE FROM orders WHERE CUSTOMERID='VINET';
在此视图中,只能访问与视图的当前用户匹配的行,体现了视图访问的安全性。
3.3.6.6. 管理过程权限 ¶
3.3.6.6.1. EXECUTE 特权 ¶
EXCUTE特权是过程(包括存储过程和函数)以及包中的过程的唯一对象特权。仅将此权限授予需要调用过程的用户。具有特定过程的对象特权的用户可以执行该过程或引用该过程的程序单元。KingbaseES数据库在调用任何 PL/SQL 单元时执行运行时权限检查。具有系统特权的用户可以执行数据库中的任何过程。
3.3.6.6.2. 过程特权如何影响所有者的权限 ¶
过程的所有者必须具有引用对象所需的所有对象特权。如果过程所有者向其他用户授予使用该过程的权限,则过程所有者的权限(对过程引用的对象)适用于被授权用户对该过程的执行。
被授予EXCUTE用户只需要执行该过程的特权,而不需要该过程访问的基础对象的特权。过程的所有者必须具有引用对象所需的所有对象特权。向引用过程的用户授予较少的权限,这样可以更好地控制数据库访问。通过编写过程并仅向用户授予权限,可以强制用户仅通过该过程访问引用的对象。
在运行时,KingbaseES数据库会在执行该过程之前检查定义者权限存储过程所有者的权限是否允许访问该过程的引用对象。如果过程的所有者撤消了对引用对象的必要特权,则该过程不能由所有者或任何其他用户运行。
3.3.6.6.3. 过程特权如何影响定义者的权限 ¶
调用方的权限过程以调用方的所有特权执行。KingbaseES数据库使通过调用者的任何已启用角色授予调用者的特权生效,除非定义者的权限过程直接或间接调用调用者的权限过程。调用程序权限过程的用户需要对过程通过调用程序架构中解析的外部引用访问的对象具有特权(直接或通过角色授予用户)。 调用程序在运行时需要特权才能访问嵌入在 DML 语句或动态 SQL 语句中的程序引用,因为它们在运行时实际上是重新编译的。
对于所有其他外部引用(如直接 PL/SQL 函数调用),KingbaseES数据库会在编译时检查所有者的权限,但不执行运行时检查。因此,调用程序权限过程的用户不需要对 DML 或动态 SQL 语句外部的外部引用具有特权。或者,调用程序权限过程的开发人员必须仅授予对过程本身的权限,而不是对调用者权限过程直接引用的所有对象授予特权。
您可以创建由多个程序单元组成的软件包,其中一些具有定义者权限,另一些具有调用者权限,并限制程序入口点。有权运行入口点过程的用户也可以间接执行内部程序单元,但不能直接调用内部程序。为了非常精确地控制查询处理,您可以使用显式游标创建 PL/SQL 包规范。
3.3.7. 授予用户和角色权限 ¶
使用 GRANT 语句和 ALTER USER 语句可以执行特定的权限授予操作。
-
向用户和角色授予系统或管理特权
在向用户和角色授予系统或管理特权之前,请了解这些类型权限的工作原理。
-
向用户和角色授予对象权限
您可以向用户和角色授予对象权限,并使被授权者能够向其他用户授予权限。
3.3.7.1. 向用户和角色授予系统或管理特权 ¶
向用户授予系统特权需要使用alter语句指定。系统特权不能进行转授,需要有系统特权的用户进行授予。例如,授予用户test特权:
ALTER USER test CREATEROLE;
系统加载 sysprivilege 插件后,可以使用grant语句向用户授予any管理特权,需要使用超级用户授予any权限。例如,向用户u1授予创建所有表的权限:
CREATE USER sys WITH SUPERUSER; SET SESSION AUTHORIZATION sys; GRANT CREATE ANY TABLE TO u1;
3.3.7.2. 向用户和角色授予对象权限 ¶
3.3.7.2.1. 关于授予对象权限 ¶
您可以使用GRANT语句向角色和用户授予对象权限,对象权限可以转授。要授予对象特权,用户必须满足下列条件之一:
-
拥有指定的对象。
-
用户已被授予超级用户特权或者any管理特权。
-
用户被授予对象特权时指定WITH GRANT OPTION子句,拥有转授的权利。
例如,使用test用户把表orders上的所有可用特权授予给用户u1,并允许用户u1转授权限:
GRANT ALL PRIVILEGES ON orders TO u1 WITH GRANT OPTION;
然后通过系统视图,可查询表对象的授权情况:
SELECT grantee, grantor, privilege, grantable,table_name FROM DBA_TAB_PRIVS WHERE table_name='orders' and owner = 'test'; grantee |grantor |privilege |grantable |table_name | --------+--------+-----------+----------+-----------+ u1 |test |REFERENCES |NO |orders | u1 |test |SELECT |NO |orders | u1 |test |UPDATE |NO |orders | u1 |test |INSERT |NO |orders |
3.3.7.2.2. 转授权限 ¶
如果指定了WITH ADMIN OPTION,成员接着可以把该角色中的成员关系授予给其他用户,也可以撤回该角色中的成员关系。如果没有管理选项,普通用户就不能做这些工作。一个角色不被认为持有自身的WITH ADMIN OPTION,但是它可以从一个会话用户匹配该角色的数据库会话中授予或撤回自身中的成员关系。数据库超级用户能够授予或撤回任何角色中任何人的成员关系。具有CREATEROLE 特权的角色能够授予或者撤回任何非超级用户角色中的成员关系。例如,如果表t1 被角色g1 拥有,u1 是它的一个成员,那么u1 可以把t1 上的特权授予给u2,但是那些特权将好像是直接由g1 授予的。角色g1 的任何其他成员可以稍后撤回它们。
3.3.7.2.3. 列级授权 ¶
您可以对表中的各个列授予 INSERT、UPDATE、REFERENCES权限。例如,授予用户u1表orders的orderid和orderdate列插入权限:
GRANT INSERT (orderid,orderdate) ON orders TO u1;
3.3.8. 撤销用户和角色权限 ¶
使用 REVOKE 语句和 ALTER USER 语句可以执行特定的权限撤销操作。当您撤销系统或对象权限时,请注意撤销权限的级联效应。
-
撤销系统特权
ALTER USER 语句可以撤销系统特权。
-
撤销对象特权
您可以使用 REVOKE 语句撤销多个对象权限、代表对象所有者的对象权限、列选择性对象权限和 REFERENCES 对象权限。
-
撤销权限的连锁效应
与 DDL 操作相关的撤销对象特权没有级联效应,但对象特权撤销有级联效应。
3.3.8.1. 撤销系统特权 ¶
在KingbaseES中,使用 ALTER USER 语句撤销用户特权。任何具有系统特权用户都可以撤销任何其他数据库用户或角色的特权。 撤销者不必是最初授予特权或角色的用户。 具有GREATEROLE的用户可以撤销任何角色。例如,撤销test用户的CREATEROLE权限:
ALTER USER test NOCREATEROLE;
3.3.8.2. 撤销对象权限 ¶
-
关于对象权限的撤销
要撤销对象特权,您必须满足相应的要求。
-
撤销多个对象特权
REVOKE 语句可以撤销对一个对象的多个权限。
-
代表对象所有者撤销对象特权
GRANT ANY OBJECT PRIVILEGE 系统特权可用于撤销对象所有者为授予者的任何对象特权。
-
撤销列选择性对象特权
特定于列的操作的 GRANT 和 REVOKE 操作具有不同的权限和限制。
-
撤销 REFERENCES 对象特权
当您撤销 REFERENCES 对象权限时,它会影响外键约束。
3.3.8.2.1. 关于撤销对象权限 ¶
要撤消对象特权,您必须满足相应的要求。这些要求满足以下条件之一:
-
已向用户或角色授予了对象权限。
-
用户拥有系统特权,能够代表对象所有者授予和撤消权限
您只能撤销您直接授权的特权。 您不能撤销您授予WITH GRANT OPTION 的其他用户的授权。 但是,有级联效应。 如果授予权限的用户的对象权限被撤销,那么使用 WITH GRANT OPTION 传播的对象权限授予也被撤销。
3.3.8.2.2. 撤销多个对象特权 ¶
REVOKE 语句可以撤销对一个对象的多个权限。
例如,撤销用户 u1 和 u2 对 orders 表的 INSERT和UPDATE权限:
REVOKE INSERT,UPDATE ON orders FROM u1, u2;
例如,撤销u1在orders表上的所有权限:
REVOKE ALL PRIVILEGES ON orders FROM u1 ;
3.3.8.2.3. 代表对象所有者撤销对象特权 ¶
用户只能回收由它直接授出的特权。如果一个用户持有一个带有授予选项的特权并且把它授予给了其他用户,那么被那些其他用户持有的该特权被称为依赖特权。如果第一个用户持有的该特权或者授予选项正在被收回且存在依赖特权,指定CASCADE可以连带回收那些依赖特权,不指定则会导致回收动作失败。这种递归回收只影响通过可追溯到该REVOKE命令的主体的用户链授予的特权。因此,如果该特权经由其他用户授予给受影响用户,受影响用户可能实际上还保留有该特权。
例如,如果用户A 已经把一个带有授予选项的特权授予给了用户B,并且用户B 接着把它授予给了用户C,那么用户A 无法直接从C 收回该特权。反而,用户A 可以从用户B 收回该授予选项并且使用CASCADE 选项,这样该特权会被依次从用户C 回收。对于另一个例子,如果A 和B 都把同一个特权授予给了C,A 能够收回它们自己的授权但不能收回B 的授权,因此C 实际上仍将拥有该特权。
3.3.8.2.4. 撤销列级权限 ¶
您可以撤销对表中的各个列的INSERT、UPDATE、REFERENCES权限。例如,撤销用户u1表orders的ORDERID和ORDERDATE列插入权限:
REVOKE INSERT (orderid,orderdate) ON orders FROM u1;
另外,在回收一个表上的特权时,也会在该表的每一个列上自动回收对应的列特权(如果有)。在另一方面,如果一个角色已经被授予一个表上的特权,那么从个别的列上回收同一个特权将不会生效。
3.3.8.3. 撤销权限的级联效应 ¶
与 DDL 操作相关的撤销对象特权没有级联效应,但对象特权撤销有级联效应。
-
撤销系统权限时的级联效应
当您撤销与 DDL 操作相关的系统特权时,没有级联效应。
-
撤销对象权限时的级联效果
撤销对象特权会产生级联效应。
3.3.8.3.1. 撤销系统权限时的级联效应 ¶
当您撤销与 DDL 操作相关的系统特权时,没有级联效应。无论授予权限时是否带有转授选项,这都适用。但如果是撤销对象被过程依赖则会有影响,例如,如果撤销用户的 SELECT ANY TABLE 权限,则在重新授权该权限之前,用户模式中包含的依赖此权限的所有过程都无法成功执行。
3.3.8.3.2. 撤销对象权限时的级联效应 ¶
撤销对象特权会产生级联效应。
请注意以下事项:
-
如果撤销 DML 对象权限,则依赖于 DML 对象权限的对象定义可能会受到影响。例如,存储过程中有对orders的插入操作,如果撤销用户对orders表的插入权限,则该过程将无法成功执行。
-
当从用户撤销表的 REFERENCES 特权时,由用户定义并需要已删除的 REFERENCES 特权的任何外键完整性约束都将自动删除。例如,假设用户u1被授予对 orders表的CUSTUMERID列的 REFERENCES 权限。u1在orders表中的custumerid列上创建一个外键,该外键引用了custumers表的custumerid列。如果取消了u1对orders表的custumerid列的REFERENCES 权限,那么在同一操作中删除了对orders表中的custumerid列的外键约束。
-
如果第一个用户持有的该特权或者授予选项正在被收回且存在依赖特权,指定CASCADE可以连带回收那些依赖特权,不指定则会导致回收动作失败。例如,u1 被授予对orders表的查询权限,并将此权限授予 u2。然后,撤销u1的查询权限,此 REVOKE 语句也级联到u2。任何依赖于 u1 和 u2 对该表的查询权限的对象也会受到影响。
3.3.9. 管理public角色 ¶
3.3.9.1. 关于public角色 ¶
在KingbaseES中,public是一个特殊的角色,在元数据表中都查不到该角色。但它确实是存在的,它默认拥有以下权限:
-
数据库:conncet,temp/temprary权限,与模式无关
任何新建的数据库,系统会自动为public角色赋予connect和在任何schema下创建临时表的权限。
-
public模式:usage,create权限,与数据库无关
在任何新建的数据库的public schema下有usage和create的权限。
-
函数:execute权限,仅限于public模式下
-
Language语言:usage权限,与模式无关
注意
-
public角色属于一个全局性的角色,这就意味着你所创建的角色都可以理解为是public角色组成员;
-
对public权限的继承完全不受noinherit的控制,一旦创建了一个拥有login权限的角色,它会立即继承拥有上述权限,此时如果想通过revoke(比如revoke connect on database)来回收的话不会成功,因为这是通过组-组成员来继承的,这种继承权限无法通过单纯的对角色成员revoke掉,只能对组进行revoke,通过继承来实现回收。
3.3.9.2. 授予和撤销public角色权限 ¶
因为每个数据库用户都可以访问 public,所以每个数据库用户都可以访问授予 public 的所有权限和角色。仅当每个数据库用户都需要特权时,安全管理员和数据库用户才应将特权或角色授予 public。 任何特定角色拥有的特权包括直接授予给它的特权、从它作为其成员的角色中得到的特权以及授予给public 的特权。public角色权限有以下特性:
-
数据库中存在一个全局public角色,它不具体存在,但会影响到数据库中已有或将有角色的权限
-
Public就像一个public组,数据库中所有角色默认继承其权限
-
数据库中角色继承的权限不能仅仅对角色进行revoke,这样是不会成功的,只有通过对其所在组的权限进行revoke才可以
因此,从 public 收回 SELECT 特权并不一定会意味着所有角色都会失去在该对象上的SELECT 特权。那些直接被授予的或者通过另一个角色被授予的角色仍然会拥有它。类似地,从一个用户收回 SELECT后,如果 public或者另一个成员关系角色仍有 SELECT权利,该用户还是可以使用SELECT。
示例1 用户自动继承public权限
--Step1:创建用户u1 \c test1 system Create user u1; --Step2:用户登录数据库 \c test1 u1 --Step3:创建表 Create table t1(id int); Create temp table tmp1(id int); test=# CREATE DATABASE test1; CREATE DATABASE test=#testl system 您现在已经连接到数据库"testl",用户"system" testl=# create user ul; CREATE ROLE testl=\c testl ul 您现在已经连接到数据库"testl",用户"ul" testl=> Create table tl(id int); CREATE TABLE testl=> Create temp table tmpl(id int); CREATE TABLE --可见,新建用户是自动继承public角色的权限的。
示例2 revoke继承public的权限
--Step1:收回权限 \c test1 system Revoke connect on database test1 from u1; Revoke create on schema public from u1; --step2:验证权限 \c test u1 Create table t2(id int); \d testl>\c testl system 您现在已经连接到数据库"testl",用户"system". testl=# Revoke connect on database testl from ul ; WARNING: unable to revoke privilege not granted. REVOKE testl=# Revoke create on schema public from ul; WARNING: unable to revoke privilege not granted. REVOKE testl=# \c testl ul 您现在已经连接到数据库"testl",用户"ul". testl=> create table t2(id int) CREATE TABLE testl=> \d 关联列表 架构模式| 名称 | 类型 | 拥有者 | -------+---------------------+--------+--------+ public | sys statstatements | 视图 | system | public | tl | 数据表 | ul | public | t2 | 数据表 | ul | (3 行记录) --由此可见connect和create on schema public的权限并没有收回。
示例3 revoke public角色的权限
--step1:回收connect权限 \c test1 system Revoke connect on database test1 from public; \c test1 u1 test1=>\c test1 system 您现在已经连接到数据库"testl",用户"system". testl=# Revoke connect on database test1 from public; REVOKE testl=# \c test1 ul Fatal: permission denied for database”test1” 描述:User does not have CONNECT privilege. 保留上一次连接 --用户没有connect权限了 --Step2:回收create权限 \c test1 system Grant connect on database test1 to u1; \c test1 system Revoke all on schema public from public; \c test1 u1 Create table t3(id int); test1=#\c test1 system 您现在已经连接到数据库"test1",用户"system" test1=# Grant connect on database test1 to ul; GRANT test1=# \c test1 system 您现在已经连接到数据库"test1",用户"system" test1=# Revoke all on schema public from Public REVOKE test1=# \c test1 ul 您现在已经连接到数据库"test1",用户"ul". test1=> Create table t3(id int); ERROR: no schema has been selected to create in 第1行 Create table t3(id int): --u1用户已经没有在public schema下创建表的权限了
3.3.10. SET ROLE的使用 ¶
3.3.10.1. 授权和撤销的生效时间 ¶
根据授予或撤销的内容,授予或撤销在不同时间生效:
-
向任何内容用户和角色的系统特权、对象特权授予和撤销将立即生效。
-
仅当当前用户会话使用SET ROLE语句后,重新启用角色时,或者在授予或撤消后创建新的用户会话时,向任何用户、其他角色授予和撤销角色的所有授权和撤销才会生效。
您可以通过查询 SESSION_USER和CURRENT_USER查看当前启用的角色。
3.3.10.2. SET ROLE 语句 ¶
在用户会话期间,用户或应用程序可以使用SET ROLE语句任意次数来更改当前为会话启用的角色。必须已向用户授予在语句中命名的角色。
例如,设置当前会话角色为paul:
SELECT SESSION_USER, CURRENT_USER; session_user | current_user --------------+-------------- peter | peter SET ROLE 'paul'; SELECT SESSION_USER, CURRENT_USER; session_user | current_user --------------+-------------- peter | paul
例如,使用 SET ROLE 禁用所有角色:
SET ROLE NONE;
3.3.11. 用户权限和角色的系统视图和字典 ¶
您可以使用系统视图和字典查找有关各种类型的权限和角色授予的信息,如下表所示:
视图和字典 |
描述 |
---|---|
sys_user |
所有用户信息 |
sys_roles |
所有角色信息 |
DBA_TAB_PRISV |
被授权者的所有对象的授权 |
SESSION_USER |
当前会话角色 |
CURRENT_USER |
当前角色 |
sys_sysprivilege |
所有拥有系统ANY权限的用户。 |
user_any_privs |
每个用户只可以查看自己的拥有的ANY权限。 |
另请参阅
了解更多系统表和视图参见《 KingbaseES数据库参考手册 》中的 静态数据词典视图 章节
3.3.11.1. 查询所有的用户和角色的系统授权信息 ¶
可以使用系统视图sys_user或者sys_roles查询用户被授予的系统特权:
select usename,usesysid,usecreatedb,usesuper,userepl,usebypassrls from sys_user; usename |usesysid |usecreatedb |usesuper |userepl |usebypassrls | --------+---------+------------+---------+--------+-------------+ system |10 |true |true |true |true | sao |9 |false |false |false |false | sso |8 |false |false |false |false | u1 |16603 |true |false |false |false | test |16394 |false |false |false |false | rr |16606 |false |true |false |false | t1 |16604 |false |false |false |false |
3.3.11.2. 查询所有用户和角色的对象授权信息 ¶
可以使用系统视图DBA_TAB_PRIVS查询用户被授予的表对象的信息:文章来源:https://www.toymoban.com/news/detail-814573.html
SELECT * FROM DBA_TAB_PRIVS WHERE grantee = 'test'; grantee |owner |table_name |grantor |privilege |grantable | --------+-------+-----------+--------+-----------+----------+ test |system |orders |system |SELECT |NO | test |system |orders |system |INSERT |NO | test |system |orders |system |UPDATE |NO | test |system |orders |system |REFERENCES |NO |
3.3.11.3. 查询当前会话的角色信息 ¶
使用SESSION_USER和CURRENT_USER可以查询到当前用户角色,和当前会话的角色:文章来源地址https://www.toymoban.com/news/detail-814573.html
SELECT SESSION_USER, CURRENT_USER; session_user |current_user | -------------+-------------+ system |system |
到了这里,关于Kingbase安全之权限和角色管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!