GRANT语句
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...ON [object_type] priv_levelTO user_or_role [, user_or_role] ... [WITH GRANT OPTION ] [AS user [WITH ROLE DEFAULT |NONE |ALL |ALL EXCEPT role [, role ] ... | role [, role ] ... ] ] }GRANT PROXY ON user_or_roleTO user_or_role [, user_or_role] ... [WITH GRANT OPTION ]GRANT role [, role] ...TO user_or_role [, user_or_role] ... [WITH ADMIN OPTION ] object_type: {TABLE |FUNCTION |PROCEDURE } priv_level: { * | *.* | db_name.* | db_name.tbl_name | tbl_name | db_name.routine_name } user_or_role: { user (see Section 6.2.4, “SpecifyingAccount Names ”) | role (see Section 6.2.5, “SpecifyingRole Names ”) }
该GRANT
语句为MySQL用户帐户和角色分配特权和角色。该GRANT
语句有多个方面,在以下主题下进行了描述:
- GRANT概述
- 对象报价准则
- 帐号名称
- MySQL支持的特权
- 全球特权
- 数据库特权
- 表特权
- 列特权
- 存储的例行特权
- 代理用户权限
- 授予角色
- 该
AS
条款和权限限制 - 其他帐户特征
- GRANT的MySQL和标准SQL版本
GRANT概述
该GRANT
语句使系统管理员可以授予特权和角色,这些特权和角色可以授予用户帐户和角色。这些语法限制适用于:
GRANT
不能在同一条语句中混合授予特权和角色。给定的GRANT
语句必须授予特权或角色。该
ON
子句区分该语句是授予特权还是角色:- 使用
ON
,该语句授予特权。 - 不使用
ON
,该语句将授予角色。 - 可以为帐户分配特权和角色,但是您必须使用单独的
GRANT
语句,每个语句的语法都适合于要授予的语句。
- 使用
有关角色的更多信息,请参见“授权控制”。
要使用GRANT
,您必须具有GRANT OPTION
特权,并且必须具有要授予的特权。当read_only
启用了系统变量,GRANT
另外需要CONNECTION_ADMIN
或SUPER
特权。
GRANT
对于所有命名的用户和角色都成功,或者回滚并且如果发生任何错误都不起作用。该语句仅在所有命名用户和角色都成功的情况下才写入二进制日志。
该REVOKE
语句与GRANT
管理员相关,并使管理员能够删除帐户特权。请参见“ REVOKE语句”。
每个帐户名均使用“指定帐户名”中所述的格式。每个角色名称使用“指定角色名称”中描述的格式。例如:
GRANT ALL ON db1.*TO 'jeffrey'@'localhost';GRANT 'role1', 'role2'TO 'user1'@'localhost', 'user2'@'localhost';GRANT SELECT ON world.*TO 'role3';
帐户或角色名称的主机名部分(如果省略)默认为'%'
。
通常,数据库管理员首先用于CREATE USER
创建帐户并定义其非特权特征,例如其密码,是否使用安全连接以及对服务器资源的访问限制,然后再用于GRANT
定义其特权。ALTER USER
可用于更改现有帐户的非特权特征。例如:
CREATE USER 'jeffrey'@'localhost'IDENTIFIED BY 'password';GRANT ALL ON db1.*TO 'jeffrey'@'localhost';GRANT SELECT ON db2.invoiceTO 'jeffrey'@'localhost';ALTER USER 'jeffrey'@'localhost'WITH MAX_QUERIES_PER_HOUR 90;
从mysql程序中,成功执行时以GRANT
响应Query OK, 0 rows affected
。要确定该操作会带来哪些特权,请使用SHOW GRANTS
。请参见“ SHOW GRANTS语句”。
重要在某些情况下,
GRANT
可能会记录在服务器日志中或客户端的历史记录文件中,例如~/.mysql_history
,这意味着具有对该信息的读取访问权限的任何人都可以读取明文密码。有关服务器日志发生这种情况的条件以及如何控制它的信息,有关客户端日志记录的类似信息,请参见“ mysql客户端日志记录”。
GRANT
支持的主机名最长为255个字符(MySQL 8.0.17之前的60个字符)。用户名最多可以包含32个字符。数据库,表,列和例程的名称最多可以包含64个字符。
警告不要试图通过更改
mysql.user
系统表来更改用户名的允许长度。这样做会导致无法预测的行为,甚至可能使用户无法登录到MySQL服务器。mysql
除非通过“升级MySQL”中描述的过程,否则切勿以任何方式更改系统模式中表的结构。
对象报价准则
GRANT
语句中的几个对象都需要引用,尽管在许多情况下引用是可选的:帐户,角色,数据库,表,列和例程名称。例如,如果帐户名中的user_name
或host_name
值作为未引用标识符是合法的,则无需引用它。然而,引号是必要指定user_name
包含特殊字符(例如字符串-
),或一个host_name
包含字符串的特殊字符或通配符,如%
(例如'test-user'@'%.com'
)。分别引用用户名和主机名。
要指定引用的值:
- 引用数据库,表,列和例程名称作为标识符。
- 用用户名和主机名加引号作为标识符或字符串。
- 用密码引用字符串。
有关字符串引用和标识符引用的准则,请参见“字符串文字”和“架构对象名称”。
在授予数据库级别特权的语句中指定数据库名称时,允许使用_
和%
通配符。例如,这意味着要将字符用作数据库名称的一部分,请在语句中指定该字符,以防止用户能够访问与通配符模式匹配的其他数据库(例如)。GRANT
GRANT ... ON db_name.*
_
\_
GRANT
GRANT ... ON `foo\_bar`.* TO ...
如果不使用数据库名称在数据库级别授予特权,而是将其用作授予表或例程(例如)之类的其他对象的特权的限定符,则通配符将被视为普通字符。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' ...;
在这种情况下,将使用与匿名用户帐户相关联的特权,允许从本地主机使用匿名用户的正确密码连接的任何用户访问。
有关帐户名中用户名和主机名值的更多信息,请参见“创建账户”。
警告如果允许本地匿名用户连接到MySQL服务器,则还应将所有本地用户的权限授予。否则,匿名用户帐户在当指定的用户试图从本地机器上登录到MySQL服务器使用的系统表。有关详细信息,
'user_name'@'localhost'
localhost
mysql.user
要确定此问题是否适用于您,请执行以下查询,其中列出了所有匿名用户:
SELECT Host ,User FROM mysql.user WHERE User ='';
为避免上述问题,请使用以下语句删除本地匿名用户帐户:
DROP USER ''@'localhost';
MySQL支持的特权
下表总结了priv_type
可以为GRANT
and REVOKE
语句指定的允许的静态和动态特权类型,以及可以授予每个特权的级别。有关每个特权的更多信息,请参见“ MySQL提供的特权”。有关静态特权和动态特权之间的区别的信息,请参见静态对动态特权。
GRANT和REVOKE允许的静态特权
特权 | 含义和授予级别 |
---|---|
ALL[PRIVILEGES] | 在指定的访问级别授予所有特权,除了GRANT OPTION 和PROXY 。 |
ALTER | 启用ALTER TABLE 。级别:全局,数据库,表。 |
ALTER ROUTINE | 使存储的例程能够被更改或删除。级别:全局,数据库,常规。 |
CREATE | 启用数据库和表创建。级别:全局,数据库,表。 |
CREATE ROLE | 启用角色创建。级别:全球。 |
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 | 启用要删除的数据库,表和视图。级别:全局,数据库,表。 |
DROP ROLE | 启用角色删除。级别:全球。 |
EVENT | 为事件计划程序启用事件的使用。级别:全局,数据库。 |
EXECUTE | 使用户能够执行存储的例程。级别:全局,数据库,常规。 |
FILE | 使用户能够使服务器读取或写入文件。级别:全球。 |
GRANT OPTION | 启用授予其他帐户特权或从其他帐户删除的特权。级别:全局,数据库,表,例程,代理。 |
INDEX | 启用要创建或删除的索引。级别:全局,数据库,表。 |
INSERT | 启用INSERT 。级别:全局,数据库,表,列。 |
LOCK TABLES | 启用LOCK TABLES 对您拥有SELECT 特权的on表的使用。级别:全局,数据库。 |
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 | “没有特权”的同义词 |
GRANT和REVOKE的允许动态特权
特权 | 含义和授予级别 |
---|---|
APPLICATION_PASSWORD_ADMIN | 启用双重密码管理。级别:全球。 |
AUDIT_ADMIN | 启用审核日志配置。级别:全球。 |
BACKUP_ADMIN | 启用备份管理。级别:全球。 |
BINLOG_ADMIN | 启用二进制日志控制。级别:全球。 |
BINLOG_ENCRYPTION_ADMIN | 启用激活和禁用二进制日志加密。级别:全球。 |
CLONE_ADMIN | 启用克隆管理。级别:全球。 |
CONNECTION_ADMIN | 启用连接限制/限制控制。级别:全球。 |
ENCRYPTION_KEY_ADMIN | 启用InnoDB 按键旋转。级别:全球。 |
FIREWALL_ADMIN | 对任何用户启用防火墙规则管理。级别:全球。 |
FIREWALL_USER | 启用防火墙规则自我管理。级别:全球。 |
GROUP_REPLICATION_ADMIN | 启用组复制控制。级别:全球。 |
INNODB_REDO_LOG_ARCHIVE | 启用重做日志归档管理。级别:全球。 |
NDB_STORED_USER | 启用SQL节点(NDB群集)之间的用户或角色共享。级别:全球。 |
PERSIST_RO_VARIABLES_ADMIN | 启用持久性只读系统变量。级别:全球。 |
REPLICATION_APPLIER | 充当PRIVILEGE_CHECKS_USER 复制通道。级别:全球。 |
REPLICATION_SLAVE_ADMIN | 启用常规复制控制。级别:全球。 |
RESOURCE_GROUP_ADMIN | 启用资源组管理。级别:全球。 |
RESOURCE_GROUP_USER | 启用资源组管理。级别:全球。 |
ROLE_ADMIN | 使用可以授予或撤消角色WITH ADMIN OPTION 。级别:全球。 |
SESSION_VARIABLES_ADMIN | 启用设置受限制的会话系统变量。级别:全球。 |
SET_USER_ID | 启用设置非自身DEFINER 值。级别:全球。 |
SHOW_ROUTINE | 启用对存储的例程定义的访问。级别:全球。 |
SYSTEM_USER | 将帐户指定为系统帐户。级别:全球。 |
SYSTEM_VARIABLES_ADMIN | 启用修改或保留全局系统变量。级别:全球。 |
TABLE_ENCRYPTION_ADMIN | 启用替代的默认加密设置。级别:全球。 |
VERSION_TOKEN_ADMIN | 启用版本令牌UDF的使用。级别:全球。 |
XA_RECOVER_ADMIN | 启用XA RECOVER 执行。级别:全球。 |
触发器与表关联。要创建或删除触发器,您必须具有TRIGGER
表的权限,而不是触发器的权限。
在GRANT
语句中,ALL[PRIVILEGES]
or PROXY
特权必须自己命名,不能与其他特权一起指定。ALL[PRIVILEGES]
代表除GRANT OPTION
和PROXY
特权外,在授予特权的级别上可用的所有特权。
MySQL帐户信息存储在mysql
系统架构的表中。有关更多详细信息,请参见“访问控制和帐户管理”,其中广泛讨论了mysql
系统架构和访问控制系统。
如果授予表包含包含大小写混合的数据库名或表名的特权行,并且lower_case_table_names
系统变量设置为非零值,REVOKE
则不能用于撤消这些特权。有必要直接操作授权表。(设置GRANT
时将不会创建此类行lower_case_table_names
,但是此类行可能是在设置该变量之前创建的。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;
全局授予的特权适用于所有数据库,表和列,即使未在任何较低级别上授予。
从MySQL 8.0.16开始,如果partial_revokes
启用了系统变量,则可以通过撤销特定数据库的特权来显式拒绝在全局级别授予的特权:
GRANT SELECT ,INSERT ,UPDATE ON *.*TO u1;REVOKE INSERT ,UPDATE ON db1.*FROM u1;
上述语句的结果是,SELECT
在全球范围适用于所有表格,而INSERT
和UPDATE
全局应用除了在表中db1
。帐户访问权限db1
为只读。
“访问控制,阶段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
对于静态和动态特权,在全局级别授予的效果不同:
GRANT OPTION
为任何静态全局特权授予的权限适用于所有静态全局特权。GRANT OPTION
为任何动态特权授予的权限仅适用于该动态特权。
GRANT ALL
在全局级别授予所有静态全局特权和所有当前注册的动态特权。在执行该GRANT
语句之后注册的动态特权不会追溯授予任何帐户。
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.mytblTO 'someuser'@'somehost';GRANT SELECT ,INSERT ON mydb.mytblTO '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
表特权的信息,请参见“ CREATE TEMPORARY TABLE语句”。
MySQL将表特权存储在mysql.tables_priv
系统表中。
列特权
列特权适用于给定表中的单个列。在列级别要授予的每个特权都必须在括号后加上一个或多个列。
GRANT SELECT (col1), INSERT (col1, col2)ON mydb.mytblTO '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.myprocTO '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
语句,唯一允许WITH
选项WITH GRANT OPTION
。
代理要求代理用户通过一个插件进行身份验证,该插件在代理用户连接时将代理用户的名称返回到服务器,并且代理用户必须具有代理用户的PROXY
特权。有关详细信息和示例,请参见“代理用户”。
MySQL将代理特权存储在mysql.proxies_priv
系统表中。
授予角色
GRANT
不带ON
子句的语法授予角色而不是个人特权。角色是特权的命名集合;请参见“授权控制”。例如:
GRANT 'role1', 'role2'TO 'user1'@'localhost', 'user2'@'localhost';
要授予的每个角色以及要授予它的每个用户帐户或角色都必须存在。从MySQL 8.0.16开始,不能将角色授予匿名用户。
授予角色不会自动使该角色处于活动状态。有关角色激活和停用的信息,请参阅激活角色。
这些特权是授予角色所必需的:
- 如果您具有
ROLE_ADMIN
或SUPER
特权,则可以向用户或角色授予或撤消任何角色。 - 如果使用
GRANT
包含该WITH ADMIN OPTION
子句的语句为您授予角色,则只要该角色在您随后授予的时间处于活动状态,就可以将该角色授予其他用户或角色,或将其从其他用户或角色撤消。或撤销它。这包括使用WITH ADMIN OPTION
自身的能力。 - 要授予具有
SYSTEM_USER
特权的角色,您必须具有SYSTEM_USER
特权。
可以使用创建循环引用GRANT
。例如:
CREATE USER 'u1', 'u2';CREATE ROLE 'r1', 'r2';GRANT 'u1'TO 'u1'; -- simple loop: u1 => u1GRANT 'r1'TO 'r1'; -- simple loop: r1 => r1GRANT 'r2'TO 'u2';GRANT 'u2'TO 'r2'; -- mixed user/role loop: u2 => r2 => u2
允许循环授予引用,但不会向被授予者添加新的特权或角色,因为用户或角色已经具有其特权和角色。
该AS
条款和权限限制
从MySQL 8.0.16开始,GRANT
具有一个子句,用于指定有关用于语句执行的特权上下文的其他信息。该语法在SQL级别上可见,尽管其主要目的是通过使这些限制出现在二进制日志中,从而在跨部分撤销的授予者特权限制的所有节点上实现统一复制。有关部分吊销的信息,请参见“使用部分吊销的权限限制”。AS user[WITH ROLE]
指定该子句后,语句执行将考虑与命名用户相关联的所有特权限制,包括由指定的所有角色(如果存在)。结果是,该语句实际授予的特权可能相对于指定的特权有所减少。AS user
WITH ROLE
这些条件适用于以下条款:AS user
AS
仅当nameduser
具有特权限制时才有效(这意味着partial_revokes
已启用系统变量)。- 如果
WITH ROLE
指定了,则必须将所有已命名的角色授予nameduser
。 - 命名
user
应该是一个MySQL账户指定为,或。当前用户可以与正在执行的用户想要以一组应用的角色一起执行的情况一起命名,这些角色可能与当前会话中的活动角色不同。'user_name'@'host_name'
CURRENT_USER
CURRENT_USER()
WITH ROLE
GRANT
AS
不能用于获取执行该GRANT
语句的用户不拥有的特权。执行用户必须至少具有要授予的特权,但是该AS
子句只能限制所授予的特权,而不能升级它们。- 关于要授予的特权,
AS
不能指定比执行该GRANT
语句的用户具有更多特权(较少限制)的用户/角色组合。该AS
用户/角色组合允许具有比执行用户更多权限,但前提是该语句不授予这些额外的权限。 AS
仅支持授予全局特权(ON *.*
)。AS
不支持PROXY
赠款。
以下示例说明了该AS
子句的效果。创建u1
具有某些全局特权以及这些特权限制的用户:
CREATE USER u1;GRANT SELECT ,INSERT ,UPDATE ,DELETE ON *.*TO u1;REVOKE INSERT ,UPDATE ON schema1.*FROM u1;REVOKE SELECT ON schema2.*FROM u1;
还创建一个角色r1
,以解除某些特权限制,并将该角色授予u1
:
CREATE ROLE r1;GRANT INSERT ON schema1.*TO r1;GRANT SELECT ON schema2.*TO r1;GRANT r1TO u1;
现在,使用没有自己的特权限制的帐户,向多个用户授予相同的全局特权集,但是每个用户都具有由AS
子句施加的不同限制,并检查实际授予了哪些特权。
GRANT
这里的语句没有AS
子句,因此授予的特权恰好是指定的那些特权:mysql>
CREATE USER u2; mysql>GRANT SELECT ,INSERT ,UPDATE ON *.*TO u2; mysql>SHOW GRANTS FOR u2; +------------------------------------------------- + | Grants for u2@% | +------------------------------------------------- + | GRANT SELECT, INSERT, UPDATE ON *.* TO `u2`@`%` | +------------------------------------------------- +GRANT
此处的语句有一个AS
子句,因此授予的特权是指定的特权,但有受限制的u1
应用:mysql>
CREATE USER u3; mysql>GRANT SELECT ,INSERT ,UPDATE ON *.*TO u3AS u1; mysql>SHOW GRANTS FOR u3; +---------------------------------------------------- + | Grants for u3@% | +---------------------------------------------------- + | GRANT SELECT, INSERT, UPDATE ON *.* TO `u3`@`%` | | REVOKE INSERT, UPDATE ON `schema1`.* FROM `u3`@`%` | | REVOKE SELECT ON `schema2`.* FROM `u3`@`%` | +---------------------------------------------------- +如前所述,该
AS
子句只能添加特权限制。它不能升级特权。因此,尽管u1
具有DELETE
特权,但由于该语句未指定granting,所以该特权不包括在已授予的特权中DELETE
。在
AS
该条款GRANT
这里声明,使角色r1
活跃u1
。该角色解除了对的某些限制u1
。因此,授予的特权有一些限制,但没有前面的GRANT
声明那么多:mysql>
CREATE USER u4; mysql>GRANT SELECT ,INSERT ,UPDATE ON *.*TO u4AS u1WITH ROLE r1; mysql>SHOW GRANTS FOR u4; +------------------------------------------------- + | Grants for u4@% | +------------------------------------------------- + | GRANT SELECT, INSERT, UPDATE ON *.* TO `u4`@`%` | | REVOKE UPDATE ON `schema1`.* FROM `u4`@`%` | +------------------------------------------------- +
如果一条GRANT
语句包含一个子句,则会忽略对执行该语句的用户的特权限制(而不是像没有子句时那样应用特权限制)。AS user
AS
其他帐户特征
可选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
系统架构上授予特权。如果这样做,用户可以尝试通过重命名表来破坏特权系统!
有关与特定特权相关的安全风险的更多信息,请参见“ MySQL提供的特权”。
GRANT的MySQL和标准SQL版本
MySQL和标准SQL版本之间的最大区别GRANT
是:
- MySQL将特权与主机名和用户名的组合相关联,而不仅仅是用户名。
- 标准SQL没有全局或数据库级特权,也不支持MySQL支持的所有特权类型。
- MySQL不支持标准的SQL
UNDER
特权。 - 标准SQL特权以分层的方式构造。如果删除用户,则将撤消已授予该用户的所有特权。如果使用,在MySQL中也是如此
DROP USER
。请参见“ DROP USER语句”。 - 在标准SQL中,当您删除表时,该表的所有特权都将被吊销。在标准SQL中,当您撤消特权时,基于该特权授予的所有特权也会被撤消。在MySQL中,可以使用
DROP USER
或REVOKE
语句删除特权。 - 在MySQL中,可能
INSERT
仅对表中的某些列具有特权。在这种情况下,INSERT
只要您仅为拥有INSERT
特权的那些列插入值,就仍然可以在表上执行语句。如果未启用严格的SQL模式,则省略的列将设置为其隐式默认值。在严格模式下,如果任何省略的列都没有默认值,则该语句将被拒绝。(标准SQL要求您INSERT
在所有列上都具有特权。)有关严格SQL模式和隐式默认值的信息,请参见“服务器SQL模式”和“数据类型默认值”。