官网地址:MySQL :: MySQL 5.7 Reference Manual :: 13.7.1.4 GRANT Statement
欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯.
Mysql5.7参考手册/…/赠款声明
13.7.1.4GRANT Statement
GRANTpriv_type [(column_list)][, priv_type [(column_list)]] ...ON [object_type] priv_levelTO user [auth_option] [, user [auth_option]] ...[REQUIRE {NONE | tls_option [[AND] tls_option] ...}][WITH {GRANT OPTION | resource_option} ...]GRANT PROXY ON userTO 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在下列专题下介绍的声明:
一般概述
反对引用指引
由mysql支持的特权
帐户名称及密码
全球特权
数据库权限
表格特权
列权限
存储常规权限
代理用户权限
隐式账户创建
其他帐户特征
千年发展目标和标准SQL赠款版本
一般概述
…GRANT语句授予mysql用户帐户特权。
给予他们特权GRANT,你必须拥有GRANT OPTION你必须拥有你所授予的特权。(如果你有UPDATE资助表的特权mysql
系统数据库,您可以授予任何帐户任何特权.)当……read_only系统变量启用,GRANT另外要求SUPER特权。
…REVOKE陈述与GRANT并允许管理员删除帐户权限。看第13.7.1.6节,”撤销声明”.
每个帐户名称使用的格式第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已经没有声明了,GRANT可根据下文讨论中所述的条件设立。NO_AUTO_CREATE_USERsql模式。也可以使用GRANT指定非特权帐户特性,如它是否使用安全连接和对访问服务器资源的限制。
然而,使用GRANT在mysql5.7中,对于创建帐户或定义非特权特性是不赞成的。相反,使用这些任务CREATE USER或ALTER USER.
来自Mysql程序,GRANT回答:Query OK, 0 rows affected
一旦成功执行。为了确定操作产生的权限,请使用SHOW GRANTS.看第13.7.5.21节,”显示补助金报表”.
重要的
在某些情况下,GRANT可以记录在服务器日志或客户端的历史文件中,例如:~/.mysql_history
,也就是说,任何人都可以阅读清楚的文本密码。有关服务器日志发生这种情况的信息以及如何控制它,请参见第6.1.2.3节,”密码和日志记录”.有关客户端日志记录的类似信息,请参阅Section4.5.1.3, “mysql Client Logging”.
GRANT支持主机名称最多60个字符长。用户名最多可达32个字符。数据库、表、列和例程名称最多可达64个字符。
警告
不要试图通过改变用户名的允许长度来改变mysql.user
系统表。这样做会导致不可预测的行为,甚至可能使用户无法登录到mysql服务器.绝不改变表格的结构。mysql
系统数据库以任何方式进行,但通过下列程序除外:Section2.10, “Upgrading MySQL”.
反对引用指引
里面有几个物体GRANT声明可以引用,但在许多情况下,引用是可选的:帐户、数据库、表、列和常规名称。例如,如果user_name
或host_name
帐户名中的值作为未引用的标识符是合法的,您不必引用它。但是,需要有引号来指定user_name
包含特殊字符的字符串(例如-
),或host_name
包含特殊字符或通配符的字符串%
(例如,'test-user'@'%.com'
)。分别引用用户名和主机名。
指定引用值:
引用数据库、表、列和例程名称作为标识符.
引用用户名和主机名作为标识符或字符串.
引用密码作为字符串。
关于字串引用和标识引用指南,请参阅第9.1.1节,”字符串文字”,以及第9.2节,”模式对象名称”.
…_
和%
在指定数据库名称时,允许使用通配符。GRANT授予数据库级权限的语句()。例如,这意味着字符作为数据库名称的一部分,请使用逃跑性格在…中语句,防止用户访问与通配符模式相匹配的额外数据库(例如,).GRANT ... ON
db_name
.*_
\
\_
GRANTGRANT ... ON `foo\_bar`.* TO ...
发行倍数GRANT
包含通配符的语句可能不会对DML语句产生预期效果;在解析涉及通配符的授予时,mysql只考虑第一个匹配的授予。换句话说,如果用户使用与同一数据库相匹配的通配符拥有两个数据库级的授予,则首先创建的授予将被应用。考虑一下数据库db
和餐桌t
使用这里所示的语句:
mysql> CREATE DATABASE db;Query OK, 1 row affected (0.01 sec)mysql> CREATE TABLE db.t (c INT);Query OK, 0 rows affected (0.01 sec)mysql> INSERT INTO db.t VALUES ROW(1);Query OK, 1 row affected (0.00 sec)
接下来(假设经常账户是mysql)root
拥有必要权限的帐户),我们创建一个用户u
接下来是第二次GRANT
包含通配符的语句,如:
mysql> CREATE USER u;Query OK, 0 rows affected (0.01 sec)mysql> GRANT SELECT ON `d_`.* TO u;Query OK, 0 rows affected (0.01 sec)mysql> GRANT INSERT ON `d%`.* TO u;Query OK, 0 rows affected (0.00 sec)mysql> EXIT
Bye
如果我们结束了会话然后再次登录Mysql客户,这次是U,我们看到这个帐户只拥有第一批对等拨款所提供的特权,但没有第二批:
$> mysql -uu -hlocalhost
Welcome to the MySQL monitor.Commands end with ; or \g.Your MySQL connection id is 10Server version: 5.7.46-tr Source distributionCopyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current inputstatement.mysql> TABLE db.t;+------+| c|+------+|1 |+------+1 row in set (0.00 sec)mysql> INSERT INTO db.t VALUES ROW(2);ERROR 1142 (42000): INSERT command denied to user 'u'@'localhost' for table 't'
当一个数据库名不用于授予数据库级的特权,而是作为授予某些其他对象(例如表或例程)特权的限定符时(例如,),mysql将通配符解释为文字字符。GRANT ... ON
db_name
.tbl_name
由mysql支持的特权
下表概述了允许的priv_type
可为GRANT和REVOKE以及每个特权的级别。有关每个特权的其他信息,请参阅第6.2.2节,”mysql提供的特权”.
表13.5授予和撤销的允许特权
特权 | 意义和可承认水平 |
---|---|
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 | 能够使用Mysq判刑.级别:全球。 |
SUPER | 能够利用其他行政业务,例如:CHANGE MASTER TO,KILL,PURGE BINARY LOGS,SET GLOBAL,以及Mysq判刑;调试指挥官。级别:全球。 |
TRIGGER | 启动触发操作。级别:全球、数据库、表格。 |
UPDATE | 能够使用UPDATE.级别:全局,数据库,表格,列. |
USAGE | 同义词“无特权” |
触发器与表关联。要创造或放下一个触发器,你必须拥有TRIGGER为了桌子的特权,不是触发器。
在…中GRANT声明,ALL [PRIVILEGES]或PROXY特权必须单独命名,不能与其他特权一起指定。ALL [PRIVILEGES]所列所有特权的级别,除了GRANT OPTION和PROXY特权。
USAGE可以指定创建没有权限的用户,或指定REQUIRE
或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
FILEALLGRANT OPTIONPROXYdb_name
.*
…object_type
如果有条款,应规定为:TABLE
,FUNCTION
,或PROCEDURE
当下列对象是表、存储函数或存储过程时.
用户为数据库、表、列或例程持有的权限作为逻辑的附加形式形成。OR每个权限级别的帐户特权,包括全局级别。不可能由于在较低一级没有这种特权而拒绝给予较高级别的特权。例如,这份声明同意SELECT和INSERT全球特权:
GRANT SELECT, INSERT ON *.* TO u1;
全局授予的权限适用于所有数据库、表和列,即使不是在较低级别授予的权限。
特权审核程序详情载于第6.2.6节,”出入控制,第2阶段:请求核查”.
如果您甚至为一个用户使用表、列或例程权限,则服务器检查所有用户的表、列和例程权限,这稍微减缓了mysql的速度。同样,如果您为任何用户限制查询、更新或连接的数量,则服务器必须监控这些值。
Mysql使您能够在不存在的数据库或表上授予特权。对于表格,授予的特权必须包括CREATE特权。这种行为是设计的,目的是使数据库管理员能够为以后创建的数据库或表准备用户帐户和权限。
重要的
当您删除数据库或表时,Mysql不会自动撤销任何特权.但是,如果您放弃了一个例程,则撤销为该例程授予的任何例程级别权限。
帐户名称及密码
Auser
价值aGRANT语句表示该语句所适用的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
遵循A的价值user
价值,auth_option
始于IDENTIFIED
并通过指定帐户身份验证插件、凭证(例如密码)或两者,指示帐户如何进行身份验证。的语法auth_option
条款是相同的CREATE USER声明。详情请参阅第13.7.1.2节,”创建用户声明”.
注意事项
使用GRANT在mysql5.7中,定义帐户身份验证特性是不可取的。相反,建立或改变身份验证特征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节,”创建临时表格说明”.
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.14节,”代理用户”.
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
.
如果帐户已经存在,IDENTIFIED WITH
禁止使用,因为它只用于创建新帐户。
其他帐户特征
除了基于用户名和凭证的通常身份验证之外,Mysql还可以检查X.509证书属性。有关在mysql中使用SSL的背景信息,请参阅第6.3节,”使用加密连接”.
可选择的REQUIRE
条款为mysql帐户指定了与SSL相关的选项。它的语法和CREATE USER声明。详情请参阅第13.7.1.2节,”创建用户声明”.
注意事项
使用GRANT在mysql5.7中,定义帐户SSL特性是不赞成的。相反,建立或改变SSL特性CREATE USER或ALTER USER.希望如此GRANT在未来的mysql版本中移除的能力。
可选择的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.16节,”规定帐户资源限额”.为此,请使用WITH
指定一个或多个的条款resource_option
价值观。未指定的限额保留其当前值。它的语法和CREATE USER声明。详情请参阅第13.7.1.2节,”创建用户声明”.
注意事项
使用GRANT在mysql5.7中,定义帐户资源限制是不被接受的。相反,建立或改变资源限额CREATE USER或ALTER USER.希望如此GRANT在未来的mysql版本中移除的能力。
千年发展目标和标准SQL赠款版本
mysql和标准SQL版本之间的最大差异GRANT是:
Mysql将权限与主机名和用户名相关联,而不仅仅与用户名相关联。
标准SQL没有全局或数据库级的特权,也不支持mysql支持的所有特权类型。
Mysql不支持标准SQL
UNDER
特权。标准的SQL权限是以分层的方式结构化的。如果您删除了一个用户,则撤销了所有授予该用户的权限。在mysql中也是如此DROP USER.看第13.7.1.3节,”放弃用户说明”.
在标准SQL中,当您放下表时,将撤销表的所有特权。在标准SQL中,当您撤销权限时,基于该权限授予的所有权限也将被撤销。在mysql中,可以删除DROP USER或REVOKE声明。
在mysql中,有可能INSERT只对表中的一些列给予特权。在这种情况下,你仍然可以INSERT表中的语句,只要您只为那些您拥有INSERT特权。如果不启用严格的SQL模式,则将省略列设置为其隐式默认值。在严格的模式下,如果任何省略列没有默认值,则拒绝该语句。(标准SQL要求您拥有INSERT所有列都有特权。)有关严格的SQL模式及隐含默认值的资料,请参阅5.1.10节,”服务器SQL模式”,以及第11.6节,”数据类型默认值”.