Documentation Home

13.7.1.8 REVOKE 语句

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 6.2.4, “Specifying Account Names”)
  | role (see Section 6.2.5, “Specifying Role Names”
}

REVOKE语句使系统管理员能够撤销权限和角色,这些权限和角色可以从用户帐户和角色中撤销。

有关权限级别、允许priv_type的 、 priv_levelobject_type值以及指定用户和密码的语法的详细信息,请参阅第 13.7.1.6 节,“GRANT 语句”

有关角色的信息,请参阅第 6.2.10 节,“使用角色”

read_only启用系统变量 时,除了以下讨论中描述的任何其他所需权限之外 ,还REVOKE 需要CONNECTION_ADMIN或 权限(或已弃用的 权限)。SUPER

从 MySQL 8.0.30 开始,显示的所有形式都 REVOKE支持一个IF EXISTS选项和一个IGNORE UNKNOWN USER选项。如果没有这些修改, REVOKE要么对所有命名用户和角色成功,要么回滚并且如果发生任何错误则无效;仅当所有命名用户和角色都成功时,该语句才会写入二进制日志。IF EXISTS和的确切效果IGNORE UNKNOWN USER将在本节后面讨论。

每个帐户名都使用 第 6.2.4 节“指定帐户名”中描述的格式。每个角色名称都使用第 6.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子句,指示要从中撤销角色的一个或多个用户或角色。

和选项(MySQL 8.0.30IF EXISTSIGNORE UNKNOWN USER更高版本)具有此处列出的效果:

  • IF EXISTS意味着,如果目标用户或角色存在,但由于任何原因没有发现分配给目标的此类特权或角色,则会发出警告,而不是错误;如果没有将语句指定的特权或角色分配给目标,则该语句没有(其他)效果。否则,REVOKE 正常执行;如果用户不存在,则该语句会引发错误。

    示例:给定 t1数据库test,我们执行以下语句,并显示结果。

    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 EXISTSIGNORE UNKNOWN USER在试图删除强制特权的语句中一起使用时,通常由尝试执行此操作引发的错误将降级为警告;该语句成功执行,但未进行任何更改。

一个撤销的角色会立即影响它被撤销的任何用户帐户,这样在该帐户的任何当前会话中,它的权限都会为下一个执行的语句进行调整。

撤销角色会撤销角色本身,而不是它所代表的特权。假设一个帐户被授予一个包含给定权限的角色,并且还被显式授予该权限或另一个包含该权限的角色。在这种情况下,如果第一个角色被撤销,该帐户仍然拥有该特权。例如,如果一个帐户被授予两个角色,每个角色都包含SELECT,则该帐户在任一角色被撤销后仍然可以选择。

REVOKE ALL ON *.*(在全局级别)撤销所有授予的静态全局权限和所有授予的动态权限。

已授予但服务器不知道的已撤销权限将被撤销并发出警告。动态权限可能会出现这种情况。例如,可以在安装注册它的组件时授予动态权限,但如果随后卸载该组件,则该权限将变为未注册,尽管拥有该权限的帐户仍然拥有该权限,并且可以从他们那里撤销该权限。

REVOKE删除权限,但不会从mysql.user 系统表中删除行。要完全删除用户帐户,请使用 DROP USER。请参阅 第 13.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。请参阅 第 13.7.7.21 节,“SHOW GRANTS 语句”