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 'auth_string'
| IDENTIFIED WITH auth_plugin
| IDENTIFIED WITH auth_plugin BY 'auth_string'
| IDENTIFIED WITH auth_plugin AS 'auth_string'
| IDENTIFIED BY PASSWORD '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 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
定义其特权。
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;
此处显示的示例不包含IDENTIFIED
子句。假定您
CREATE USER
在创建帐户时设置密码以避免创建不安全的帐户。
如果语句中指定的帐户
GRANT
尚不存在,则可以在稍后SQL 模式GRANT
讨论中描述的条件下创建它
。NO_AUTO_CREATE_USER
也可以用来
GRANT
指定非特权帐户特征,例如是否使用安全连接和对服务器资源访问的限制。
但是,GRANT
在 MySQL 5.7 中不推荐使用 来创建帐户或定义非特权特征。相反,使用CREATE USER
或
执行这些任务ALTER USER
。
来自mysql程序,
成功执行时GRANT
响应
Query OK, 0 rows affected
。要确定操作产生的特权,请使用SHOW GRANTS
. 请参阅
第 13.7.5.21 节,“SHOW GRANTS 语句”。
在某些情况下,
GRANT
可能会记录在服务器日志中或在客户端的历史文件中,例如
~/.mysql_history
,这意味着任何对该信息具有读取权限的人都可以读取明文密码。有关服务器日志发生这种情况的条件以及如何控制它的信息,请参阅第 6.1.2.3 节,“密码和日志记录”。有关客户端日志记录的类似信息,请参阅
第 4.5.1.3 节,“mysql 客户端日志记录”。
GRANT
支持最长 60 个字符的主机名。用户名最多可包含 32 个字符。数据库、表、列和例程名称最多可以包含 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
下表总结了
可以为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
(但是,GRANT
不推荐使用 定义非特权特征。
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 不会自动撤销任何特权。但是,如果您删除一个例程,那么为该例程授予的任何例程级特权都将被撤销。
语句中的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 服务器时,将使用系统表中
的匿名用户帐户
。有关详细信息,请参阅
第 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 语句”。
在 MySQL 5.7 中不推荐使用GRANT
来定义帐户身份验证特征。相反,使用
CREATE USER
或
建立或更改身份验证特征ALTER USER
。期望
GRANT
在未来的 MySQL 版本中删除此功能。
当IDENTIFIED
存在并且您具有全局授予权限 ( GRANT
OPTION
) 时,指定的任何密码都将成为该帐户的新密码,即使该帐户存在并且已经有密码也是如此。没有IDENTIFIED
,账户密码保持不变。
全局权限是管理性的或适用于给定服务器上的所有数据库。要分配全局权限,请使用
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.18.2 节,“CREATE TEMPORARY TABLE 语句”。
MySQL 将表权限存储在
mysql.tables_priv
系统表中。
Column privileges apply to single columns in a given table. Each privilege to be granted at the column level must be followed by the column or columns, enclosed within parentheses.
GRANT SELECT (col1), INSERT (col1, col2) ON mydb.mytbl TO 'someuser'@'somehost';
The permissible priv_type
values
for a column (that is, when you use a
column_list
clause) are
INSERT
,
REFERENCES
,
SELECT
, and
UPDATE
.
MySQL stores column privileges in the
mysql.columns_priv
system table.
The ALTER ROUTINE
,
CREATE ROUTINE
,
EXECUTE
, and
GRANT OPTION
privileges apply
to stored routines (procedures and functions). They can be
granted at the global and database levels. Except for
CREATE ROUTINE
, these
privileges can be granted at the routine level for individual
routines.
GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost';
GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost';
The permissible priv_type
values at
the routine level are ALTER
ROUTINE
, EXECUTE
, and
GRANT OPTION
.
CREATE ROUTINE
is not a
routine-level privilege because you must have the privilege at
the global or database level to create a routine in the first
place.
MySQL stores routine-level privileges in the
mysql.procs_priv
system table.
The PROXY
privilege enables one
user to be a proxy for another. The proxy user impersonates or
takes the identity of the proxied user; that is, it assumes
the privileges of the proxied user.
GRANT PROXY ON 'localuser'@'localhost' TO 'externaluser'@'somehost';
When PROXY
is granted, it must
be the only privilege named in the
GRANT
statement, the
REQUIRE
clause cannot be given, and the
only permitted WITH
option is WITH
GRANT OPTION
.
Proxying requires that the proxy user authenticate through a
plugin that returns the name of the proxied user to the server
when the proxy user connects, and that the proxy user have the
PROXY
privilege for the proxied user. For
details and examples, see Section 6.2.14, “Proxy Users”.
MySQL stores proxy privileges in the
mysql.proxies_priv
system table.
If an account named in a GRANT
statement does not exist, the action taken depends on the
NO_AUTO_CREATE_USER
SQL
mode:
If
NO_AUTO_CREATE_USER
is not enabled,GRANT
creates the account. This is very insecure unless you specify a nonempty password usingIDENTIFIED BY
.If
NO_AUTO_CREATE_USER
is enabled,GRANT
fails and does not create the account, unless you specify a nonempty password usingIDENTIFIED BY
or name an authentication plugin usingIDENTIFIED WITH
.
If the account already exists, IDENTIFIED
WITH
is prohibited because it is intended only for
use when creating new accounts.
MySQL can check X.509 certificate attributes in addition to the usual authentication that is based on the user name and credentials. For background information on the use of SSL with MySQL, see Section 6.3, “Using Encrypted Connections”.
The optional REQUIRE
clause specifies
SSL-related options for a MySQL account. The syntax is the
same as for the CREATE USER
statement. For details, see Section 13.7.1.2, “CREATE USER Statement”.
Use of GRANT
to define
account SSL characteristics is deprecated in MySQL
5.7. Instead, establish or change SSL
characteristics using CREATE
USER
or ALTER USER
.
Expect this GRANT
capability
to be removed in a future MySQL release.
The optional WITH
clause is used for these
purposes:
To enable a user to grant privileges to other users
To specify resource limits for a user
The WITH GRANT OPTION
clause gives the user
the ability to give to other users any privileges the user has
at the specified privilege level.
To grant the GRANT OPTION
privilege to an account without otherwise changing its
privileges, do this:
GRANT USAGE ON *.* TO 'someuser'@'somehost' WITH GRANT OPTION;
Be careful to whom you give the GRANT
OPTION
privilege because two users with different
privileges may be able to combine privileges!
You cannot grant another user a privilege which you yourself
do not have; the GRANT OPTION
privilege enables you to assign only those privileges which
you yourself possess.
Be aware that when you grant a user the
GRANT OPTION
privilege at a
particular privilege level, any privileges the user possesses
(or may be given in the future) at that level can also be
granted by that user to other users. Suppose that you grant a
user the INSERT
privilege on a
database. If you then grant the
SELECT
privilege on the
database and specify WITH GRANT OPTION
,
that user can give to other users not only the
SELECT
privilege, but also
INSERT
. If you then grant the
UPDATE
privilege to the user on
the database, the user can grant
INSERT
,
SELECT
, and
UPDATE
.
For a nonadministrative user, you should not grant the
ALTER
privilege globally or for
the mysql
system database. If you do that,
the user can try to subvert the privilege system by renaming
tables!
For additional information about security risks associated with particular privileges, see Section 6.2.2, “Privileges Provided by MySQL”.
It is possible to place limits on use of server resources by
an account, as discussed in Section 6.2.16, “Setting Account Resource Limits”.
To do so, use a WITH
clause that specifies
one or more resource_option
values.
Limits not specified retain their current values. The syntax
is the same as for the CREATE
USER
statement. For details, see
Section 13.7.1.2, “CREATE USER Statement”.
Use of GRANT
to define
account resource limits is deprecated in MySQL
5.7. Instead, establish or change resource
limits using CREATE USER
or
ALTER USER
. Expect this
GRANT
capability to be
removed in a future MySQL release.
The biggest differences between the MySQL and standard SQL
versions of GRANT
are:
MySQL associates privileges with the combination of a host name and user name and not with only a user name.
Standard SQL does not have global or database-level privileges, nor does it support all the privilege types that MySQL supports.
MySQL does not support the standard SQL
UNDER
privilege.Standard SQL privileges are structured in a hierarchical manner. If you remove a user, all privileges the user has been granted are revoked. This is also true in MySQL if you use
DROP USER
. See Section 13.7.1.3, “DROP USER Statement”.In standard SQL, when you drop a table, all privileges for the table are revoked. In standard SQL, when you revoke a privilege, all privileges that were granted based on that privilege are also revoked. In MySQL, privileges can be dropped with
DROP USER
orREVOKE
statements.In MySQL, it is possible to have the
INSERT
privilege for only some of the columns in a table. In this case, you can still executeINSERT
statements on the table, provided that you insert values only for those columns for which you have theINSERT
privilege. The omitted columns are set to their implicit default values if strict SQL mode is not enabled. In strict mode, the statement is rejected if any of the omitted columns have no default value. (Standard SQL requires you to have theINSERT
privilege on all columns.) For information about strict SQL mode and implicit default values, see 第 5.1.10 节,“服务器 SQL 模式”和第 11.6 节,“数据类型默认值”。