REVOKE
描述
该语句用于撤销之前分配给用户或角色的权限,或者撤销用户或角色中的角色。
使用限制及注意事项
- 撤销对象权限操作不会级联。例如,用户
user1给user2授予了某些权限,撤回user1的权限不会同时也撤回user2的相应权限。 - 需要撤销权限的用户或者角色必须存在,否则将报错。
- 系统变量
mandatory_roles中的角色不能撤销。 - 执行
REVOKE语句会对当前登录的用户立即生效。
权限要求
-
撤销特定权限级别权限:用户必须拥有被撤销的权限(例如,
user1要撤销user2对表t1的SELECT权限,则user1必须拥有表t1的SELECT的权限),并且拥有GRANT OPTION权限。 -
撤销所有权限和授予选项:撤销
ALL PRIVILEGES和GRANT OPTION权限时,当前用户必须拥有全局GRANT OPTION权限,或者对权限表的UPDATE及DELETE权限。 -
撤销用户或角色中角色权限:撤销角色时,当前用户必须拥有被撤销的角色,并且拥有
ADMIN OPTION权限,才能撤销成功。
有关 seekdb 权限的详细介绍,参见 seekdb 的权限分类。
语法
撤销用户或角色的对象权限
revoke_stmt1:
REVOKE grant_privileges ON priv_level FROM user_or_role_list;
revoke_stmt2:
REVOKE ALL [PRIVILEGES], GRANT OPTION FROM user_or_role_list;
revoke_stmt3:
REVOKE [IF EXISTS] role_name_list FROM user_or_role_list [IGNORE UNKNOWN USER];
grant_privileges:
priv_type_list
| ALL [PRIVILEGES]
priv_type_list:
priv_type[(column_name_list)] [, priv_type[(column_name_list)] ...]
column_name_list:
column_name [, column_name ...]
priv_level:
*.*
| db_name.*
| db_name.table_name
| CATALOG external_catalog_name
user_or_role_list:
user_or_role [, user_or_role ...]
user_or_role:
user_name | role_name
role_name_list:
role_name [, role_name ...]
参数解释
| 参数 | 描述 |
|---|---|
| revoke_stmt1 | 从用户或角色中撤销特定权限级别权限的 SQL 语句。 |
| revoke_stmt2 | 从用户或角色中撤销所有权限和授予选项的 SQL 语句。 |
| revoke_stmt3 | 从用户或角色中撤销角色的 SQL 语句。 |
| grant_privileges | 指定需要撤销的权限类型,可以是特定权限类型的列表,也可以是所有权限(GRANT OPTION 除外)。 |
| priv_type_list | 表示具体的权限类型列表。同时撤销多个授权时,权限间使用英文逗号(,)隔开。 |
| priv_type | 表示具体的权限类型。具体的权限类型的详细介绍,seekdb 的权限分类。注意:PROXY 参数当前版本仅记录该关键字语法,功能不生效。 |
| column_name_list | 可选项,撤销表中的列级权限的列表。如果不指定,则撤销整个表或对象的权限。 |
| ALL [PRIVILEGES] | 表示除 GRANT OPTION 以外所有权限。 |
| priv_level | 指定授予权限的层级。权限层级的具体取值介绍可参见下文 priv_level。 |
| user_or_role_list | 指定需要撤销权限的用户或角色列表。同时撤销多个用户或角色的授权时,用户和角色名用英文逗号(,)隔开。 |
| user_name | 表示用户名称。 |
| role_name | 表示角色名称。 |
| IF EXISTS | 可选项,当撤销的角色不存在时,如果使用了 IF EXISTS 选项,系统将发出警告而非错误消息。 |
| role_name_list | 指定需要撤销的角色列表。同时撤销多个角色时,角色名用英文逗号(,)隔开。 |
| IGNORE UNKNOWN USER | 可选项,当被授权者(用户或角色)不存在时,如果使用了 IGNORE UNKNOWN USER 选项,系统将发出警告而非错误消息。 |
| proxy | 当前版本仅记录该关键字语法,功能不生效。 |
priv_level
-
*.*:表示所有数据库中的所有表。示例如下:
从用户
user001和user002中撤销全局的SELECT和INSERT权限。REVOKE SELECT, INSERT ON *.* FROM user001, user002; -
db_name.*:表示指定数据库中的所有表。db_name表示指定数据库的数据库名称。示例如下:
从用户
user003中撤销对test数据库中所有表的插入权限。REVOKE INSERT ON test.* FROM user003; -
db_name.table_name:表示特定数据库中的特定表。示例如下:
从用户
user003中撤销对test数据库中的tbl2表的SELECT权限。REVOKE SELECT ON test.tbl2 FROM user003; -
CATALOG external_catalog_name:表示 Catalog 中的目录。示例如下:
从用户
user004中撤销对 Catalog 的对象test_odps_catalog的USE CATALOG权限。。REVOKE USE CATALOG ON CATALOG test_odps_catalog FROM user004;
示例
示例一:撤销对象权限
通过撤销 test_user001 用户的 SELECT 权限,查看 ALL PRIVILEGES 授予了哪些权限。
-
给用户
test_user001授予ALL PRIVILEGES权限。GRANT ALL PRIVILEGES ON *.* TO test_user001; -
查看用户
test_user001拥有的授权。SHOW GRANTS FOR test_user001;返回结果如下:
+-----------------------------------------------+
| Grants for test_user001@% |
+-----------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'test_user001' |
+-----------------------------------------------+
1 row in set (0.001 sec) -
撤销用户
test_user001的SELECT权限。REVOKE SELECT ON *.* FROM test_user001; -
再次查看用户
test_user001拥有的授权。SHOW GRANTS FOR test_user001;