• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • SHOW GRANTS语句

    SHOW GRANTS
        [FOR user_or_role
            [USING role [, role] ...]]
    
    user_or_role: {
        user (see Section 6.2.4, “Specifying Account Names”)
      | role (see Section 6.2.5, “Specifying Role Names”.
    }
    

    该语句以GRANT必须执行以重复特权和角色分配的语句的形式显示分配给MySQL用户帐户或角色的特权和角色。

    注意

    要显示MySQL帐户的非特权信息,请使用以下SHOW CREATE USER语句。请参见“ SHOW CREATE USER语句”。

    SHOW GRANTS需要系统架构的SELECT特权mysql,除了显示当前用户的特权和角色。

    要为命名帐户或角色SHOW GRANTS,请使用与GRANT语句相同的格式(例如'jeffrey'@'localhost'):

    mysql> SHOW GRANTS FOR 'jeffrey'@'localhost';
    +------------------------------------------------------------------	+
    | Grants for jeffrey@localhost                                     	|
    +------------------------------------------------------------------	+
    | GRANT USAGE ON *.* TO `jeffrey`@`localhost`                      	|
    | GRANT SELECT, INSERT, UPDATE ON `db1`.* TO `jeffrey`@`localhost` 	|
    +------------------------------------------------------------------	+
    

    如果省略主机部分,则默认为'%'。有关指定帐户和角色名称的更多信息,请参见“账户权限控制”和“指定角色名称”。

    要显示授予当前用户(用于连接服务器的帐户)的特权,可以使用以下任何语句:

    SHOW GRANTS;
    SHOW GRANTS FOR CURRENT_USER;
    SHOW GRANTS FOR CURRENT_USER();
    

    如果SHOW GRANTS FOR CURRENT_USER在定义程序上下文中使用(或任何等效语法),例如在以定义程序而不是调用程序特权执行的存储过程中,则显示的授权是定义程序的授权,而不是调用程序的授权。

    与以前的系列相比,在MySQL 8.0中,SHOW GRANTS不再ALL PRIVILEGES在其全局特权输出中显示,因为ALL PRIVILEGES全局级别的含义取决于定义的动态特权而有所不同。而是SHOW GRANTS明确列出每个授予的全局特权:

    mysql> SHOW GRANTS FOR 'root'@'localhost';
    +---------------------------------------------------------------------	+
    | Grants for root@localhost                                           	|
    +---------------------------------------------------------------------	+
    | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD,         	|
    | SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES,  	|
    | SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION   	|
    | SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE,  	|
    | ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE,      	|
    | CREATE ROLE, DROP ROLE ON *.* TO `root`@`localhost` WITH GRANT      	|
    | OPTION                                                              	|
    | GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        	|
    +---------------------------------------------------------------------	+
    

    处理SHOW GRANTS输出的应用程序应进行相应调整。

    在全局级别上,GRANT OPTION适用于所有授予的静态全局特权(如果已为它们中的任何一个授予),但分别应用于授予的动态特权。SHOW GRANTS以这种方式显示全局特权:

    • 一行列出所有已授予的静态特权(如果有的WITH GRANT OPTION话),包括适当的话。
    • 一行列出了所有已授予的动态特权GRANT OPTION(如果有的话),包括WITH GRANT OPTION
    • 一行列出了所有授予的动态特权GRANT OPTION,如果没有,则不授予该特权WITH GRANT OPTION

    通过可选USING子句,SHOW GRANTS您可以检查与用户角色相关联的特权。USING子句中命名的每个角色都必须授予用户。

    假设为用户u1分配了角色r1r2,如下所示:

    CREATE ROLE 'r1', 'r2';
    GRANT SELECT ON db1.* TO 'r1';
    GRANT INSERT, UPDATE, DELETE ON db1.* TO 'r2';
    CREATE USER 'u1'@'localhost' IDENTIFIED BY 'u1pass';
    GRANT 'r1', 'r2' TO 'u1'@'localhost';
    

    SHOW GRANTSUSING显示授予的角色:

    mysql> SHOW GRANTS FOR 'u1'@'localhost';
    +---------------------------------------------	+
    | Grants for u1@localhost                     	|
    +---------------------------------------------	+
    | GRANT USAGE ON *.* TO `u1`@`localhost`      	|
    | GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost` 	|
    +---------------------------------------------	+
    

    添加USING子句会使该语句还显示与该子句中命名的每个角色相关联的特权:

    mysql> SHOW GRANTS FOR 'u1'@'localhost' USING 'r1';
    +---------------------------------------------	+
    | Grants for u1@localhost                     	|
    +---------------------------------------------	+
    | GRANT USAGE ON *.* TO `u1`@`localhost`      	|
    | GRANT SELECT ON `db1`.* TO `u1`@`localhost` 	|
    | GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost` 	|
    +---------------------------------------------	+
    mysql> SHOW GRANTS FOR 'u1'@'localhost' USING 'r2';
    +-------------------------------------------------------------	+
    | Grants for u1@localhost                                     	|
    +-------------------------------------------------------------	+
    | GRANT USAGE ON *.* TO `u1`@`localhost`                      	|
    | GRANT INSERT, UPDATE, DELETE ON `db1`.* TO `u1`@`localhost` 	|
    | GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost`                 	|
    +-------------------------------------------------------------	+
    mysql> SHOW GRANTS FOR 'u1'@'localhost' USING 'r1', 'r2';
    +---------------------------------------------------------------------	+
    | Grants for u1@localhost                                             	|
    +---------------------------------------------------------------------	+
    | GRANT USAGE ON *.* TO `u1`@`localhost`                              	|
    | GRANT SELECT, INSERT, UPDATE, DELETE ON `db1`.* TO `u1`@`localhost` 	|
    | GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost`                         	|
    +---------------------------------------------------------------------	+
    
    注意

    授予帐户的特权始终有效,但角色无效。帐户的活动角色在会话之间和会话中可能有所不同,具体取决于activate_all_roles_on_login系统变量的值,帐户默认角色以及是否SET ROLE已在会话中执行。

    MySQL 8.0.16和更高版本支持部分撤销全局特权,这样可以限制全局特权不能应用于特定的模式(请参见“使用部分撤销的特权限制”)。为了表明已撤销特定模式的全局模式特权,SHOW GRANTS输出包括以下REVOKE语句:

    mysql> SET PERSIST partial_revokes = ON;
    mysql> CREATE USER u1;
    mysql> GRANT SELECT, INSERT, DELETE ON *.* TO u1;
    mysql> REVOKE SELECT, INSERT ON mysql.* FROM u1;
    mysql> REVOKE DELETE ON world.* FROM u1;
    mysql> SHOW GRANTS FOR u1;
    +--------------------------------------------------	+
    | Grants for u1@%                                  	|
    +--------------------------------------------------	+
    | GRANT SELECT, INSERT, DELETE ON *.* TO `u1`@`%`  	|
    | REVOKE SELECT, INSERT ON `mysql`.* FROM `u1`@`%` 	|
    | REVOKE DELETE ON `world`.* FROM `u1`@`%`         	|
    +--------------------------------------------------	+
    

    SHOW GRANTS不显示命名帐户可用但授予其他帐户的特权。例如,如果存在一个匿名帐户,则命名帐户可能能够使用其特权,但SHOW GRANTS不会显示它们。

    SHOW GRANTS显示在mandatory_roles系统变量值中命名的强制角色,如下所示:

    • SHOW GRANTS不带FOR子句的用户将显示当前用户的特权,并包括强制性角色。
    • SHOW GRANTS FOR user显示命名用户的特权,并且不包括强制角色。

    此行为是为了使使用的输出确定将哪些特权显式授予指定用户的应用程序所受益。如果该输出包含强制角色,则很难将明确授予用户的角色与强制角色区分开。SHOW GRANTS FOR user

    对于当前用户,应用程序可以分别使用SHOW GRANTS或来确定具有或不具有强制角色的特权SHOW GRANTS FOR CURRENT_USER