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”
}
The 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
对于所有命名的用户和角色都成功,或者回滚并且没有效果,如果出现任何错误;该语句仅在对所有命名的用户和角色成功时才写入二进制日志。IF EXISTS
和 IGNORE UNKNOWN USER
的确切效果将在本节后面讨论。
每个帐户名都使用 第 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
权限,或对 mysql
系统模式的 UPDATE
权限。
REVOKE
关键字后跟一个或多个角色名的语法采用 FROM
子句,该子句指示要撤销角色的一个或多个用户或角色。
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
在一起使用时,在尝试删除强制权限的语句中,通常由尝试执行此操作引发的错误会降级为警告;该语句成功执行,但不会进行任何更改。
撤销的角色会立即影响从其撤销的任何用户帐户,这样在帐户的任何当前会话中,其权限将在执行的下一个语句中进行调整。
撤销角色会撤销角色本身,而不是它所代表的权限。假设一个帐户被授予了一个包含给定权限的角色,并且还被明确地授予了该权限或另一个包含该权限的角色。在这种情况下,如果第一个角色被撤销,该帐户仍然拥有该权限。例如,如果一个帐户被授予两个包含 SELECT
的角色,则该帐户在撤销任一角色后仍然可以进行选择。
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 语句”。