格兰特priv_type((column_list(,)priv_type((column_list)]]…在[object_type]priv_level来user_or_role[,user_or_role)……[与授予选项][作为。用户[with role default | none | all | all except角色[,角色)……|角色[,角色)……}授予代理user_or_role来user_or_role[,user_or_role)……[附带拨款选项]拨款角色[,角色)……来user_or_role[,user_or_role)……(与管理选项)object_type:表|函数|过程}priv_level:{* | *。* |db_name* |。db_name.tbl_name|tbl_name|db_name.routine_name}user_or_role: {用户(参见章节6.2.4,“指定帐户名”角色(参见6.2.5节“指定角色名”)}
的格兰特
语句为MySQL用户帐户和角色分配特权和角色。有几个方面格兰特
声明,在以下主题下描述:
的格兰特
语句允许系统管理员授予权限和角色,这些权限和角色可以被授予用户帐户和角色。这些语法限制适用于:
有关角色的更多信息,请参见第6.2.10节,“使用角色”.
授予…特权格兰特
,你必须有GRANT选项
特权,你必须拥有你授予的特权。(或者,如果你有更新
中授予表的权限mysql
系统架构,您可以授予任何帐户任何特权。)当read_only
系统变量已启用,格兰特
另外需要CONNECTION_ADMIN
特权(或已弃用的超级
特权)。
格兰特
对所有命名用户和角色都成功,或者回滚,如果发生任何错误则没有影响。只有在所有已命名用户和角色都成功的情况下,才将语句写入二进制日志。
的撤销
语句与格兰特
并使管理员能够删除帐户特权。看到第13.7.1.8节,“撤销声明”.
每个帐户名称使用中描述的格式第6.2.4节,“指定帐户名称”.每个角色名称使用中描述的格式第6.2.5节,“指定角色名”.例如:
在db1上授予所有权限。*“杰弗里”@“localhost”;GRANT 'role1', 'role2'给'user1'@'localhost', 'user2'@'localhost';在世界上授予选择权限。*“role3”;
如果省略帐户或角色名的主机名部分,默认为“%”
.
通常,数据库管理员首先使用创建用户
创建帐户并定义其非特权特性,如密码、是否使用安全连接以及对服务器资源的访问限制,然后使用格兰特
定义其特权。改变用户
可用于更改现有帐户的非特权特征。例如:
创建用户jeffrey @ localhost IDENTIFIED BY密码”;在db1上授予所有权限。*“杰弗里”@“localhost”;在db2上授予SELECT权限。发票“杰弗里”@“localhost”;ALTER USER 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR
从mysql计划,格兰特
响应与查询OK,影响0行
当成功执行。要确定操作会产生什么权限,请使用秀奖助金
.看到第13.7.7.21节,“SHOW GRANTS声明”.
在某些情况下,格兰特
可能记录在服务器日志中或在客户端历史文件中,例如~ / .mysql_history
,这意味着任何拥有读取权限的人都可能读取明文密码。有关服务器日志发生此情况的条件以及如何控制它的信息,请参见章节6.1.2.3,“密码和日志记录”.有关客户端日志记录的类似信息,请参见第4.5.1.3节,“mysql客户端日志”.
格兰特
支持最多255个字符的主机名(MySQL 8.0.17之前的60个字符)。用户名长度不超过32个字符。数据库、表、列和例程的名称最多可以是64个字符。
不要试图通过更改?来更改用户名的允许长度mysql.user
系统表。这样做会导致不可预测的行为,甚至可能导致用户无法登录MySQL服务器.控件中表的结构永远不要改变mysql
中所描述的过程以外的任何方式的系统模式第2.11节,“升级MySQL”.
几个对象格兰特
语句可以使用引号,尽管在许多情况下引号是可选的:帐户、角色、数据库、表、列和例程名称。例如,如果user_name
或host_name
帐户名称中的值作为未加引号的标识符是合法的,您不需要将其加引号。但是,必须使用引号来指定user_name
包含特殊字符的字符串-
),或host_name
包含特殊字符或通配符的字符串%
(例如,“试用者,“@”%。com”
).分别引用用户名和主机名。
要指定带引号的值:
引用数据库、表、列和例程名称作为标识符。
引用用户名和主机名作为标识符或字符串。
将密码引用为字符串。
有关引用字符串和引用标识符的准则,请参见第9.1.1节,"字符串字面值",第9.2节,“模式对象名称”.
的_
而且%
中指定数据库名称时,允许使用通配符格兰特
在数据库级别授予特权的语句(授予……在
).这意味着,例如,使用db_name
.*_
字符作为数据库名称的一部分,请使用\
转义字符,\ _
在格兰特
语句,以防止用户访问匹配通配符模式的其他数据库(例如,授予……在“foo \ _bar”。*……
).
在特权分配中,MySQL解释出现的unescape_
而且%
在这些情况下,数据库名称中的SQL通配符作为文字字符:
当数据库名不用于在数据库级别授予特权,而是作为向其他对象(如表或例程)授予特权的限定符时(例如,
授予……在
).db_name
.tbl_name
启用
partial_revokes
导致MySQL解释unescape_
而且%
数据库名称中的通配符作为文字字符,就像它们被转义为\ _
而且\ %
.因为这改变了MySQL解释特权的方式,所以在特权分配中避免使用不可转义的通配符是明智的partial_revokes
可能会启用。有关更多信息,请参见第6.2.12节,“使用部分撤销的特权限制”.
一个用户
价值格兰特
语句指定该语句应用的MySQL帐户。为了向来自任意主机的用户授予权限,MySQL支持指定用户
表单中的值'
.user_name
“@”host_name
'
可以在主机名中指定通配符。例如,'
适用于user_name
“@”% .example.com”user_name
对于任何宿主example.com
域,'
适用于user_name
“@”198.51.100. %”user_name
对于任何宿主198.51.100
C类子网。
简单的形式'
是的同义词user_name
''
.user_name
' @ ' % '
MySQL不支持用户名通配符.如果要引用匿名用户,请使用格兰特
声明:
在测试中授予所有。* TO " @'localhost'…;
在这种情况下,任何使用匿名用户的正确密码从本地主机连接的用户都被允许访问,并具有与匿名用户帐户相关联的特权。
有关帐户名中用户名和主机名值的其他信息,请参见第6.2.4节,“指定帐户名称”.
如果你允许本地匿名用户连接到MySQL服务器,你也应该授予所有本地用户权限'
.否则,匿名用户的账号为user_name
' @ ' localhost '本地主机
在mysql.user
system表在命名用户尝试从本地机器登录MySQL服务器时使用。有关详细信息,请参见第6.2.6节,“访问控制,阶段1:连接验证”.
要确定此问题是否适用于您,请执行以下查询,其中列出了任何匿名用户:
从mysql中选择主机,用户。用户在用户= ";
为了避免上述问题,使用以下语句删除本地匿名用户帐户:
降低用户”@“localhost”;
下表总结了允许的静态和动态priv_type
的权限类型格兰特
而且撤销
语句,以及授予每个特权的级别。有关每个特权的其他信息,请参见第6.2.2节“MySQL提供的特权”.有关静态和动态特权之间差异的信息,请参见静态和动态特权.
表13.11 GRANT和REVOKE允许的静态权限
特权 | 意义和可授予级别 |
---|---|
所有(特权) |
授予指定访问级别的所有权限,除GRANT选项 而且代理 . |
改变 |
能够使用ALTER TABLE .级别:全局、数据库、表。 |
改变日常 |
允许更改或删除存储例程。级别:全局、数据库、例程。 |
创建 |
启用数据库和表创建。级别:全局、数据库、表。 |
创建角色 |
使角色创造。水平:全球。 |
创建程序 |
启用存储例程创建。级别:全球、数据库。 |
创建表空间 |
允许创建、修改或删除表空间和日志文件组。水平:全球。 |
创建临时表 |
能够使用创建临时表 .级别:全球、数据库。 |
创建用户 |
能够使用创建用户 ,减少用户 ,重命名用户 ,撤销所有特权 .水平:全球。 |
创建视图 |
允许创建或修改视图。级别:全局、数据库、表。 |
删除 |
能够使用删除 .级别:全局、数据库、表。 |
下降 |
启用删除数据库、表和视图。级别:全局、数据库、表。 |
下降的作用 |
启用角色删除功能。水平:全球。 |
事件 |
启用事件调度器的事件使用。级别:全球、数据库。 |
执行 |
允许用户执行存储例程。级别:全局、数据库、例程。 |
文件 |
允许用户使服务器读或写文件。水平:全球。 |
GRANT选项 |
允许授予或从其他帐户删除特权。级别:全局、数据库、表、例程、代理。 |
指数 |
允许创建或删除索引。级别:全局、数据库、表。 |
插入 |
能够使用插入 .级别:全局、数据库、表、列。 |
锁表 |
能够使用锁表 在你有选择 特权。级别:全球、数据库。 |
过程 |
允许用户查看所有进程显示PROCESSLIST .水平:全球。 |
代理 |
启用用户代理。级别:从用户到用户。 |
参考文献 |
启用创建外密钥。级别:全局、数据库、表、列。 |
重新加载 |
能够使用冲洗 操作。水平:全球。 |
复制客户端 |
允许用户询问源服务器或副本服务器在哪里。水平:全球。 |
复制的奴隶 |
允许副本从源读取二进制日志事件。水平:全球。 |
选择 |
能够使用选择 .级别:全局、数据库、表、列。 |
显示数据库 |
启用显示数据库 显示所有数据库。水平:全球。 |
显示视图 |
能够使用显示创建视图 .级别:全局、数据库、表。 |
关闭 |
能够使用mysqladmin关闭.水平:全球。 |
超级 |
允许使用其他管理操作,例如将复制源更改为 ,改变主 ,杀了 ,清洗二进制日志 ,集全球 ,mysqladmin调试命令。水平:全球。 |
触发 |
启用触发操作。级别:全局、数据库、表。 |
更新 |
能够使用更新 .级别:全局、数据库、表、列。 |
使用 |
的同义词”没有特权” |
表13.12 GRANT和REVOKE允许的动态权限
特权 | 意义和可授予级别 |
---|---|
APPLICATION_PASSWORD_ADMIN |
启用双密码管理。水平:全球。 |
AUDIT_ADMIN |
启用审计日志配置。水平:全球。 |
AUTHENTICATION_POLICY_ADMIN |
启用认证策略管理。水平:全球。 |
BACKUP_ADMIN |
启用备份管理。水平:全球。 |
BINLOG_ADMIN |
开启二进制日志控制。水平:全球。 |
BINLOG_ENCRYPTION_ADMIN |
启用和禁用二进制日志加密功能。水平:全球。 |
CLONE_ADMIN |
使克隆管理。水平:全球。 |
CONNECTION_ADMIN |
启用连接限制/限制控制。水平:全球。 |
ENCRYPTION_KEY_ADMIN |
启用InnoDB 关键的旋转。水平:全球。 |
FIREWALL_ADMIN |
启用防火墙规则管理,任何用户。水平:全球。 |
FIREWALL_EXEMPT |
免除用户的防火墙限制。水平:全球。 |
FIREWALL_USER |
启用防火墙规则管理,自我。水平:全球。 |
FLUSH_OPTIMIZER_COSTS |
启用优化器成本重新加载。水平:全球。 |
FLUSH_STATUS |
启用状态指示灯冲洗。水平:全球。 |
FLUSH_TABLES |
使表冲洗。水平:全球。 |
FLUSH_USER_RESOURCES |
启用用户资源冲洗。水平:全球。 |
GROUP_REPLICATION_ADMIN |
启用组复制控制。水平:全球。 |
INNODB_REDO_LOG_ENABLE |
启用或禁用重做日志记录。水平:全球。 |
INNODB_REDO_LOG_ARCHIVE |
启用重做日志归档管理。水平:全球。 |
NDB_STORED_USER |
允许SQL节点(NDB Cluster)之间共享用户或角色。水平:全球。 |
PASSWORDLESS_USER_ADMIN |
启用无密码用户帐户管理。水平:全球。 |
PERSIST_RO_VARIABLES_ADMIN |
启用持久化只读系统变量。水平:全球。 |
REPLICATION_APPLIER |
作为PRIVILEGE_CHECKS_USER 对于复制区域通道。水平:全球。 |
REPLICATION_SLAVE_ADMIN |
启用常规复制控制。水平:全球。 |
RESOURCE_GROUP_ADMIN |
启用资源组管理。水平:全球。 |
RESOURCE_GROUP_USER |
启用资源组管理。水平:全球。 |
ROLE_ADMIN |
启用角色的授予或撤销、使用与管理选项 .水平:全球。 |
SESSION_VARIABLES_ADMIN |
允许设置受限的会话系统变量。水平:全球。 |
SET_USER_ID |
启用设置自定义者 值。水平:全球。 |
SHOW_ROUTINE |
允许访问存储的例程定义。水平:全球。 |
SYSTEM_USER |
指定帐户为系统帐户。水平:全球。 |
SYSTEM_VARIABLES_ADMIN |
启用修改或持久化全局系统变量。水平:全球。 |
TABLE_ENCRYPTION_ADMIN |
启用重写默认加密设置。水平:全球。 |
VERSION_TOKEN_ADMIN |
启用版本令牌函数。水平:全球。 |
XA_RECOVER_ADMIN |
启用XA恢复 执行。水平:全球。 |
触发器与表相关联。要创建或删除触发器,必须有触发
特权,而不是触发器。
在格兰特
语句,所有(特权)
或代理
特权必须由自身命名,不能与其他特权一起指定。所有(特权)
表示对于要授予特权的级别,除GRANT选项
而且代理
特权。
的表中存储MySQL帐户信息mysql
系统模式。欲了解更多细节,请咨询第6.2节,“访问控制和帐户管理”,讨论了mysql
系统架构和访问控制系统广泛应用。
如果授予表持有包含混合大小写的数据库名或表名的特权行lower_case_table_names
系统变量设置为非零值,撤销
不能用于撤销这些特权。在这种情况下,有必要直接操作授权表。(格兰特
时不创建这样的行lower_case_table_names
,但是这样的行可能已经在设置该变量之前创建。的lower_case_table_names
设置只能在服务器启动时配置。)
权限可以在多个级别授予,具体取决于使用的语法在
条款。为撤销
,同样的在
语法指定要删除哪些权限。
对于全局、数据库、表和例程级别,授予所有
只分配您授予的级别上存在的特权。例如,格兰特在
是数据库级别的语句,因此它不授予任何仅全局的特权,如db_name
.*文件
.授予所有
不分配GRANT选项
或代理
特权。
的object_type
从句,如果存在,应指定为表格
,函数
,或过程
当下列对象是表、存储函数或存储过程时。
用户对数据库、表、列或例程持有的特权是作为逻辑的附加形式形成的或
每个特权级别(包括全局级别)上的帐户特权的。不可能通过缺少较低级别的特权来拒绝在较高级别授予的特权。例如,该语句授予选择
而且插入
全球的特权:
授权选择,插入*。* u1;
全局授予的特权适用于所有数据库、表和列,即使在这些较低级别中没有授予特权。
在MySQL 8.0.16中,可以通过撤销特定数据库的全局级别的特权来显式地拒绝授予的特权,如果partial_revokes
启用系统变量:
在*上授予选择、插入、更新权限。* u1;撤销插入,更新db1。从u1 *;
前面的语句的结果是选择
全局应用于所有表,而插入
而且更新
中的表之外的全局应用db1
.账户访问db1
是只读的。
特权检查过程的详细信息见第6.2.7节,“访问控制,阶段2:请求验证”.
如果你对一个用户使用表、列或例程特权,服务器会检查所有用户的表、列和例程特权,这会降低MySQL的速度。类似地,如果您限制任何用户的查询、更新或连接的数量,服务器必须监视这些值。
MySQL允许您授予不存在的数据库或表的权限。对于表,要授予的权限必须包括创建
特权。这种行为是设计好的,旨在使数据库管理员能够为稍后创建的数据库或表准备用户帐户和特权。
当您删除数据库或表时,MySQL不会自动撤销任何权限.但是,如果删除一个例程,则为该例程授予的任何例程级别特权都将被撤销。
全局权限用于管理或应用于给定服务器上的所有数据库。要分配全局权限,请使用* *。
语法:
授予所有*。*“someuser”@“somehost”;授权选择,插入*。*“someuser”@“somehost”;
的创建表空间
,创建用户
,文件
,过程
,重新加载
,复制客户端
,复制的奴隶
,显示数据库
,关闭
,超级
静态权限是管理权限,只能全局授予。
动态权限都是全局的,只能全局授予。
其他特权可以在全局或更特定的级别上授予。
的影响GRANT选项
全局级别授予的静态和动态特权是不同的:
授予所有
在全局级别授予所有静态全局权限和所有当前注册的动态权限。的执行之后注册的动态权限格兰特
报表不会追溯至任何帐户。
MySQL将全局权限存储在mysql.user
系统表。
数据库权限适用于给定数据库中的所有对象。要分配数据库级权限,请使用在
语法:db_name
.*
在mydb上授予所有权限。*“someuser”@“somehost”;授权在mydb上进行SELECT、INSERT操作。*“someuser”@“somehost”;
如果你使用在*
语法(而不是* *。
),则在数据库级别为默认数据库分配权限。如果没有默认数据库,则会发生错误。
的创建
,下降
,事件
,GRANT选项
,锁表
,参考文献
可以在数据库级别指定权限。表或例程权限也可以在数据库级别指定,在这种情况下,它们适用于数据库中的所有表或例程。
MySQL将数据库权限存储在mysql.db
系统表。
表权限适用于给定表中的所有列。要分配表级权限,请使用在
语法:db_name.tbl_name
在mydb上授予所有权限。mytbl“someuser”@“somehost”;授权在mydb上进行SELECT、INSERT操作。mytbl“someuser”@“somehost”;
如果您指定tbl_name
而不是db_name.tbl_name
,这句话适用于tbl_name
在默认数据库中。如果没有默认数据库,则会发生错误。
允许priv_type
表级别的值为改变
,创建视图
,创建
,删除
,下降
,GRANT选项
,指数
,插入
,参考文献
,选择
,显示视图
,触发
,更新
.
表级权限适用于基表和视图。它们不适用于使用创建的表创建临时表
,即使表名匹配。和有关信息。临时
表特权,看到第13.1.20.2节,“创建临时表语句”.
MySQL将表权限存储在mysql.tables_priv
系统表。
列权限适用于给定表中的单个列。要在列级别授予的每个特权都必须在后面加上用括号括起来的一个或多个列。
GRANT SELECT (col1), INSERT (col1, col2)mytbl“someuser”@“somehost”;
允许priv_type
列的值(也就是说,当使用column_list
条款)插入
,参考文献
,选择
,更新
.
MySQL将列权限存储在mysql.columns_priv
系统表。
的改变日常
,创建程序
,执行
,GRANT选项
特权适用于存储例程(过程和函数)。它们可以在全局和数据库级别授予。除了创建程序
,这些特权可以在例程级别为个别例程授予。
授权在mydb上创建例程。*“someuser”@“somehost”;允许执行过程mydb。myproc“someuser”@“somehost”;
允许priv_type
例程级别的值是改变日常
,执行
,GRANT选项
.创建程序
不是例程级别的特权,因为您必须首先拥有全局或数据库级别的特权才能创建例程。
MySQL将例程级权限存储在mysql.procs_priv
系统表。
的代理
特权使一个用户成为另一个用户的代理。代理用户冒充或者采用代理用户的身份;也就是说,它假定代理用户的特权。
授予“localuser @ localhost”代理权限给“externaluser @ somehost”;
当代理
时,它必须是惟一在格兰特
声明中,唯一允许的与
选择是使用GRANT选项
.
代理要求代理用户通过一个插件进行身份验证,该插件在代理用户连接时向服务器返回代理用户的名称,并且代理用户具有代理
被代理用户的权限。详细信息和示例请参见第6.2.19节,“代理用户”.
MySQL将代理权限存储在mysql.proxies_priv
系统表。
格兰特
语法没有在
子句授予角色而不是个人特权。角色是一个命名的特权集合;看到第6.2.10节,“使用角色”.例如:
GRANT 'role1', 'role2'给'user1'@'localhost', 'user2'@'localhost';
要授予的每个角色必须存在,以及要授予它的每个用户帐户或角色。在MySQL 8.0.16版本中,角色不能被授予匿名用户。
授予角色不会自动使角色处于活动状态。有关角色激活和失活的信息,请参见激活的角色.
授予角色时需要这些特权:
如果你有
ROLE_ADMIN
特权(或已弃用的超级
,您可以向用户或角色授予或撤销任何角色。如果你被授予一个角色
格兰特
语句,该语句包含与管理选项
子句,您将能够将该角色授予其他用户或角色,或从其他用户或角色撤消该角色,只要该角色在您随后授予或撤消它的时间处于活动状态。这包括使用的能力与管理选项
本身。授予一个具有
SYSTEM_USER
特权,你必须拥有SYSTEM_USER
特权。
可以使用创建循环引用格兰特
.例如:
CREATE USER 'u1', 'u2';创建角色:r1, r2GRANT 'u1' TO 'u1';——简单循环:u1 => u1 GRANT 'r1' TO 'r1';——简单循环:r1 => r1 GRANT 'r2' TO 'u2';GRANT u2 TO r2;——user/role混合循环:u2 => r2 => u2
允许循环授予引用,但不会向被授予者添加新的特权或角色,因为用户或角色已经拥有它的特权和角色。
从MySQL 8.0.16开始,格兰特
有一个作为
子句,该子句指定关于要用于语句执行的特权上下文的附加信息。这种语法在SQL级别是可见的,尽管它的主要目的是通过使那些限制出现在二进制日志中,从而在部分撤销所施加的授权人特权限制的所有节点上实现统一复制。有关部分撤销的信息,请参见第6.2.12节,“使用部分撤销的特权限制”.用户
(作用)
当作为
子句指定时,语句执行将考虑与指定用户关联的任何特权限制,包括指定的所有角色用户
与角色
,如果存在。结果是,相对于指定的特权,该语句实际授予的特权可能会减少。
这些条件适用于作为
条款:用户
作为
只有当命名时才有效果用户
有特权限制(这意味着partial_revokes
启用系统变量)。如果
与角色
时,所有命名的角色都必须授予命名的用户
.指定的
用户
MySQL帐户应该指定为'
,user_name
“@”host_name
'CURRENT_USER
,或CURRENT_USER ()
.当前用户名可以与与角色
对于执行用户想要的情况格兰特
执行时应用的一组角色可能不同于当前会话中的活动角色。作为
不能用于获得执行的用户所不拥有的权限格兰特
声明。执行用户必须至少具有被授予的权限,但是作为
条款只能限制授予的特权,而不能升级他们。关于该授予的特权,
作为
不能指定比执行的用户拥有更多权限(限制更少)的用户/角色组合格兰特
声明。的作为
允许用户/角色组合拥有比执行用户更多的权限,但前提是该语句没有授予这些额外的权限。作为
仅支持授予全局权限(* *。
).作为
不支持代理
资助。
的效果作为
条款。创建一个用户u1
它有一些全局特权,以及对这些特权的限制:
创建用户u1;在*上授予选择、插入、更新、删除权限。* u1;REVOKE INSERT, UPDATE ON schema1。从u1 *;REVOKE SELECT ON schema2。从u1 *;
还要创建一个角色r1
这将解除一些特权限制,并将角色授予u1
:
创建角色r1;GRANT INSERT ON schema1。* r1;GRANT SELECT ON schema2。* r1;GRANT r1到u1;
现在,使用自己没有特权限制的帐户,向多个用户授予相同的全局特权集,但每个用户都有由作为
子句,并检查实际授予了哪些特权。
的
格兰特
这里的语句没有作为
子句,因此被授予的特权正是指定的特权:创建用户u2授予SELECT、INSERT、UPDATE操作权限。* u2;mysql> SHOW GRANTS FOR u2;+-------------------------------------------------+ | 授予对u2 @% | +-------------------------------------------------+ | *格兰特选择、插入、更新。*“u2 `@`%` | +-------------------------------------------------+
的
格兰特
这里的语句有一个作为
子句,所以授予的特权是指定的,但有限制u1
应用:创建用户u3授予SELECT、INSERT、UPDATE操作权限。* TO u3 AS u1;mysql> SHOW GRANTS FOR u3;+----------------------------------------------------+ | 资助u3 @% | +----------------------------------------------------+ | *格兰特选择、插入、更新。* TO ' u3 ' @ ' % ' | | REVOKE INSERT, UPDATE ON ' schema1 '。* FROM ' u3 ' @ ' % ' | | REVOKE SELECT ON ' schema2 '。*从“u3 `@`%` | +----------------------------------------------------+
如前所述,
作为
条款只能添加特权限制;它不能升级特权。因此,尽管u1
有删除
特权,它不包含在授予的特权中,因为语句没有指定授予删除
.的
作为
条款的格兰特
这里的语句构成了角色r1
积极为u1
.这个角色解除了一些限制u1
.因此,授予的特权有一些限制,但没有前面的那么多格兰特
声明:mysql>创建用户u4授予SELECT、INSERT、UPDATE操作权限。* TO u4 AS u1 WITH ROLE r1;mysql> SHOW GRANTS FOR u4;+-------------------------------------------------+ | 拨款的愉快 @% | +-------------------------------------------------+ | *格兰特选择、插入、更新。* TO ' u4 ' @ ' % ' | | REVOKE UPDATE ON ' schema1 '。*从“愉快 `@`%` | +-------------------------------------------------+
如果一个格兰特
声明中包括一个作为
子句,对执行该语句的用户的特权限制将被忽略(而不是像在没有用户
作为
条款)。
可选与
子句用于使用户能够向其他用户授予特权。的使用GRANT选项
子句赋予用户向其他用户授予该用户在指定权限级别上的任何权限的能力。
授予的GRANT选项
在不更改帐户权限的情况下,可以这样做:
授予*的使用权限。*授予someuser @ somehost权限;
小心你把钱给谁GRANT选项
特权,因为具有不同特权的两个用户可以组合特权!
您不能授予其他用户您自己没有的特权;的GRANT选项
特权使您能够只分配您自己拥有的特权。
请注意,当授予用户GRANT选项
在特定特权级别上的特权,该用户拥有(或将来可能被授予)该级别上的任何特权也可以由该用户授予其他用户。假设您授予用户插入
对数据库的权限。如果你同意选择
权限,并指定使用GRANT选项
,该用户不仅可以给其他用户选择
特权,但也插入
.如果你同意更新
权限给数据库上的用户,用户可以授予插入
,选择
,更新
.
对于非管理用户,不应授予改变
特权全局或为mysql
系统模式。如果这样做,用户就可以通过重命名表来颠覆特权系统!
有关与特定特权关联的安全风险的其他信息,请参见第6.2.2节“MySQL提供的特权”.
MySQL和标准SQL版本之间最大的区别格兰特
是:
MySQL将特权与主机名和用户名的组合关联,而不仅仅是用户名。
标准SQL没有全局或数据库级特权,也不支持MySQL支持的所有特权类型。
MySQL不支持标准SQL
下
特权。标准SQL权限以分层的方式构造。如果删除用户,该用户被授予的所有特权将被撤销。这在MySQL中也是正确的
减少用户
.看到第13.7.1.5节," DROP USER语句".在标准SQL中,当您删除一个表时,该表的所有权限都将被撤销。在标准SQL中,当您撤销一个权限时,基于该权限授予的所有权限也会被撤销。在MySQL中,可以删除特权
减少用户
或撤销
语句。在MySQL中,可以有
插入
只有表中某些列的权限。在这种情况下,仍然可以执行插入
语句,前提是仅为具有插入
特权。如果未启用严格SQL模式,则将省略的列设置为它们的隐式默认值。在严格模式下,如果任何被省略的列没有默认值,则语句将被拒绝。(标准SQL要求您拥有插入
所有列上的特权。)有关严格SQL模式和隐式默认值的信息,请参见第5.1.11节,“服务器SQL模式”,第11.6节,“数据类型默认值”.