10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 42.0 mb
PDF (A4)- 42.1 mb
手册页(TGZ)- 267.2 kb
手册页(邮政编码)- 376.9 kb
信息(Gzip)- 4.1 mb
信息(邮政编码)- 4.1 mb
本手册节选

13.7.1.6 GRANT语句

格兰特priv_type((column_list(,)priv_type((column_list)]]…在[object_typepriv_leveluser_or_role[,user_or_role)……[与授予选项][作为。用户[with role default | none | all | all except角色[,角色)……|角色[,角色)……}授予代理user_or_roleuser_or_role[,user_or_role)……[附带拨款选项]拨款角色[,角色)……来user_or_role[,user_or_role)……(与管理选项)object_type:表|函数|过程}priv_level:{* | *。* |db_name* |。db_name.tbl_name|tbl_name|db_nameroutine_nameuser_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_namehost_name帐户名称中的值作为未加引号的标识符是合法的,您不需要将其加引号。但是,必须使用引号来指定user_name包含特殊字符的字符串-),或host_name包含特殊字符或通配符的字符串(例如,“试用者,“@”%。com”).分别引用用户名和主机名。

要指定带引号的值:

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

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

  • 将密码引用为字符串。

有关引用字符串和引用标识符的准则,请参见第9.1.1节,"字符串字面值",第9.2节,“模式对象名称”

_而且中指定数据库名称时,允许使用通配符格兰特在数据库级别授予特权的语句(授予……在db_name.*).这意味着,例如,使用_字符作为数据库名称的一部分,请使用转义字符,\ _格兰特语句,以防止用户访问匹配通配符模式的其他数据库(例如,授予……在“foo \ _bar”。*……).

在特权分配中,MySQL解释出现的unescape_而且在这些情况下,数据库名称中的SQL通配符作为文字字符:

  • 当数据库名不用于在数据库级别授予特权,而是作为向其他对象(如表或例程)授予特权的限定符时(例如,授予……在db_nametbl_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.100C类子网。

简单的形式user_name是的同义词user_name' @ ' % '

MySQL不支持用户名通配符.如果要引用匿名用户,请使用格兰特声明:

在测试中授予所有。* TO " @'localhost'…;

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

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

警告

如果你允许本地匿名用户连接到MySQL服务器,你也应该授予所有本地用户权限user_name' @ ' localhost '.否则,匿名用户的账号为本地主机mysql.usersystem表在命名用户尝试从本地机器登录MySQL服务器时使用。有关详细信息,请参见第6.2.6节,“访问控制,阶段1:连接验证”

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

从mysql中选择主机,用户。用户在用户= ";

为了避免上述问题,使用以下语句删除本地匿名用户帐户:

降低用户”@“localhost”;
MySQL支持的权限

下表总结了允许的静态和动态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选项全局级别授予的静态和动态特权是不同的:

  • GRANT选项对任何静态全局权限授予的权限也适用于所有静态全局权限。

  • 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_nameCURRENT_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版本的GRANT

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节,“数据类型默认值”