MySQL GRANT授权命令的用法(附带实例)
授权就是为某个用户授予权限。合理的授权可以保证 MySQL 数据库的安全。
MySQL 数据库使用 GRANT 语句为用户授予权限。授予的权限可以分为多个层级,包括:
在 MySQL 中,必须是拥有 GRANT 权限的用户才能执行 GRANT 语句。
要使用 GRANT 或 REVOKE,必须拥有 GRANT OPTION 权限,并且必须用于正在授予或撤销的权限。GRANT 的语法如下:
priv_type 参数表示权限类型;
WITH 关键字后可以跟一个或多个 with_option 参数。这个参数有 5 个选项,意义如下:
【实例】创建一个新用户 grantUser。使用 GRANT 语句对用户 grantUser 赋予所有数据的查询、插入权限,并授于 GRANT 权限。GRANT 语句及其执行结果如下:
使用 SELECT 语句查询用户 grantUser 的权限:
被授予 GRANT 权限的用户可以登录 MySQL 并创建其他用户账户,比如这里名称是 grantUser 的用户。
MySQL 数据库使用 GRANT 语句为用户授予权限。授予的权限可以分为多个层级,包括:
权限层级 | 权限范围 | 存储位置 | 授予/撤销权限语句 |
---|---|---|---|
全局级 | 适用于一个定服务器中的所有数据库 | mysql.user 表 |
GRANT ALL ON *.* REVOKE ALL ON *.* |
数据库级 | 适用于一个给定数据库中的所有表 | mysql.db 和 mysql.host 表 |
GRANT ALL ON db_name.* REVOKE ALL ON db_name.* |
表层级 | 适用于一个给定表中的所有列 | mysql.tables_priv 表 |
GRANT ALL ON db_name.tbl_name REVOKE ALL ON db_name.tbl_name |
列层级 | 适用于一个给定表中的单一列 | mysql.columns_priv 表 | 使用 REVOKE 语句时,必须指定与被授权列相同的列 |
子程序级 | CREATE ROUTINE、ALTER ROUTINE、EXECUTE 权限适用于已存储的子程序 | mysql.procs_priv 表 | 这些权限可以被授予为全局层级和数据库层级,除了 CREATE ROUTINE 外,这些权限可以被授予子程序层级 |
在 MySQL 中,必须是拥有 GRANT 权限的用户才能执行 GRANT 语句。
要使用 GRANT 或 REVOKE,必须拥有 GRANT OPTION 权限,并且必须用于正在授予或撤销的权限。GRANT 的语法如下:
GRANT priv_type [(columns)] [, priv_type [(columns)]] ... ON [object_type] table1, table2,…, tablen TO user [WITH GRANT OPTION] object_type = TABLE | FUNCTION | PROCEDURE
priv_type 参数表示权限类型;
- columns 参数表示权限作用于哪些列上,不指定该参数,表示作用于整个表;
- table1,table2,…,tablen 表示授予权限的列所在的表。
- object_type 指定授权作用的对象类型,包括 TABLE(表)、FUNCTION(函数)和 PROCEDURE(存储过程);
- 当从旧版本的 MySQL 升级时,要使用 object_tpye 子句,必须升级授权表。user 参数表示用户账户,由用户名和主机名构成,形式是“'username'@'hostname'”。
WITH 关键字后可以跟一个或多个 with_option 参数。这个参数有 5 个选项,意义如下:
- GRANT OPTION:被授权的用户可以将这些权限赋予别的用户。
- MAX_QUERIES_PER_HOUR count:设置每小时可以执行 count 次查询。
- MAX_UPDATES_PER_HOUR count:设置每小时可以执行 count 次更新。
- MAX_CONNECTIONS_PER_HOUR count:设置每小时可以建立 count 个连接。
- MAX_USER_CONNECTIONS count:设置单个用户可以同时建立 count 个连接。
【实例】创建一个新用户 grantUser。使用 GRANT 语句对用户 grantUser 赋予所有数据的查询、插入权限,并授于 GRANT 权限。GRANT 语句及其执行结果如下:
MySQL> CREATE USER 'grantUser'@'localhost' IDENTIFIED BY 'mypass'; MySQL> GRANT SELECT,INSERT ON *.* TO 'grantUser'@'localhost' WITH GRANT OPTION; Query OK, 0 rows affected (0.03 sec)结果显示执行成功。
使用 SELECT 语句查询用户 grantUser 的权限:
MySQL> SELECT Host,User,Select_priv,Insert_priv, Grant_priv FROM mysql.user where user='grantUser'; +-----------+------------+-------------+--------------+-------------+ | Host | User | Select_priv | Insert_priv | Grant_priv | +-----------+------------+-------------+--------------+-------------+ | localhost | grantUser | Y | Y | Y | +-----------+------------+-------------+--------------+-------------+ 1 row in set (0.00 sec)查询结果显示用户 grantUser 被创建成功,并被赋予 SELECT、INSERT 和 GRANT 权限,其相应字段值均为“Y”。
被授予 GRANT 权限的用户可以登录 MySQL 并创建其他用户账户,比如这里名称是 grantUser 的用户。