REVOKE [IF EXISTS]
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM user_or_role [, user_or_role] ...
[IGNORE UNKNOWN USER]
REVOKE [IF EXISTS] ALL [PRIVILEGES], GRANT OPTION
FROM user_or_role [, user_or_role] ...
[IGNORE UNKNOWN USER]
REVOKE [IF EXISTS] PROXY ON user_or_role
FROM user_or_role [, user_or_role] ...
[IGNORE UNKNOWN USER]
REVOKE [IF EXISTS] role [, role ] ...
FROM user_or_role [, user_or_role ] ...
[IGNORE UNKNOWN USER]
user_or_role: {
user (see Section 8.2.4, “Specifying Account Names”)
| role (see Section 8.2.5, “Specifying Role Names”
}
该REVOKE
语句使系统管理员能够撤销权限和角色,这些权限和角色可以从用户账户和角色中撤销。
有关权限存在的级别、可接受的priv_type
、priv_level
和object_type
值,以及指定用户和密码的语法,请参阅第 15.7.1.6 节,“GRANT 语句”。
有关角色的信息,请参阅第 8.2.10 节,“使用角色”。
当read_only
系统变量启用时,REVOKE
需要CONNECTION_ADMIN
或SUPER
权限,除了其他所需权限外,如下所述。
所有显示的REVOKE
形式都支持IF EXISTS
选项和IGNORE UNKNOWN USER
选项。如果没有这些修改,REVOKE
要么成功地撤销所有命名用户和角色,要么回滚并且没有效果,如果发生任何错误;该语句仅在成功地撤销所有命名用户和角色时写入二进制日志中。该语句的精确效果将在本节后面讨论。
每个账户名称使用第 8.2.4 节,“指定账户名称”中描述的格式。每个角色名称使用第 8.2.5 节,“指定角色名称”中描述的格式。例如:
REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost';
REVOKE 'role1', 'role2' FROM 'user1'@'localhost', 'user2'@'localhost';
REVOKE SELECT ON world.* FROM 'role3';
如果省略主机名部分,默认为'%'
。
要使用第一个REVOKE
语法,您必须拥有GRANT OPTION
权限,并且您必须拥有要撤销的权限。
要撤销所有权限,请使用第二种语法,该语法删除所有全局、数据库、表、列和例程权限:
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM user_or_role [, user_or_role] ...
REVOKE ALL PRIVILEGES, GRANT OPTION
不撤销任何角色。
要使用该REVOKE
语法,您必须拥有全局CREATE USER
权限或UPDATE
权限用于mysql
系统模式。
该语法,其中REVOKE
关键字后跟一个或多个角色名称,带有一个FROM
子句,指示从哪些用户或角色中撤销角色。
该REVOKE
语句的IF EXISTS
和IGNORE UNKNOWN USER
选项具有以下效果:
-
IF EXISTS
意味着,如果目标用户或角色存在,但没有找到任何权限或角色分配给目标用户或角色,警告将被抛出,而不是错误;如果没有权限或角色被分配给目标用户或角色,该语句没有其他效果。否则,REVOKE
语句正常执行;如果用户不存在,该语句抛出错误。示例:假设我们在数据库
test
中有表t1
,我们执行以下语句,结果如下所示。mysql> CREATE USER jerry@localhost; Query OK, 0 rows affected (0.01 sec) mysql> REVOKE SELECT ON test.t1 FROM jerry@localhost; ERROR 1147 (42000): There is no such grant defined for user 'jerry' on host 'localhost' on table 't1' mysql> REVOKE IF EXISTS SELECT ON test.t1 FROM jerry@localhost; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Warning Code: 1147 Message: There is no such grant defined for user 'jerry' on host 'localhost' on table 't1' 1 row in set (0.00 sec)
IF EXISTS
使错误降级为警告,即使权限或角色不存在,或者语句尝试在错误级别分配权限或角色。 -
如果
REVOKE
语句包括IGNORE UNKNOWN USER
,则语句将为任何目标用户或角色抛出警告,但找不到该语句命名的目标用户或角色;如果没有目标用户或角色存在,REVOKE
语句成功,但没有实际效果。否则,语句正常执行,并尝试撤销未分配给目标用户或角色的权限将抛出错误,如预期那样。示例(继续上一个示例):
mysql> DROP USER IF EXISTS jerry@localhost; Query OK, 0 rows affected (0.01 sec) mysql> REVOKE SELECT ON test.t1 FROM jerry@localhost; ERROR 1147 (42000): There is no such grant defined for user 'jerry' on host 'localhost' on table 't1' mysql> REVOKE SELECT ON test.t1 FROM jerry@localhost IGNORE UNKNOWN USER; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Warning Code: 3162 Message: Authorization ID jerry does not exist. 1 row in set (0.00 sec)
-
组合使用
IF EXISTS
和IGNORE UNKNOWN USER
意味着REVOKE
永远不会因为未知目标用户或角色或未分配或不可用的权限而引发错误,而是成功执行;角色或权限从现有目标用户或角色中删除,任何无法删除的权限将引发警告并执行为NOOP
。示例(继续上一项的示例):
# No such user, no such role mysql> DROP ROLE IF EXISTS Bogus; Query OK, 0 rows affected, 1 warning (0.02 sec) mysql> SHOW WARNINGS; +-------+------+----------------------------------------------+ | Level | Code | Message | +-------+------+----------------------------------------------+ | Note | 3162 | Authorization ID 'Bogus'@'%' does not exist. | +-------+------+----------------------------------------------+ 1 row in set (0.00 sec) # This statement attempts to revoke a nonexistent role from a nonexistent user mysql> REVOKE Bogus ON test FROM jerry@localhost; ERROR 3619 (HY000): Illegal privilege level specified for test # The same, with IF EXISTS mysql> REVOKE IF EXISTS Bogus ON test FROM jerry@localhost; ERROR 1147 (42000): There is no such grant defined for user 'jerry' on host 'localhost' on table 'test' # The same, with IGNORE UNKNOWN USER mysql> REVOKE Bogus ON test FROM jerry@localhost IGNORE UNKNOWN USER; ERROR 3619 (HY000): Illegal privilege level specified for test # The same, with both options mysql> REVOKE IF EXISTS Bogus ON test FROM jerry@localhost IGNORE UNKNOWN USER; Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql> SHOW WARNINGS; +---------+------+--------------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------------+ | Warning | 3619 | Illegal privilege level specified for test | | Warning | 3162 | Authorization ID jerry does not exist. | +---------+------+--------------------------------------------+ 2 rows in set (0.00 sec)
在 mandatory_roles
系统变量值中命名的角色不能被撤销。当 IF EXISTS
和 IGNORE UNKNOWN USER
一起使用在尝试删除强制权限的语句中,通常由尝试执行此操作引发的错误将降级为警告;语句执行成功,但不进行任何更改。
撤销角色立即影响从中撤销的任何用户帐户,以便在当前会话中调整其权限,以便执行下一个语句。
撤销角色撤销该角色本身,而不是它所代表的权限。例如,如果帐户被授予一个角色,该角色包括某个权限,并且该帐户也被明确授予该权限或另一个角色,该帐户仍然拥有该权限,即使第一个角色被撤销。
REVOKE ALL ON *.*
(在全局级别)撤销所有授予的静态全局权限和所有授予的动态权限。
撤销的权限,如果授予但服务器不知道,将以警告形式撤销。这情况可能发生在动态权限中。例如,动态权限可以在组件安装时授予,但如果该组件随后被卸载,权限将变为未注册,尽管拥有该权限的帐户仍然拥有该权限,可以从中撤销。
REVOKE
删除权限,但不删除 mysql.user
系统表中的行。要完全删除用户帐户,请使用 DROP USER
。见 第 15.7.1.5 节,“DROP USER 语句”。
如果授权表中包含混合大小写的数据库或表名,并且 lower_case_table_names
系统变量设置为非零值,则 REVOKE
不能用于撤销这些权限。在这种情况下,需要直接操作授权表。(GRANT
不会在 lower_case_table_names
设置时创建这样的行,但这些行可能是在设置变量之前创建的。lower_case_table_names
设置只能在服务器初始化时配置。)
当从 mysql 程序成功执行时,REVOKE
将响应 Query OK, 0 rows affected
。要确定操作后剩余的权限,请使用 SHOW GRANTS
。见 第 15.7.7.22 节,“SHOW GRANTS 语句”。