文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF(US Ltr) - 39.9Mb
PDF(A4) - 40.0Mb
手册页(TGZ) - 258.5Kb
手册页(Zip) - 365.5Kb
Info(Gzip) - 4.0Mb
Info(Zip) - 4.0Mb


15.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 8.2.4, “Specifying Account Names”)
  | role (see Section 8.2.5, “Specifying Role Names”
}

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

有关权限存在级别、允许的 priv_typepriv_levelobject_type 值以及指定用户和密码的语法的详细信息,请参见 第 15.7.1.6 节,“GRANT 语句”

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

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

所有显示的 REVOKE 表单都支持 IF EXISTS 选项以及 IGNORE UNKNOWN USER 选项。如果没有这些修改,REVOKE 对于所有命名的用户和角色都成功,或者回滚并且没有效果,如果出现任何错误;该语句仅在对所有命名的用户和角色成功时才写入二进制日志。IF EXISTSIGNORE 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 EXISTSIGNORE 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 EXISTSIGNORE 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。请参阅 第 15.7.1.5 节,“DROP USER 语句”

如果授权表包含包含混合大小写数据库或表名的权限行,并且 lower_case_table_names 系统变量设置为非零值,则 REVOKE 无法用于撤销这些权限。在这种情况下,有必要直接操作授权表。(GRANTlower_case_table_names 设置时不会创建此类行,但此类行可能已在设置变量之前创建。只能在初始化服务器时配置 lower_case_table_names 设置。)

mysql 程序成功执行时,REVOKE 会响应 Query OK, 0 rows affected。要确定操作后剩余的权限,请使用 SHOW GRANTS。请参阅 第 15.7.7.22 节,“SHOW GRANTS 语句”