GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO 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_role
TO 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, “Specifying Account Names”)
| role (see Section 6.2.5, “Specifying Role Names”)
}
GRANT 语句为 MySQL 用户帐户和角色分配权限和角色。GRANT 语句使系统管理员能够授予权限和角色,这些权限和角色可以授予用户账户和角色。语法限制:● GRANT 不能在同一语句中同时授予权限和角色。GRANT 语句必须授予权限或角色。■ 允许将权限和角色都分配给账户,但必须使用单独的 GRANT 语句,每个语句的语法与要授予的内容相匹配。要使用 GRANT 授权,必须具有 GRANT OPTION 权限,并且必须具有正在授予的权限。(或者说,如果您拥有 mysql 系统架构中授权表的 UPDATE 权限,则可以向任何账户授予权限。)启用 read_only 系统变量时,GRANT 还需要 CONNECTION_ADMIN 权限(或不推荐使用的 SUPER 权限)。对于所有指定的用户和角色,GRANT 要么成功,要么出错回滚,不起任何作用。只有对所有指定用户和角色成功时,才会将语句写入二进制日志。REVOKE 语句与 GRANT 相关,允许管理员删除账户权限。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.invoice TO 'jeffrey'@'localhost';
ALTER USER 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90;
在 mysql 程序中,当执行成功时,GRANT 响应 Query OK, 0 rows affected。要确定操作产生的权限,请使用 SHOW GRANTS 语句查询。在某些情况下,GRANT 可能会记录在服务器日志中,或者记录在客户端的历史文件中,比如 ~/.mysql_history,这意味着任何有权读取该信息的人都可以读取明文密码。GRANT 支持最长 255 个字符的主机名(MySQL 8.0.17 之前为 60 个字符)。用户名最多可包含 32 个字符。数据库、表、列和例程名称最多可包含 64 个字符。不要试图通过更改 mysql.user 系统表,来更改用户名允许的长度。这样做会导致不可预知的行为,甚至可能导致用户无法登录 MySQL 服务器。除非通过升级 mysql,否则不要以任何方式更改 mysql 系统模式中的表结构。GRANT 语句中的几个对象都有引号,尽管引号在许多情况下是可选的:帐户、角色、数据库、表、列和例程名称。例如,如果帐户名中的 user_name 或 host_name 值作为未加引号的标识符是合法的,则不需要加引号。但是,必须使用引号指定包含特殊字符(例如 -)的 user_name 字符串,或包含特殊字符或通配符,例如 %(例如,'test-user'@'%.com')的 host_name 字符串。分别引用用户名和主机名。在授予数据库级别权限的 GRANT 语句中指定数据库名称时,是允许 _ 和 % 通配符的(GRANT ... ON db_name.*)。这意味着,例如,要将 _ 字符用作数据库名称的一部分,请在 GRANT 语句中将其指定为 \_,以防止用户访问与通配符模式匹配的其他数据库(例如,GRANT ... ON `foo\_bar`.* TO ...)。当数据库名称不是用于在数据库级别授予权限,而是用作向其他对象(如表或例程)授予权限的限定符时(例如,GRANT ... ON db_name.tbl_name),通配符被视为普通字符。GRANT 语句中的 user 值表示该语句所应用的 MySQL 账户。为了允许向任意主机用户授予权限,MySQL 支持以 'user_name'@'host_name' 的形式指定 user 值。可以在主机名中指定通配符。例如,'user_name'@'%.example.com' 应用于 example.com 网站域名,'user_name'@'198.51.100.%' 应用于198.51.100 C 类子网中任何主机的用户名。简单形式的 'user_name' 是 'user_name'@'%' 的同义词。MySQL 不支持在用户名中使用通配符。要引用匿名用户,请使用 GRANT 语句指定用户名为空的账户:GRANT ALL ON test.* TO ''@'localhost' ...;
在这种情况下,任何从本地主机使用正确密码连接的的匿名用户,都可以使用与匿名用户帐户相关联的权限进行访问。如果允许本地匿名用户连接到 MySQL 服务器,还应该将权限授予所有本地用户,即 'user_name'@'localhost'。否则,指定用户试图从本地计算机登录到 MySQL 服务器时,会使用 mysql.user 系统表中的本地主机匿名用户帐户。要确定此问题是否适用,请执行以下查询,其中列出所有匿名用户:SELECT Host, User FROM mysql.user WHERE User='';
要避免上述问题,请使用以下语句删除本地匿名用户账户:DROP USER ''@'localhost';
https://dev.mysql.com/doc/refman/8.0/en/grant.html