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
对于所有命名的用户和角色都会成功,或者回滚并且没有效果,如果出现任何错误;该语句仅在对所有命名的用户和角色都成功时才会写入二进制日志。 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 语句”。