SET ROLE

语法说明

设置会话的活动/当前主要角色。为当前活动的主角色设置上下文,以确定当前用户是否拥有执行 CREATE <object> 语句或执行任何其他 SQL 操作所需的权限。

除了创建对象之外,任何 SQL 操作的授权都可以由次级角色执行。

语法结构

  1. > SET SECONDARY ROLE {
  2. NONE
  3. | ALL
  4. }
  5. SET ROLE role

语法说明

角色是权限的集合,一个用户可以对应多个角色。

例如,user1 拥有主要角色 role1,次要角色 role2 和 role3, role1 被授予 pri1 和 pri2 权限;role2 被赋予权限 pri3;role3 被赋予权限 pri4,授权示例表如下:

用户名角色名权限名
user1role1pri1,pri2
role2pri3
role3pri4

为了更容易理解,你可以参考如下示例:

用户角色权限名
Tom应用开发者(Application Developer)读数据(Read Data),写数据(Write Data)
运维专家(O&M expert)读数据(Read data)
数据库管理员(Database Administrator)管理员权限(Administrator Privileges)

此时 Tom 的主要角色是应用开发者,Tom 需要调用管理员权限,那么 Tom 可以使用以下两种方法:

—使用 SET role role 语句将其角色切换为“数据库管理员”。

—如果需要使用主、从角色的所有权限,可以使用 SET secondary ROLE all

这两种语句解释如下:

SET SECONDARY ROLE ALL

将该用户所有的 ROLE 取并集。

SET SECONDARY ROLE NONE

将除 PRIMARY ROLE 之外的所有角色从当前会话中去除。

SET ROLE role

将当前角色切换为新角色。

示例

  1. > drop role if exists use_role_1,use_role_2,use_role_3,use_role_4,use_role_5;
  2. > drop user if exists use_user_1,use_user_2;
  3. > drop database if exists use_db_1;
  4. > create role use_role_1,use_role_2,use_role_3,use_role_4,use_role_5;
  5. > create database use_db_1;
  6. > create user use_user_1 identified by '123456' default role use_role_1;
  7. -- 把所有表的 selectinsert update 权限授权给 use_role_1
  8. > grant select ,insert ,update on table *.* to use_role_1;
  9. -- 把数据库的所有权限授权给 use_role_2
  10. > grant all on database * to use_role_2;
  11. -- 把角色 use_role_2 分配给用户 use_user_1
  12. > grant use_role_2 to use_user_1;
  13. -- 创建表 use_table_1
  14. > create table use_db_1.use_table_1(a int,b varchar(20),c double );
  15. -- 设置用户 use_user_1 主要角色和次要角色全部可用
  16. > set secondary role all;
  17. -- 查看用户 use_user_1 现在拥有的权限
  18. > show grants for 'use_user_1'@'localhost';
  19. +-----------------------------------------------------------+
  20. | Grants for use_user_1@localhost |
  21. +-----------------------------------------------------------+
  22. | GRANT select ON table *.* `use_user_1`@`localhost` |
  23. | GRANT insert ON table *.* `use_user_1`@`localhost` |
  24. | GRANT update ON table *.* `use_user_1`@`localhost` |
  25. | GRANT connect ON account `use_user_1`@`localhost` |
  26. | GRANT database all ON database * `use_user_1`@`localhost` |
  27. +-----------------------------------------------------------+
  28. 5 rows in set (0.01 sec)
  29. -- 可以看到,用户 use_user_1 拥有默认的连接 MatrixOne 的权限 connect;也拥有对所有表的 selectinsert update 权限,同时也拥有对数据库的全部权限