目录
一、环境信息
名称 | 值 |
CPU | Intel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz |
操作系统 | CentOS Linux release 7.9.2009 (Core) |
内存 | 4G |
逻辑核数 | 4 |
GCDW版本 | 9.8.0.6.17 |
集群节点1IP | 192.168.142.10 |
二、概念
GCDW 的账户管理是基于角色的访问控制,对数据库操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。一旦用户被分配了适当的角色后,该用户就拥有此角色的所有操作权限。GCDW 的账户管理,不必在每次创建用户时都进行分配权限的操作,只要分配用户相应的角色即可,并且角色的权限变更比用户的权限变更要少得多,这样将简化用户的权限管理,减少系统的开销。
GCDW系统内置了3个系统角色,分别是ACCOUNTADMIN、SYSTEMADMIN、PUBLICADMIN。这三个系统角色禁止修改和删除。
编号 | 描述 |
1 | ACCOUNTADMIN为系统中的顶级角色,不允许将ACCOUNTADMIN角色授予其他角色(即ACCOUNTADMIN不允许作为任何角色的子角色)。ACCOUNTADMIN 角色具有最高级权限,可以操作账户中的所有对象。是SYSTEMADMIN和PUBLICADMIN的拥有者。 |
2 | SYSTEMADMIN角色拥有账户中创建 warehouse 和数据库(以及其他对象,不包括 user 和 role)的权限。是PUBLICADMIN的拥有者。 |
3 | PUBLICADMIN 角色是一个伪角色,它被自动授予账户中的每一个用户和角色。不允许将其他角色属于 PUBLICADMIN(即 PUBLICADMIN 不允许作为任何角色的父角色)。 |
三、用户相关系统表
1、CLOUD.ROLE
(1)字段解释
序号 | 列名 | 描述 |
1 | rolename | 角色的名字 |
2 | grant_users | 拥有该角色的用户列表 |
3 | grant_roles | 被赋予的角色列表 |
4 | sons | 子角色列表 |
5 | SELECT_PRIV | 角色是否具有 SELECT 权限 |
6 | INSERT_PRIV | 角色是否具有 INSERT 权限 |
7 | UPDATE_PRIV | 角色是否具有 UPDATE 权限 |
8 | DELETE_PRIV | 角色是否具有 DELETE 权限 |
9 | CREATE_PRIV | 角色是否具有 CREATE 权限 |
10 | DROP_PRIV | 角色是否具有 DROP 权限 |
11 | RELOAD_PRIV | 角色是否具有 RELOAD 权限 |
12 | PROCESS_PRIV | 角色是否具有 PROCESS 权限 |
13 | GRANT_PRIV | 角色是否具有 GRANT 权限 |
14 | REFERENCES_PRIV | 角色是否具有 REFERENCE 权限 |
15 | INDEX_PRIV | 角色是否具有 INDEX 权限 |
16 | ALTER_PRIV | 角色是否具有 ALTER 权限 |
17 | SHOW DATABASES_PRIV | 角色是否具有 SHOW DATABASES 权限 |
18 | SUPER_PRIV | 角色是否具有 SUPER 权限 |
19 | CREATE TEMPORARY TABLES_PRIV | 角色是否具有 CREATE 临时表权限 |
20 | LOCK TABLES_PRIV | 角色是否具有 LOCK 表权限 |
21 | EXECUTE_PRIV | 角色是否具有 EXECUTE 权限 |
22 | UNMASK_PRIV | 角色是否具有脱敏数据查看权限(当前版本无效) |
23 | CREATE VIEW_PRIV | 角色是否具有 CREATE VIEW 权限 |
24 | SHOW VIEW_PRIV | 角色是否具有 SHOW VIEW 权限 |
25 | CREATE ROUTINE_PRIV | 角色是否具有 CREATE ROUTINE 权限 |
26 | ALTER ROUTINE_PRIV | 角色是否具有 ALTER ROUTINE 权限 |
27 | CREATE USER_PRIV | 角色是否具有 CREATE USER 权限 |
28 | EVENT_PRIV | 角色是否具有 EVENT 权限 |
29 | TRIGGER_PRIV | 角色是否具有 TRIGGER 权限 |
30 | MODIFY_WAREHOUSE_PRIV | 角色是否具有 MODIFY WAREHOUSE 权限 |
31 | OPERATE_WAREHOUSE_PRIV | 角色是否具有 OPERATE WAREHOUSE 权限 |
32 | CREATE_FILE_FORMAT_PRIV | 角色是否具有 CREATE FILE FORMAT 权限 |
33 | CREATE_STAGE_PRIV | 角色是否具有 CREATE STAGE 权限 |
34 | STAGE_READ_PRIV | 角色是否具有 STAGE READ 权限 |
35 | STAGE_WRITE_PRIV | 角色是否具有 STAGE WRITE 权限 |
36 | FILE_FORMAT_USAGE_PRIV | 角色是否具有 FILE FORMAT USAGE 权限 |
37 | TABLESPACE_PRIV | 角色是否具有表空间相关权限 |
38 | UDF_PRIV | 角色是否具有C或python自定义函数相关权限 |
39 | create_time | 角色的创建时间 |
40 | owner | 角色的拥有者 |
41 | comment | 角色的注释信息 |
(2)示例
gbase> SELECT * FROM CLOUD.ROLE WHERE ROLENAME = 'ACCOUNTADMIN'\G;
*************************** 1. row ***************************
rolename: accountadmin
grant_users:
grant_roles: systemadmin
sons: systemadmin,publicadmin
SELECT_PRIV: Y
INSERT_PRIV: Y
UPDATE_PRIV: Y
DELETE_PRIV: Y
CREATE_PRIV: Y
DROP_PRIV: Y
RELOAD_PRIV: Y
PROCESS_PRIV: Y
GRANT_PRIV: Y
REFERENCES_PRIV: Y
INDEX_PRIV: Y
ALTER_PRIV: Y
SHOW DATABASES_PRIV: Y
SUPER_PRIV: Y
CREATE TEMPORARY TABLES_PRIV: Y
LOCK TABLES_PRIV: Y
EXECUTE_PRIV: Y
UNMASK_PRIV: Y
CREATE VIEW_PRIV: Y
SHOW VIEW_PRIV: Y
CREATE ROUTINE_PRIV: Y
ALTER ROUTINE_PRIV: Y
CREATE USER_PRIV: Y
EVENT_PRIV: Y
TRIGGER_PRIV: Y
MODIFY_WAREHOUSE_PRIV: Y
OPERATE_WAREHOUSE_PRIV: Y
CREATE_FILE_FORMAT_PRIV: Y
CREATE_STAGE_PRIV: Y
STAGE_READ_PRIV: Y
STAGE_WRITE_PRIV: Y
FILE_FORMAT_USAGE_PRIV: Y
TABLESPACE_PRIV: Y
UDF_PRIV: Y
create_time: NULL
owner:
comment:
1 row in set (Elapsed: 00:00:00.03)
四、实操
1、创建角色
(1)语法
CREATE ROLE rolename [COMMENT=’’];
(2)示例
gbase> CREATE ROLE ROLE_CZG COMMENT = 'Sun';
Query OK, 0 rows affected (Elapsed: 00:00:00.10)
2、重命名角色
(1)语法
RENAME ROLE <old_name> TO <new_name>;
(2)示例
gbase> RENAME ROLE ROLE_CZG TO ROLE_LZL;
Query OK, 0 rows affected (Elapsed: 00:00:00.05)
3、授予角色给用户
将角色 rolename 授予用户 username。当 username 使用该角色创建会话,会话中 username 将拥有该角色的权限。
(1)语法
GRANT ROLE rolename TO USER username;
(2)示例
gbase> GRANT ROLE ROLE_LZL TO USER CZG;
Query OK, 0 rows affected (Elapsed: 00:00:00.13)
4、授予角色给角色(角色继承)
授予角色给角色即设置角色的父角色,当前角色的权限也会传递给父角色。这是构造 GCDW 角色继承树的唯一语法.
使用建议:
1、 角色继承建议所有角色均在继承体系中,避免出现孤立的角色。
2、 尽量保证 systemadmin 角色可以找到一条继承线路到达每一个自建角色。
3、 继承树中,尽量将管理员自建角色挂载到 systemadmin 角色之下,publicadmin 角色之上。保证 accountadmin 角色为继承树中最高级角色,publicadmin 角色 为继承树中最低级角色。禁止形成环路。
4、 禁止将 accountadmin 角色授予给自建角色,禁止将自建角色授予给 publicadmin。即 accountadmin 不允许有父角色存在,publicadmin 不允许有子 角色存在。
(1)语法
GRANT ROLE rolename TO ROLE parent_rolename;
(2)示例
gbase> GRANT ROLE ROLE_LZL TO ROLE systemadmin;
Query OK, 0 rows affected (Elapsed: 00:00:00.04)
5、从用户中撤销角色
(1)语法
REVOKE ROLE rolename FROM USER username;
(2)示例
gbase> REVOKE ROLE ROLE_LZL FROM USER CZG;
Query OK, 0 rows affected (Elapsed: 00:00:00.05)
6、从角色中撤销角色
(1)语法
REVOKE ROLE rolename1 FROM ROLE rolename2;
(2)示例
gbase> REVOKE ROLE ROLE_LZL FROM ROLE systemadmin;
Query OK, 0 rows affected (Elapsed: 00:00:00.04)
7、OWNER 转移
GCDW 中数据库对象(库、表、存储过程、函数、EVENT、Warehouse 等)的 OWNER 默认为该对象创建者的角色。OWNER 对其拥有的对象具有完整的操作权限,包 括创建、删除、数据增删改查、以及将 OWNER 转移给其他角色等权限。同时 OWNER 又具有一定的隔离特性,OWNER 只能看到和操作自己在拥有的对象上 创建的内容,无法看到其他角色在其拥有的对象上创建的内容。
例如:A 库的 OWNER 为角色 r1,则 r1 在 A 库上有完整的操作权限,但是 r1 只 能看到和操作自己在 A 库上创建的对象。
OWNER 转移与权限无关,只与继承树有关。
(1)语法
TRANSFORM OWNERSHIP ON TYPE_OPTION name TO ROLE rolename;
(2)示例
gbase> SELECT * FROM CLOUD.ROLE WHERE ROLENAME = 'ROLE_LZL'\G;
*************************** 1. row ***************************
rolename: ROLE_LZL
grant_users: CZG
grant_roles:
sons: publicadmin
SELECT_PRIV: N
INSERT_PRIV: N
UPDATE_PRIV: N
DELETE_PRIV: N
CREATE_PRIV: N
DROP_PRIV: N
RELOAD_PRIV: N
PROCESS_PRIV: N
GRANT_PRIV: N
REFERENCES_PRIV: N
INDEX_PRIV: N
ALTER_PRIV: N
SHOW DATABASES_PRIV: N
SUPER_PRIV: N
CREATE TEMPORARY TABLES_PRIV: N
LOCK TABLES_PRIV: N
EXECUTE_PRIV: N
UNMASK_PRIV: N
CREATE VIEW_PRIV: N
SHOW VIEW_PRIV: N
CREATE ROUTINE_PRIV: N
ALTER ROUTINE_PRIV: N
CREATE USER_PRIV: N
EVENT_PRIV: N
TRIGGER_PRIV: N
MODIFY_WAREHOUSE_PRIV: N
OPERATE_WAREHOUSE_PRIV: N
CREATE_FILE_FORMAT_PRIV: N
CREATE_STAGE_PRIV: N
STAGE_READ_PRIV: N
STAGE_WRITE_PRIV: N
FILE_FORMAT_USAGE_PRIV: N
TABLESPACE_PRIV: N
UDF_PRIV: N
create_time: 2024-07-16 09:58:46
owner: accountadmin
comment: Sun
1 row in set (Elapsed: 00:00:00.03)
ERROR:
No query specified
gbase> TRANSFORM OWNERSHIP ON ROLE ROLE_LZL TO ROLE systemadmin;
ERROR 1758 (HY000): gcluster dal error: 192.168.142.10:can't transform owner ROLE role_lzl to role systemadmin.
gbase> TRANSFORM OWNERSHIP ON DATABASE CZG TO ROLE ROLE_LZL;
Query OK, 0 rows affected (Elapsed: 00:00:00.05)
角色转移给角色失败了,后续我也再摸索一下,和我的原OWNER是最高角色有关吗?
8、查看当前用户拥有的所有角色名称
(1)语法
SHOW ROLES;
(2)示例
gbase> SHOW ROLES;
+--------------+
| Role |
+--------------+
| accountadmin |
| systemadmin |
| publicadmin |
| ADMIN_ROLE |
| ROLE_LZL |
+--------------+
5 rows in set (Elapsed: 00:00:00.03)
9、查看当前用户正在使用的角色名称
(1)语法
SELECT ROLE();
(2)示例
gbase> SELECT ROLE();
+--------------+
| ROLE() |
+--------------+
| accountadmin |
+--------------+
1 row in set (Elapsed: 00:00:00.00)
10、删除角色
角色删除后,被删除角色的权限也同时被回收,继承树上父角色拥有的被删除子 角色的权限也将被回收,父角色自身的权限不受影响。
删除角色会使继承体系出现断层,需要及时将删除角色的原子角色及时 grant 给 新的角色。
指定角色被删除后,OWNER 为该角色的对象会转移 OWNER 为当前登录角色。
如果存在 default_role 为删除角色的用户,用户的 default_role 将改为 publicadmin, 需要及时将该用户的 default_role 更改为适当的角色。
(1)语法
DROP ROLE rolename;
(2)示例
gbase> DROP ROLE ROLE_LZL;
Query OK, 0 rows affected (Elapsed: 00:00:00.07)