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

    GRANT
        priv_type [(column_list)]
          [, priv_type [(column_list)]] ...
        ON [object_type] priv_level
        TO user_or_role [, user_or_role] ...
        [WITH GRANT OPTION]
        [AS user
            [WITH ROLE
                DEFAULT
              | NONE
              | ALL
              | ALL EXCEPT role [, role ] ...
              | role [, role ] ...
            ]
        ]
    }
    
    GRANT PROXY ON user_or_role
        TO user_or_role [, user_or_role] ...
        [WITH GRANT OPTION]
    
    GRANT role [, role] ...
        TO user_or_role [, user_or_role] ...
        [WITH ADMIN OPTION]
    
    object_type: {
        TABLE
      | FUNCTION
      | PROCEDURE
    }
    
    priv_level: {
        *
      | *.*
      | db_name.*
      | db_name.tbl_name
      | tbl_name
      | db_name.routine_name
    }
    
    user_or_role: {
        user (see Section 6.2.4, “Specifying Account Names”)
      | role (see Section 6.2.5, “Specifying Role Names”)
    }
    

    GRANT语句为MySQL用户帐户和角色分配特权和角色。该GRANT语句有多个方面,在以下主题下进行了描述:

    • GRANT概述
    • 对象报价准则
    • 帐号名称
    • MySQL支持的特权
    • 全球特权
    • 数据库特权
    • 表特权
    • 列特权
    • 存储的例行特权
    • 代理用户权限
    • 授予角色
    • AS条款和权限限制
    • 其他帐户特征
    • GRANT的MySQL和标准SQL版本

    GRANT概述

    GRANT语句使系统管理员可以授予特权和角色,这些特权和角色可以授予用户帐户和角色。这些语法限制适用于:

    • GRANT不能在同一条语句中混合授予特权和角色。给定的GRANT语句必须授予特权或角色。
    • ON子句区分该语句是授予特权还是角色:

      • 使用ON,该语句授予特权。
      • 不使用ON,该语句将授予角色。
      • 可以为帐户分配特权和角色,但是您必须使用单独的GRANT语句,每个语句的语法都适合于要授予的语句。

    有关角色的更多信息,请参见“授权控制”。

    要使用GRANT,您必须具有GRANT OPTION特权,并且必须具有要授予的特权。当read_only启用了系统变量,GRANT另外需要CONNECTION_ADMINSUPER特权。

    GRANT对于所有命名的用户和角色都成功,或者回滚并且如果发生任何错误都不起作用。该语句仅在所有命名用户和角色都成功的情况下才写入二进制日志。

    REVOKE语句与GRANT管理员相关,并使管理员能够删除帐户特权。请参见“ REVOKE语句”。

    每个帐户名均使用“指定帐户名”中所述的格式。每个角色名称使用“指定角色名称”中描述的格式。例如:

    GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
    GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
    GRANT SELECT ON world.* TO 'role3';
    

    帐户或角色名称的主机名部分(如果省略)默认为'%'

    通常,数据库管理员首先用于CREATE USER创建帐户并定义其非特权特征,例如其密码,是否使用安全连接以及对服务器资源的访问限制,然后再用于GRANT定义其特权。ALTER USER可用于更改现有帐户的非特权特征。例如:

    CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
    GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
    GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';
    ALTER USER 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90;
    

    mysql程序中,成功执行时以GRANT响应Query OK, 0 rows affected。要确定该操作会带来哪些特权,请使用SHOW GRANTS。请参见“ SHOW GRANTS语句”。

    重要

    在某些情况下,GRANT可能会记录在服务器日志中或客户端的历史记录文件中,例如~/.mysql_history,这意味着具有对该信息的读取访问权限的任何人都可以读取明文密码。有关服务器日志发生这种情况的条件以及如何控制它的信息,有关客户端日志记录的类似信息,请参见“ mysql客户端日志记录”。

    GRANT支持的主机名最长为255个字符(MySQL 8.0.17之前的60个字符)。用户名最多可以包含32个字符。数据库,表,列和例程的名称最多可以包含64个字符。

    警告

    不要试图通过更改mysql.user系统表来更改用户名的允许长度。这样做会导致无法预测的行为,甚至可能使用户无法登录到MySQL服务器mysql除非通过“升级MySQL”中描述的过程,否则切勿以任何方式更改系统模式中表的结构。

    对象报价准则

    GRANT语句中的几个对象都需要引用,尽管在许多情况下引用是可选的:帐户,角色,数据库,表,列和例程名称。例如,如果帐户名中的user_namehost_name值作为未引用标识符是合法的,则无需引用它。然而,引号是必要指定user_name包含特殊字符(例如字符串-),或一个host_name包含字符串的特殊字符或通配符,如%(例如'test-user'@'%.com')。分别引用用户名和主机名。

    要指定引用的值:

    • 引用数据库,表,列和例程名称作为标识符。
    • 用用户名和主机名加引号作为标识符或字符串。
    • 用密码引用字符串。

    有关字符串引用和标识符引用的准则,请参见“字符串文字”和“架构对象名称”。

    在授予数据库级别特权的语句中指定数据库名称时,允许使用_%通配符。例如,这意味着要将字符用作数据库名称的一部分,请在语句中指定该字符,以防止用户能够访问与通配符模式匹配的其他数据库(例如)。GRANTGRANT ... ON db_name.*_\_GRANTGRANT ... ON `foo\_bar`.* TO ...

    如果不使用数据库名称在数据库级别授予特权,而是将其用作授予表或例程(例如)之类的其他对象的特权的限定符,则通配符将被视为普通字符。GRANT ... ON db_name.tbl_name

    帐号名称

    语句中的userGRANT表示该语句适用的MySQL帐户。为了适应从任意主机向用户授予权限,MySQL支持user以形式指定值。'user_name'@'host_name'

    您可以在主机名中指定通配符。例如,适用于域中的任何主机,并且适用于C类子网中的任何主机。'user_name'@'%.example.com'user_nameexample.com'user_name'@'198.51.100.%'user_name198.51.100

    简单形式是的同义词。'user_name''user_name'@'%'

    MySQL在用户名中不支持通配符。要引用匿名用户,请使用以下GRANT语句指定一个用户名为空的帐户:

    GRANT ALL ON test.* TO ''@'localhost' ...;
    

    在这种情况下,将使用与匿名用户帐户相关联的特权,允许从本地主机使用匿名用户的正确密码连接的任何用户访问。

    有关帐户名中用户名和主机名值的更多信息,请参见“创建账户”。

    警告

    如果允许本地匿名用户连接到MySQL服务器,则还应将所有本地用户的权限授予。否则,匿名用户帐户在当指定的用户试图从本地机器上登录到MySQL服务器使用的系统表。有关详细信息,'user_name'@'localhost'localhostmysql.user

    要确定此问题是否适用于您,请执行以下查询,其中列出了所有匿名用户:

    SELECT Host, User FROM mysql.user WHERE User='';
    

    为避免上述问题,请使用以下语句删除本地匿名用户帐户:

    DROP USER ''@'localhost';
    

    MySQL支持的特权

    下表总结了priv_type可以为GRANTand REVOKE语句指定的允许的静态和动态特权类型,以及可以授予每个特权的级别。有关每个特权的更多信息,请参见“ MySQL提供的特权”。有关静态特权和动态特权之间的区别的信息,请参见静态对动态特权。

    GRANT和REVOKE允许的静态特权

    特权含义和授予级别
    ALL[PRIVILEGES]在指定的访问级别授予所有特权,除了GRANT OPTIONPROXY
    ALTER启用ALTER TABLE。级别:全局,数据库,表。
    ALTER ROUTINE使存储的例程能够被更改或删除。级别:全局,数据库,常规。
    CREATE启用数据库和表创建。级别:全局,数据库,表。
    CREATE ROLE启用角色创建。级别:全球。
    CREATE ROUTINE启用存储的例程创建。级别:全局,数据库。
    CREATE TABLESPACE启用表空间和日志文件组的创建,更改或删除。级别:全球。
    CREATE TEMPORARY TABLES启用CREATE TEMPORARY TABLE。级别:全局,数据库。
    CREATE USER允许使用CREATE USERDROP USERRENAME USER,和REVOKE ALL PRIVILEGES。级别:全球。
    CREATE VIEW启用视图的创建或更改。级别:全局,数据库,表。
    DELETE启用DELETE。级别:全局,数据库,表。
    DROP启用要删除的数据库,表和视图。级别:全局,数据库,表。
    DROP ROLE启用角色删除。级别:全球。
    EVENT为事件计划程序启用事件的使用。级别:全局,数据库。
    EXECUTE使用户能够执行存储的例程。级别:全局,数据库,常规。
    FILE使用户能够使服务器读取或写入文件。级别:全球。
    GRANT OPTION启用授予其他帐户特权或从其他帐户删除的特权。级别:全局,数据库,表,例程,代理。
    INDEX启用要创建或删除的索引。级别:全局,数据库,表。
    INSERT启用INSERT。级别:全局,数据库,表,列。
    LOCK TABLES启用LOCK TABLES对您拥有SELECT特权的on表的使用。级别:全局,数据库。
    PROCESS使用户可以使用参见所有进程SHOW PROCESSLIST。级别:全球。
    PROXY启用用户代理。级别:从一个用户到另一个用户。
    REFERENCES启用外键创建。级别:全局,数据库,表,列。
    RELOAD启用FLUSH操作。级别:全球。
    REPLICATION CLIENT使用户能够询问主服务器或从服务器在哪里。级别:全球。
    REPLICATION SLAVE使复制从属服务器能够从主服务器读取二进制日志事件。级别:全球。
    SELECT启用SELECT。级别:全局,数据库,表,列。
    SHOW DATABASES启用SHOW DATABASES以显示所有数据库。级别:全球。
    SHOW VIEW启用SHOW CREATE VIEW。级别:全局,数据库,表。
    SHUTDOWN启用mysqladmin shutdown使用。级别:全球。
    SUPER能够使用如其他行政业务CHANGE MASTER TOKILLPURGE BINARY LOGSSET GLOBAL,和中mysqladmin调试命令。级别:全球。
    TRIGGER启用触发器操作。级别:全局,数据库,表。
    UPDATE启用UPDATE。级别:全局,数据库,表,列。
    USAGE“没有特权”的同义词

    GRANT和REVOKE的允许动态特权

    特权含义和授予级别
    APPLICATION_PASSWORD_ADMIN启用双重密码管理。级别:全球。
    AUDIT_ADMIN启用审核日志配置。级别:全球。
    BACKUP_ADMIN启用备份管理。级别:全球。
    BINLOG_ADMIN启用二进制日志控制。级别:全球。
    BINLOG_ENCRYPTION_ADMIN启用激活和禁用二进制日志加密。级别:全球。
    CLONE_ADMIN启用克隆管理。级别:全球。
    CONNECTION_ADMIN启用连接限制/限制控制。级别:全球。
    ENCRYPTION_KEY_ADMIN启用InnoDB按键旋转。级别:全球。
    FIREWALL_ADMIN对任何用户启用防火墙规则管理。级别:全球。
    FIREWALL_USER启用防火墙规则自我管理。级别:全球。
    GROUP_REPLICATION_ADMIN启用组复制控制。级别:全球。
    INNODB_REDO_LOG_ARCHIVE启用重做日志归档管理。级别:全球。
    NDB_STORED_USER启用SQL节点(NDB群集)之间的用户或角色共享。级别:全球。
    PERSIST_RO_VARIABLES_ADMIN启用持久性只读系统变量。级别:全球。
    REPLICATION_APPLIER充当PRIVILEGE_CHECKS_USER复制通道。级别:全球。
    REPLICATION_SLAVE_ADMIN启用常规复制控制。级别:全球。
    RESOURCE_GROUP_ADMIN启用资源组管理。级别:全球。
    RESOURCE_GROUP_USER启用资源组管理。级别:全球。
    ROLE_ADMIN使用可以授予或撤消角色WITH ADMIN OPTION。级别:全球。
    SESSION_VARIABLES_ADMIN启用设置受限制的会话系统变量。级别:全球。
    SET_USER_ID启用设置非自身DEFINER值。级别:全球。
    SHOW_ROUTINE启用对存储的例程定义的访问。级别:全球。
    SYSTEM_USER将帐户指定为系统帐户。级别:全球。
    SYSTEM_VARIABLES_ADMIN启用修改或保留全局系统变量。级别:全球。
    TABLE_ENCRYPTION_ADMIN启用替代的默认加密设置。级别:全球。
    VERSION_TOKEN_ADMIN启用版本令牌UDF的使用。级别:全球。
    XA_RECOVER_ADMIN启用XA RECOVER执行。级别:全球。

    触发器与表关联。要创建或删除触发器,您必须具有TRIGGER表的权限,而不是触发器的权限。

    GRANT语句中,ALL[PRIVILEGES]or PROXY特权必须自己命名,不能与其他特权一起指定。ALL[PRIVILEGES]代表除GRANT OPTIONPROXY特权外,在授予特权的级别上可用的所有特权。

    MySQL帐户信息存储在mysql系统架构的表中。有关更多详细信息,请参见“访问控制和帐户管理”,其中广泛讨论了mysql系统架构和访问控制系统。

    如果授予表包含包含大小写混合的数据库名或表名的特权行,并且lower_case_table_names系统变量设置为非零值,REVOKE则不能用于撤消这些特权。有必要直接操作授权表。(设置GRANT时将不会创建此类行lower_case_table_names,但是此类行可能是在设置该变量之前创建的。lower_case_table_names只能在服务器启动时配置该设置。)

    可以在多个级别上授予特权,具体取决于该ON子句使用的语法。对于REVOKE,相同的ON语法指定要删除的特权。

    对于全局,数据库,表和例程级别,GRANT ALL仅分配在您授予的级别上存在的特权。例如,是数据库级的语句,因此它不授予任何仅全局特权,例如。授予不会分配或特权。GRANT ALL ON db_name.*FILEALLGRANT OPTIONPROXY

    object_type如果该子句存在,则应将其指定为TABLE,,FUNCTION或者PROCEDURE当以下对象是表,存储函数或存储过程时。

    用户对数据库,表,列或例程拥有OR的特权是作为每个特权级别(包括全局级别)的帐户特权的逻辑加法形成的。无法通过在较低级别上缺少该特权来拒绝在较高级别上授予的特权。例如,以下语句全局授予SELECTINSERT特权:

    GRANT SELECT, INSERT ON *.* TO u1;
    

    全局授予的特权适用于所有数据库,表和列,即使未在任何较低级别上授予。

    从MySQL 8.0.16开始,如果partial_revokes启用了系统变量,则可以通过撤销特定数据库的特权来显式拒绝在全局级别授予的特权:

    GRANT SELECT, INSERT, UPDATE ON *.* TO u1;
    REVOKE INSERT, UPDATE ON db1.* FROM u1;
    

    上述语句的结果是,SELECT在全球范围适用于所有表格,而INSERTUPDATE全局应用除了在表中db1。帐户访问权限db1为只读。

    “访问控制,阶段2:请求验证”中介绍了特权检查过程的详细信息。

    如果您甚至为一个用户使用表,列或例程特权,服务器将检查所有用户的表,列和例程特权,这会使MySQL变慢。同样,如果您限制任何用户的查询,更新或连接数,则服务器必须监视这些值。

    MySQL使您可以授予不存在的数据库或表的特权。对于表,要授予的CREATE特权必须包括特权。此行为是设计使然,旨在使数据库管理员能够为以后要创建的数据库或表准备用户帐户和特权。

    重要

    删除数据库或表时,MySQL不会自动取消任何特权。但是,如果删除例程,则为该例程授予的任何例程级特权都将被吊销。

    全球特权

    全局特权是管理性的,或适用于给定服务器上的所有数据库。要分配全局特权,请使用ON *.*语法:

    GRANT ALL ON *.* TO 'someuser'@'somehost';
    GRANT SELECT, INSERT ON *.* TO 'someuser'@'somehost';
    

    CREATE TABLESPACECREATE USERFILEPROCESSRELOADREPLICATION CLIENTREPLICATION SLAVESHOW DATABASESSHUTDOWN,和SUPER静态特权是行政和只能在全球范围内授予。

    动态特权都是全局的,只能全局授予。

    其他特权可以全局授予,也可以在更特定的级别授予。

    GRANT OPTION对于静态和动态特权,在全局级别授予的效果不同:

    • GRANT OPTION为任何静态全局特权授予的权限适用于所有静态全局特权。
    • GRANT OPTION为任何动态特权授予的权限仅适用于该动态特权。

    GRANT ALL在全局级别授予所有静态全局特权和所有当前注册的动态特权。在执行该GRANT语句之后注册的动态特权不会追溯授予任何帐户。

    MySQL将全局特权存储在mysql.user系统表中。

    数据库特权

    数据库特权适用于给定数据库中的所有对象。要分配数据库级特权,请使用语法:ON db_name.*

    GRANT ALL ON mydb.* TO 'someuser'@'somehost';
    GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';
    

    如果使用ON *语法(而不是ON *.*),则会在数据库级别为默认数据库分配特权。如果没有默认数据库,则会发生错误。

    CREATEDROPEVENTGRANT OPTIONLOCK TABLES,和REFERENCES权限可以在数据库级别指定。表或例程特权也可以在数据库级别指定,在这种情况下,它们适用于数据库中的所有表或例程。

    MySQL将数据库特权存储在mysql.db系统表中。

    表特权

    表特权适用于给定表中的所有列。要分配表级特权,请使用语法:ON db_name.tbl_name

    GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost';
    GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';
    

    如果指定tbl_name而不是db_name.tbl_name,则该语句适用tbl_name于默认数据库。如果没有默认数据库,则会发生错误。

    容许priv_type在表级的值是ALTERCREATE VIEWCREATEDELETEDROPGRANT OPTIONINDEXINSERTREFERENCESSELECTSHOW VIEWTRIGGER,和UPDATE

    表级特权适用于基表和视图。CREATE TEMPORARY TABLE即使表名匹配,它们也不适用于用创建的表。有关TEMPORARY表特权的信息,请参见“ CREATE TEMPORARY TABLE语句”。

    MySQL将表特权存储在mysql.tables_priv系统表中。

    列特权

    列特权适用于给定表中的单个列。在列级别要授予的每个特权都必须在括号后加上一个或多个列。

    GRANT SELECT (col1), INSERT (col1, col2) ON mydb.mytbl TO 'someuser'@'somehost';
    

    可允许priv_type用于列(即,当你使用一个数值column_list条款)是INSERTREFERENCESSELECT,和UPDATE

    MySQL将列特权存储在mysql.columns_priv系统表中。

    存储的例行特权

    ALTER ROUTINECREATE ROUTINEEXECUTE,和GRANT OPTION权限适用于存储例程(过程和函数)。可以在全局和数据库级别授予它们。除之外CREATE ROUTINE,可以在例程级别为单个例程授予这些特权。

    GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost';
    GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost';
    

    可允许priv_type在常规水平值ALTER ROUTINEEXECUTEGRANT OPTIONCREATE ROUTINE不是例程级别的特权,因为您必须具有全局或数据库级别的特权才能首先创建例程。

    MySQL在mysql.procs_priv系统表中存储例程级别的特权。

    代理用户权限

    PROXY特权使一个用户可以成为另一个用户的代理。代理用户模拟或获取代理用户的身份;也就是说,它假定了代理用户的特权。

    GRANT PROXY ON 'localuser'@'localhost' TO 'externaluser'@'somehost';
    

    PROXY被授权,则必须在指定的唯一特权GRANT语句,唯一允许WITH选项WITH GRANT OPTION

    代理要求代理用户通过一个插件进行身份验证,该插件在代理用户连接时将代理用户的名称返回到服务器,并且代理用户必须具有代理用户的PROXY特权。有关详细信息和示例,请参见“代理用户”。

    MySQL将代理特权存储在mysql.proxies_priv系统表中。

    授予角色

    GRANT不带ON子句的语法授予角色而不是个人特权。角色是特权的命名集合;请参见“授权控制”。例如:

    GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
    

    要授予的每个角色以及要授予它的每个用户帐户或角色都必须存在。从MySQL 8.0.16开始,不能将角色授予匿名用户。

    授予角色不会自动使该角色处于活动状态。有关角色激活和停用的信息,请参阅激活角色。

    这些特权是授予角色所必需的:

    • 如果您具有ROLE_ADMINSUPER特权,则可以向用户或角色授予或撤消任何角色。
    • 如果使用GRANT包含该WITH ADMIN OPTION子句的语句为您授予角色,则只要该角色在您随后授予的时间处于活动状态,就可以将该角色授予其他用户或角色,或将其从其他用户或角色撤消。或撤销它。这包括使用WITH ADMIN OPTION自身的能力。
    • 要授予具有SYSTEM_USER特权的角色,您必须具有SYSTEM_USER特权。

    可以使用创建循环引用GRANT。例如:

    CREATE USER 'u1', 'u2';
    CREATE ROLE 'r1', 'r2';
    
    GRANT 'u1' TO 'u1';   -- simple loop: u1 => u1
    GRANT 'r1' TO 'r1';   -- simple loop: r1 => r1
    
    GRANT 'r2' TO 'u2';
    GRANT 'u2' TO 'r2';   -- mixed user/role loop: u2 => r2 => u2
    

    允许循环授予引用,但不会向被授予者添加新的特权或角色,因为用户或角色已经具有其特权和角色。

    AS条款和权限限制

    从MySQL 8.0.16开始,GRANT具有一个子句,用于指定有关用于语句执行的特权上下文的其他信息。该语法在SQL级别上可见,尽管其主要目的是通过使这些限制出现在二进制日志中,从而在跨部分撤销的授予者特权限制的所有节点上实现统一复制。有关部分吊销的信息,请参见“使用部分吊销的权限限制”。AS user[WITH ROLE]

    指定该子句后,语句执行将考虑与命名用户相关联的所有特权限制,包括由指定的所有角色(如果存在)。结果是,该语句实际授予的特权可能相对于指定的特权有所减少。AS userWITH ROLE

    这些条件适用于以下条款:AS user

    • AS仅当named user具有特权限制时才有效(这意味着partial_revokes已启用系统变量)。
    • 如果WITH ROLE指定了,则必须将所有已命名的角色授予named user
    • 命名user应该是一个MySQL账户指定为,或。当前用户可以与正在执行的用户想要以一组应用的角色一起执行的情况一起命名,这些角色可能与当前会话中的活动角色不同。'user_name'@'host_name'CURRENT_USERCURRENT_USER()WITH ROLEGRANT
    • AS不能用于获取执行该GRANT语句的用户不拥有的特权。执行用户必须至少具有要授予的特权,但是该AS子句只能限制所授予的特权,而不能升级它们。
    • 关于要授予的特权,AS不能指定比执行该GRANT语句的用户具有更多特权(较少限制)的用户/角色组合。该AS用户/角色组合允许具有比执行用户更多权限,但前提是该语句不授予这些额外的权限。
    • AS仅支持授予全局特权(ON *.*)。
    • AS不支持PROXY赠款。

    以下示例说明了该AS子句的效果。创建u1具有某些全局特权以及这些特权限制的用户:

    CREATE USER u1;
    GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO u1;
    REVOKE INSERT, UPDATE ON schema1.* FROM u1;
    REVOKE SELECT ON schema2.* FROM u1;
    

    还创建一个角色r1,以解除某些特权限制,并将该角色授予u1

    CREATE ROLE r1;
    GRANT INSERT ON schema1.* TO r1;
    GRANT SELECT ON schema2.* TO r1;
    GRANT r1 TO u1;
    

    现在,使用没有自己的特权限制的帐户,向多个用户授予相同的全局特权集,但是每个用户都具有由AS子句施加的不同限制,并检查实际授予了哪些特权。

    • GRANT这里的语句没有AS子句,因此授予的特权恰好是指定的那些特权:

      mysql> CREATE USER u2;
      mysql> GRANT SELECT, INSERT, UPDATE ON *.* TO u2;
      mysql> SHOW GRANTS FOR u2;
      +-------------------------------------------------	+
      | Grants for u2@%                                 	|
      +-------------------------------------------------	+
      | GRANT SELECT, INSERT, UPDATE ON *.* TO `u2`@`%` 	|
      +-------------------------------------------------	+
      
    • GRANT此处的语句有一个AS子句,因此授予的特权是指定的特权,但有受限制的u1应用:

      mysql> CREATE USER u3;
      mysql> GRANT SELECT, INSERT, UPDATE ON *.* TO u3 AS u1;
      mysql> SHOW GRANTS FOR u3;
      +----------------------------------------------------	+
      | Grants for u3@%                                    	|
      +----------------------------------------------------	+
      | GRANT SELECT, INSERT, UPDATE ON *.* TO `u3`@`%`    	|
      | REVOKE INSERT, UPDATE ON `schema1`.* FROM `u3`@`%` 	|
      | REVOKE SELECT ON `schema2`.* FROM `u3`@`%`         	|
      +----------------------------------------------------	+
      

      如前所述,该AS子句只能添加特权限制。它不能升级特权。因此,尽管u1具有DELETE特权,但由于该语句未指定granting,所以该特权不包括在已授予的特权中DELETE

    • AS该条款GRANT这里声明,使角色r1活跃u1。该角色解除了对的某些限制u1。因此,授予的特权有一些限制,但没有前面的GRANT声明那么多:

      mysql> CREATE USER u4;
      mysql> GRANT SELECT, INSERT, UPDATE ON *.* TO u4 AS u1 WITH ROLE r1;
      mysql> SHOW GRANTS FOR u4;
      +-------------------------------------------------	+
      | Grants for u4@%                                 	|
      +-------------------------------------------------	+
      | GRANT SELECT, INSERT, UPDATE ON *.* TO `u4`@`%` 	|
      | REVOKE UPDATE ON `schema1`.* FROM `u4`@`%`      	|
      +-------------------------------------------------	+
      

    如果一条GRANT语句包含一个子句,则会忽略对执行该语句的用户的特权限制(而不是像没有子句时那样应用特权限制)。AS userAS

    其他帐户特征

    可选WITH子句用于使用户能够向其他用户授予特权。该WITH GRANT OPTION子句使用户能够将指定级别的特权授予其他用户。

    要将GRANT OPTION特权授予一个帐户而不更改其特权,请执行以下操作:

    GRANT USAGE ON *.* TO 'someuser'@'somehost' WITH GRANT OPTION;
    

    请谨慎对待授予谁GRANT OPTION特权,因为具有不同特权的两个用户可能可以组合特权!

    您不能授予其他用户您自己没有的特权;该GRANT OPTION特权使您只能分配自己拥有的那些特权。

    请注意,当您向用户授予GRANT OPTION特定特权级别的特权时,该用户在该级别拥有(或将来可能会授予)的任何特权也可以由该用户授予其他用户。假设您授予用户INSERT对数据库的特权。然后,如果您授予SELECT数据库特权并指定WITH GRANT OPTION,则该用户不仅可以将SELECT特权授予其他用户,还可以将特权授予其他用户INSERT。如果你再授予UPDATE权限的数据库用户,用户可以授予INSERTSELECTUPDATE

    对于非管理用户,不应在ALTER全局或mysql系统架构上授予特权。如果这样做,用户可以尝试通过重命名表来破坏特权系统!

    有关与特定特权相关的安全风险的更多信息,请参见“ MySQL提供的特权”。

    GRANT的MySQL和标准SQL版本

    MySQL和标准SQL版本之间的最大区别GRANT是:

    • MySQL将特权与主机名和用户名的组合相关联,而不仅仅是用户名。
    • 标准SQL没有全局或数据库级特权,也不支持MySQL支持的所有特权类型。
    • MySQL不支持标准的SQL UNDER特权。
    • 标准SQL特权以分层的方式构造。如果删除用户,则将撤消已授予该用户的所有特权。如果使用,在MySQL中也是如此DROP USER。请参见“ DROP USER语句”。
    • 在标准SQL中,当您删除表时,该表的所有特权都将被吊销。在标准SQL中,当您撤消特权时,基于该特权授予的所有特权也会被撤消。在MySQL中,可以使用DROP USERREVOKE语句删除特权。
    • 在MySQL中,可能INSERT仅对表中的某些列具有特权。在这种情况下,INSERT只要您仅为拥有INSERT特权的那些列插入值,就仍然可以在表上执行语句。如果未启用严格的SQL模式,则省略的列将设置为其隐式默认值。在严格模式下,如果任何省略的列都没有默认值,则该语句将被拒绝。(标准SQL要求您INSERT在所有列上都具有特权。)有关严格SQL模式和隐式默认值的信息,请参见“服务器SQL模式”和“数据类型默认值”。