Documentation Home

13.7.1.4 GRANT 语句

GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user [auth_option] [, user [auth_option]] ...
    [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
    [WITH {GRANT OPTION | resource_option} ...]

GRANT PROXY ON user
    TO user [, user] ...
    [WITH GRANT OPTION]

object_type: {
    TABLE
  | FUNCTION
  | PROCEDURE
}

priv_level: {
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name
  | db_name.routine_name
}

user:
    (see Section 6.2.4, “Specifying Account Names”)

auth_option: {
    IDENTIFIED BY [PASSWORD] 'auth_string'
  | IDENTIFIED WITH auth_plugin
  | IDENTIFIED WITH auth_plugin AS 'auth_string'
}

tls_option: {
    SSL
  | X509
  | CIPHER 'cipher'
  | ISSUER 'issuer'
  | SUBJECT 'subject'
}

resource_option: {
  | MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count
}

GRANT语句将权限授予 MySQL 用户帐户。该声明有几个方面GRANT,在以下主题下进行了描述:

GRANT 概述

GRANT语句将权限授予 MySQL 用户帐户。 GRANT还用于指定其他帐户特征,例如使用安全连接和限制对服务器资源的访问。

要使用 授予特权 GRANT,您必须拥有该 GRANT OPTION特权,并且您必须拥有您授予的特权。(或者,如果您 对系统数据库 UPDATE中的授权表具有权限,则可以授予任何帐户任何权限。)启用系统变量时,还需要该权限。 mysqlread_onlyGRANTSUPER

REVOKE语句与管理员删除帐户权限相关GRANT并使管理员能够删除帐户权限。请参阅 第 13.7.1.6 节,“REVOKE 语句”

每个帐户名都使用 第 6.2.4 节“指定帐户名”中描述的格式。例如:

GRANT ALL ON db1.* TO 'jeffrey'@'localhost';

帐户的主机名部分(如果省略)默认为 '%'.

通常,数据库管理员首先使用 CREATE USER创建一个帐户,然后GRANT定义其权限和特征。例如:

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

此处显示的示例不包含IDENTIFIED 子句。假定您 CREATE USER在创建帐户时设置密码以避免创建不安全的帐户。

如果语句中指定的帐户GRANT 尚不存在, 则可以在稍后SQL 模式 GRANT讨论中描述的条件下创建它 。NO_AUTO_CREATE_USER

来自mysql程序, 成功执行时GRANT响应 Query OK, 0 rows affected。要确定操作产生的特权,请使用SHOW GRANTS. 请参阅 第 13.7.5.22 节,“SHOW GRANTS 语句”

重要的

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

GRANT支持最长 60 个字符的主机名。用户名最多可包含 16 个字符。数据库、表、列和例程名称最多可以包含 64 个字符。

警告

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

对象引用指南

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

要指定引用值:

  • 引用数据库、表、列和例程名称作为标识符。

  • 引用用户名和主机名作为标识符或字符串。

  • 将密码作为字符串引用。

有关字符串引用和标识符引用指南,请参阅 第 9.1.1 节,“字符串文字”第 9.2 节,“模式对象名称”

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

当数据库名称不用于在数据库级别授予权限时,而是作为向某些其他对象(例如表或例程)授予权限的限定符(例如, ),MySQL 将通配符解释为文字字符。 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' ...;

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

有关帐户名中的用户名和主机名值的其他信息,请参阅第 6.2.4 节,“指定帐户名”

警告

如果您允许本地匿名用户连接到 MySQL 服务器,您还应该将权限授予所有本地用户作为 . 否则,当指定用户尝试从本地计算机登录 MySQL 服务器时,将使用系统表中的匿名用户帐户(在 MySQL 安装期间创建) 。 有关详细信息,请参阅 第 6.2.5 节“访问控制,第 1 阶段:连接验证”'user_name'@'localhost'localhostmysql.user

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

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

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

DROP USER ''@'localhost';

对于GRANT允许auth_option值跟在 user值之后 的语法,auth_optionIDENTIFIED并指示帐户如何通过指定帐户身份验证插件、凭据(例如密码)或两者进行身份验证。子句的语法与 auth_option语句的语法相同CREATE USER。有关详细信息,请参阅第 13.7.1.2 节,“CREATE USER 语句”

IDENTIFIED存在并且您具有全局授予权限 ( GRANT OPTION) 时,指定的任何密码都将成为该帐户的新密码,即使该帐户存在并且已经有密码也是如此。没有IDENTIFIED,账户密码保持不变。

MySQL 支持的权限

下表总结了 可以为and 语句priv_type指定的允许权限类型,以及可以授予每个权限的级别。有关每个权限的其他信息,请参阅 第 6.2.2 节,“MySQL 提供的权限”GRANTREVOKE

表 13.8 GRANT 和 REVOKE 允许的权限

特权 含义和可授予级别
ALL [PRIVILEGES] 授予指定访问级别的所有权限,除了 GRANT OPTIONPROXY
ALTER 启用ALTER TABLE. 级别:全局、数据库、表。
ALTER ROUTINE 允许更改或删除存储的例程。级别:全局、数据库、例程。
CREATE 启用数据库和表创建。级别:全局、数据库、表。
CREATE ROUTINE 启用存储例程创建。级别:全局,数据库。
CREATE TABLESPACE 允许创建、更改或删除表空间和日志文件组。级别:全球。
CREATE TEMPORARY TABLES 启用CREATE TEMPORARY TABLE. 级别:全局,数据库。
CREATE USER 启用CREATE USERDROP USERRENAME USERREVOKE ALL PRIVILEGES。级别:全球。
CREATE VIEW 启用要创建或更改的视图。级别:全局、数据库、表。
DELETE 启用DELETE. 级别:全局、数据库、表。
DROP 允许删除数据库、表和视图。级别:全局、数据库、表。
EVENT 为事件调度程序启用事件。级别:全局,数据库。
EXECUTE 使用户能够执行存储的例程。级别:全局、数据库、例程。
FILE 允许用户使服务器读取或写入文件。级别:全球。
GRANT OPTION 启用授予其他帐户或从其他帐户删除的权限。级别:全局、数据库、表、例程、代理。
INDEX 启用要创建或删除的索引。级别:全局、数据库、表。
INSERT 启用INSERT. 级别:全局、数据库、表、列。
LOCK TABLES LOCK TABLES在您有SELECT 权限的表上启用使用。级别:全局,数据库。
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 GLOBALmysqladmin 调试命令。级别:全球。
TRIGGER 启用触发操作。级别:全局、数据库、表。
UPDATE 启用UPDATE. 级别:全局、数据库、表、列。
USAGE 无特权的同义词

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

GRANT语句中, ALL [PRIVILEGES]PROXY 权限必须单独命名,不能与其他权限一起指定。 代表除和 特权ALL [PRIVILEGES]之外的所有可用于授予特权的级别的 特权。 GRANT OPTIONPROXY

USAGE可以指定创建没有权限的用户,或者在 不更改其现有权限的情况下为帐户 指定REQUIREor子句。WITH

MySQL 账户信息存储在 mysql系统数据库的表中。有关其他详细信息,请参阅第 6.2 节“访问控制和帐户管理”,其中广泛讨论了mysql系统数据库和访问控制系统。

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

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

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

object_type子句(如果存在)应指定为TABLEFUNCTIONPROCEDURE 当以下对象是表、存储函数或存储过程时。

用户对数据库、表、列或例程所持有的权限是作为 OR每个权限级别(包括全局级别)的帐户权限的逻辑添加形成的。不可能因为较低级别的权限缺失而拒绝较高级别授予的权限。例如,此语句全局授予 SELECTINSERT权限:

GRANT SELECT, INSERT ON *.* TO u1;

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

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

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

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

重要的

当您删除数据库或表时,MySQL 不会自动撤销任何特权。但是,如果您删除一个例程,那么为该例程授予的任何例程级特权都将被撤销。

全球特权

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

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

CREATE TABLESPACECREATE USERFILEPROCESSRELOADREPLICATION CLIENTREPLICATION SLAVE、 和 权限是管理权限SHOW DATABASES, 只能全局授予。 SHUTDOWNSUPER

可以全局或在更具体的级别授予其他特权。

GRANT OPTION在全局级别授予的任何全局权限适用于所有全局权限。

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

数据库权限

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

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

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

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

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表级别 的允许值是ALTER, CREATE VIEW, CREATE, DELETE, DROP, GRANT OPTION, INDEX, INSERT, REFERENCES, SELECT, SHOW VIEW, TRIGGER, 和 UPDATE

表级权限适用于基表和视图。它们不适用于使用 创建CREATE TEMPORARY TABLE的表,即使表名匹配也是如此。有关TEMPORARY表权限的信息,请参阅第 13.1.17.2 节,“CREATE TEMPORARY TABLE 语句”

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

列权限

列特权适用于给定表中的单个列。在列级别授予的每个权限必须后跟列,并用括号括起来。

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

列的允许priv_type值(即,当您使用 column_list子句时)是 INSERTREFERENCESSELECTUPDATE

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

存储例程特权

ALTER ROUTINECREATE ROUTINE和 特权适用于存储例程(过程和函数)EXECUTEGRANT 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语句中 指定的唯一权限,REQUIRE不能给出子句,并且唯一允许的WITH选项是WITH GRANT OPTION

代理要求代理用户通过插件进行身份验证,该插件在代理用户连接时将代理用户的名称返回给服务器,并且代理用户具有代理用户的 PROXY权限。有关详细信息和示例,请参阅第 6.2.12 节,“代理用户”

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

隐式帐户创建

如果语句中指定的帐户GRANT 不存在,则采取的操作取决于 NO_AUTO_CREATE_USERSQL 模式:

  • 如果NO_AUTO_CREATE_USER 未启用,则GRANT 创建帐户。这是非常不安全的,除非您使用指定非空密码IDENTIFIED BY

  • 如果NO_AUTO_CREATE_USER 启用,则GRANT失败并且不会创建帐户,除非您使用 指定非空密码IDENTIFIED BY或使用 命名身份验证插件IDENTIFIED WITH

从 MySQL 5.6.12 开始,如果该帐户已经存在, IDENTIFIED WITH则被禁止,因为它仅用于创建新帐户时使用。

其他账户特征

除了通常基于用户名和凭据的身份验证之外,MySQL 还可以检查 X.509 证书属性。有关将 SSL 与 MySQL 一起使用的背景信息,请参阅第 6.3 节,“使用加密连接”

可选REQUIRE子句使用一个或多个 tls_option值为 MySQL 帐户指定与 SSL 相关的选项。

选项的顺序REQUIRE无关紧要,但任何选项都不能指定两次。AND关键字在选项之间是可选 的 REQUIRE

GRANT允许这些 tls_option值:

  • NONE

    表示该帐户没有 SSL 或 X.509 要求。

    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      REQUIRE NONE;

    如果用户名和密码有效,则允许未加密的连接。如果客户端具有适当的证书和密钥文件,则可以根据客户端的选择使用加密连接。也就是说,客户端不需要指定任何 SSL 命令选项,在这种情况下,连接是未加密的。要使用加密连接,客户端必须指定 选项,或、 和 选项--ssl-ca的全部三个。 --ssl-ca--ssl-key--ssl-cert

    NONE如果未指定与 SSL 相关的 REQUIRE选项,则为默认值。

  • SSL

    告诉服务器只允许该帐户的加密连接。

    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      REQUIRE SSL;

    要连接,客户端必须指定 --ssl-ca用于验证服务器证书的选项,并且可以另外指定--ssl-key--ssl-cert选项。如果--ssl-ca 选项和--ssl-capath 选项均未指定,则客户端不验证服务器证书。

  • X509

    要求客户出示有效证书,但确切的证书、颁发者和主题无关紧要。唯一的要求是应该可以使用其中一个 CA 证书来验证其签名。使用 X.509 证书总是意味着加密,因此 SSL在这种情况下不需要该选项。

    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      REQUIRE X509;

    对于具有 的帐户REQUIRE X509,客户端必须指定--ssl-key--ssl-cert选项才能连接。(建议但不要求 --ssl-ca也指定,以便可以验证服务器提供的公共证书。)这也是正确的ISSUERSUBJECT因为这些 REQUIRE选项暗示了X509.

  • ISSUER 'issuer'

    要求客户端出示 CA 颁发的有效 X.509 证书 。如果客户端提供的证书有效但颁发者不同,则服务器会拒绝连接。使用 X.509 证书总是意味着加密,因此 在这种情况下不需要该选项。 'issuer'SSL

    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
        O=MySQL/CN=CA/emailAddress=ca@example.com';

    因为ISSUER隐含了 的要求X509,客户端必须指定 --ssl-key--ssl-cert选项才能连接。(建议但不要求 --ssl-ca也指定,以便验证服务器提供的公共证书。)

    笔记

    如果 MySQL 链接到早于 0.9.6h 的 OpenSSL 版本,请在 值 中使用Email而不是 。emailAddress'issuer'

  • SUBJECT 'subject'

    要求客户端出示包含 subject 的有效 X.509 证书subject。如果客户端提供的证书有效但主题不同,则服务器会拒绝连接。使用 X.509 证书总是意味着加密,因此 SSL在这种情况下不需要该选项。

    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
        O=MySQL demo client certificate/
        CN=client/emailAddress=client@example.com';

    MySQL 对值与证书中的值进行简单的字符串比较 ,因此字母大小写和组件顺序必须与证书中的完全一致。 'subject'

    笔记

    关于emailAddress,见说明中的注释REQUIRE ISSUER

    因为SUBJECT隐含了 的要求X509,客户端必须指定--ssl-key--ssl-cert选项才能连接。(建议但不要求 --ssl-ca也指定,以便验证服务器提供的公共证书。)

  • CIPHER 'cipher'

    需要特定的密码方法来加密连接。需要此选项以确保使用足够强度的密码和密钥长度。如果使用使用短加密密钥的旧算法,SSL 本身可能很弱。

    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';

, SUBJECT,ISSUERCIPHER选项可以 REQUIRE像这样在子句中组合:

GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
  REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL demo client certificate/
    CN=client/emailAddress=client@example.com'
  AND ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL/CN=CA/emailAddress=ca@example.com'
  AND CIPHER 'EDH-RSA-DES-CBC3-SHA';

可选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系统数据库权限。如果这样做,用户可以尝试通过重命名表来颠覆特权系统!

有关与特定权限相关的安全风险的其他信息,请参阅 第 6.2.2 节,“MySQL 提供的权限”

可以限制帐户对服务器资源的使用,如第 6.2.13 节“设置帐户资源限制”中所述。为此,请使用WITH指定一个或多个resource_option值的子句。未指定的限制保留其当前值。

选项的顺序WITH无关紧要,除非多次指定给定的资源限制,最后一个实例优先。

GRANT允许这些 resource_option值:

  • MAX_QUERIES_PER_HOUR count, , MAX_UPDATES_PER_HOUR countMAX_CONNECTIONS_PER_HOUR count

    这些选项限制在任何给定的一小时内允许此帐户查询、更新和连接到服务器的次数。(从查询缓存提供结果的查询不计入MAX_QUERIES_PER_HOUR 限制。)如果count0(默认值),这意味着该帐户没有限制。

  • MAX_USER_CONNECTIONS count

    限制帐户同时连接到服务器的最大数量。非零 count值明确指定帐户的限制。如果 count是(默认值),服务器根据 系统变量0 的全局值确定帐户的同时连接数 。max_user_connections如果 max_user_connections也是零,则帐户没有限制。

要在不影响现有权限的情况下为现有用户指定资源限制, GRANT USAGE 请在全局级别使用 ( ON *.*) 并命名要更改的限制。例如:

GRANT USAGE ON *.* TO ...
  WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;
GRANT 的 MySQL 和标准 SQL 版本

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

  • MySQL 将权限与主机名和用户名的组合相关联,而不仅仅是与用户名相关联。

  • 标准 SQL 没有全局或数据库级别的权限,也不支持 MySQL 支持的所有权限类型。

  • MySQL 不支持标准 SQL UNDER权限。

  • 标准 SQL 权限以分层方式构建。如果您删除一个用户,则该用户被授予的所有权限都将被撤销。如果您使用DROP USER. 请参阅 第 13.7.1.3 节,“DROP USER 语句”

  • 在标准 SQL 中,当您删除一个表时,该表的所有权限都将被撤销。在标准 SQL 中,当您撤销特权时,所有基于该特权授予的特权也将被撤销。在 MySQL 中,可以使用DROP USERor REVOKE语句删除权限。

  • 在 MySQL 中,可以 INSERT只对表中的某些列具有权限。在这种情况下,您仍然可以INSERT 在表上执行语句,前提是您只为那些您有 INSERT权限的列插入值。如果未启用严格 SQL 模式,则省略的列将设置为其隐式默认值。在严格模式下,如果任何省略的列没有默认值,则该语句将被拒绝。(标准 SQL 要求您拥有 INSERT所有列的权限。)有关严​​格 SQL 模式和隐式默认值的信息,请参阅第 5.1.10 节,“服务器 SQL 模式”第 11.5 节,“数据类型默认值”