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
语句将权限授予 MySQL 用户帐户。
GRANT
还用于指定其他帐户特征,例如使用安全连接和限制对服务器资源的访问。
要使用 授予特权
GRANT
,您必须拥有该
GRANT OPTION
特权,并且您必须拥有您授予的特权。(或者,如果您
对系统数据库
UPDATE
中的授权表具有权限,则可以授予任何帐户任何权限。)启用系统变量时,还需要该权限。
mysql
read_only
GRANT
SUPER
该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_name
或
host_name
值作为未加引号的标识符是合法的,则您无需将其加引号。但是,必须使用引号来指定
user_name
包含特殊字符(例如-
)的
host_name
字符串,或者包含特殊字符或通配符(%
例如)的字符串'test-user'@'%.com'
。分别引用用户名和主机名。
要指定引用值:
引用数据库、表、列和例程名称作为标识符。
引用用户名和主机名作为标识符或字符串。
将密码作为字符串引用。
有关字符串引用和标识符引用指南,请参阅 第 9.1.1 节,“字符串文字”和 第 9.2 节,“模式对象名称”。
在数据库级别 ( ) 授予权限的语句中指定数据库名称时,允许
使用_
和%
通配符
。这意味着,例如,要将字符用作数据库名称的一部分,请
在语句中使用转义字符指定它,以防止用户能够访问与通配符模式匹配的其他数据库(例如,
)。
GRANT
GRANT ... ON
db_name
.*_
\
\_
GRANT
GRANT ... ON `foo\_bar`.* TO ...
当数据库名称不用于在数据库级别授予权限时,而是作为向某些其他对象(例如表或例程)授予权限的限定符(例如,
),MySQL 将通配符解释为文字字符。
GRANT ... ON
db_name
.tbl_name
语句中的user
值
GRANT
表示该语句适用的 MySQL 帐户。为了适应向来自任意主机的用户授予权限,MySQL 支持user
以
.
'
user_name
'@'host_name
'
您可以在主机名中指定通配符。例如,
适用于域中
的任何主机,
适用于C 类子网
中的任何主机。'
user_name
'@'%.example.com'user_name
example.com
'
user_name
'@'198.51.100.%'user_name
198.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'localhost
mysql.user
要确定此问题是否适用于您,请执行以下查询,其中列出了所有匿名用户:
SELECT Host, User FROM mysql.user WHERE User='';
为避免刚才描述的问题,请使用以下语句删除本地匿名用户帐户:
DROP USER ''@'localhost';
对于GRANT
允许auth_option
值跟在
user
值之后
的语法,auth_option
以
IDENTIFIED
并指示帐户如何通过指定帐户身份验证插件、凭据(例如密码)或两者进行身份验证。子句的语法与
auth_option
语句的语法相同CREATE USER
。有关详细信息,请参阅第 13.7.1.2 节,“CREATE USER 语句”。
当IDENTIFIED
存在并且您具有全局授予权限 ( GRANT
OPTION
) 时,指定的任何密码都将成为该帐户的新密码,即使该帐户存在并且已经有密码也是如此。没有IDENTIFIED
,账户密码保持不变。
下表总结了
可以为and
语句priv_type
指定的允许权限类型,以及可以授予每个权限的级别。有关每个权限的其他信息,请参阅
第 6.2.2 节,“MySQL 提供的权限”。
GRANT
REVOKE
表 13.8 GRANT 和 REVOKE 允许的权限
特权 | 含义和可授予级别 |
---|---|
ALL [PRIVILEGES] |
授予指定访问级别的所有权限,除了
GRANT OPTION 和
PROXY 。 |
ALTER |
启用ALTER TABLE . 级别:全局、数据库、表。 |
ALTER ROUTINE |
允许更改或删除存储的例程。级别:全局、数据库、例程。 |
CREATE |
启用数据库和表创建。级别:全局、数据库、表。 |
CREATE ROUTINE |
启用存储例程创建。级别:全局,数据库。 |
CREATE TABLESPACE |
允许创建、更改或删除表空间和日志文件组。级别:全球。 |
CREATE TEMPORARY TABLES |
启用CREATE
TEMPORARY TABLE . 级别:全局,数据库。 |
CREATE USER |
启用CREATE USER 、
DROP USER 、
RENAME USER 和
REVOKE 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 TO 、
KILL 、
PURGE BINARY LOGS 、
SET
GLOBAL 和mysqladmin 调试命令。级别:全球。 |
TRIGGER |
启用触发操作。级别:全局、数据库、表。 |
UPDATE |
启用UPDATE . 级别:全局、数据库、表、列。 |
USAGE |
“无特权”的同义词 |
触发器与表关联。要创建或删除触发器,您必须拥有
TRIGGER
表的权限,而不是触发器。
在GRANT
语句中,
ALL
[PRIVILEGES]
或PROXY
权限必须单独命名,不能与其他权限一起指定。
代表除和
特权ALL
[PRIVILEGES]
之外的所有可用于授予特权的级别的
特权。
GRANT OPTION
PROXY
USAGE
可以指定创建没有权限的用户,或者在
不更改其现有权限的情况下为帐户
指定REQUIRE
or子句。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
.*FILE
ALL
GRANT OPTION
PROXY
该object_type
子句(如果存在)应指定为TABLE
、
FUNCTION
或PROCEDURE
当以下对象是表、存储函数或存储过程时。
用户对数据库、表、列或例程所持有的权限是作为
OR
每个权限级别(包括全局级别)的帐户权限的逻辑添加形成的。不可能因为较低级别的权限缺失而拒绝较高级别授予的权限。例如,此语句全局授予
SELECT
和
INSERT
权限:
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 TABLESPACE
、
CREATE USER
、
FILE
、
PROCESS
、
RELOAD
、
REPLICATION CLIENT
、
REPLICATION SLAVE
、
和
权限是管理权限SHOW DATABASES
,
只能全局授予。
SHUTDOWN
SUPER
可以全局或在更具体的级别授予其他特权。
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 *.*
),则在数据库级别为默认数据库分配权限。如果没有默认数据库,则会发生错误。
、CREATE
、
DROP
、
EVENT
、
GRANT OPTION
和
权限可以在数据库级别指定LOCK 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
表级别
的允许值是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
子句时)是
INSERT
、
REFERENCES
、
SELECT
和
UPDATE
。
MySQL 将列权限存储在
mysql.columns_priv
系统表中。
、ALTER ROUTINE
、
CREATE ROUTINE
和
特权适用于存储例程(过程和函数)EXECUTE
。
GRANT OPTION
它们可以在全局和数据库级别授予。除了
CREATE ROUTINE
,这些特权可以在例程级别授予个别例程。
GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost';
GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost';
priv_type
例程级别
的允许值是ALTER
ROUTINE
、EXECUTE
和
GRANT OPTION
。
CREATE 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_USER
SQL 模式:
如果
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
也指定,以便可以验证服务器提供的公共证书。)这也是正确的ISSUER
,SUBJECT
因为这些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
,ISSUER
和
CIPHER
选项可以
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
用户授予对数据库的权限,则该用户可以授予
INSERT
、
SELECT
和
UPDATE
。
对于非管理员用户,您不应授予
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
count
MAX_CONNECTIONS_PER_HOUR
count
这些选项限制在任何给定的一小时内允许此帐户查询、更新和连接到服务器的次数。(从查询缓存提供结果的查询不计入
MAX_QUERIES_PER_HOUR
限制。)如果count
是0
(默认值),这意味着该帐户没有限制。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;
MySQL 和标准 SQL 版本之间的最大区别GRANT
是:
MySQL 将权限与主机名和用户名的组合相关联,而不仅仅是与用户名相关联。
标准 SQL 没有全局或数据库级别的权限,也不支持 MySQL 支持的所有权限类型。
MySQL 不支持标准 SQL
UNDER
权限。标准 SQL 权限以分层方式构建。如果您删除一个用户,则该用户被授予的所有权限都将被撤销。如果您使用
DROP USER
. 请参阅 第 13.7.1.3 节,“DROP USER 语句”。在标准 SQL 中,当您删除一个表时,该表的所有权限都将被撤销。在标准 SQL 中,当您撤销特权时,所有基于该特权授予的特权也将被撤销。在 MySQL 中,可以使用
DROP USER
orREVOKE
语句删除权限。在 MySQL 中,可以
INSERT
只对表中的某些列具有权限。在这种情况下,您仍然可以INSERT
在表上执行语句,前提是您只为那些您有INSERT
权限的列插入值。如果未启用严格 SQL 模式,则省略的列将设置为其隐式默认值。在严格模式下,如果任何省略的列没有默认值,则该语句将被拒绝。(标准 SQL 要求您拥有INSERT
所有列的权限。)有关严格 SQL 模式和隐式默认值的信息,请参阅第 5.1.10 节,“服务器 SQL 模式”和第 11.5 节,“数据类型默认值”。