MySQL用户授权GRANT命令详解与权限设置
时间:2026-08-17 | 作者:极客少年 | 阅读:0所谓授权,说白了,就是把某些操作权限交给指定用户。比如,新建一个用户后,可以给它授予查询所有数据库和表的权限。
在 MySQL 里,这件事通常通过 GRANT 语句完成。
不过,GRANT 语句也不是谁都能执行。只有本身拥有 GRANT 权限的用户,才可以使用 GRANT。它的语法格式如下:
GRANT priv_type [(column_list)] ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password'] [, user[IDENTIFIED BY [PASSWORD] 'password']] ... [WITH with_option [with_option]...]
GRANT 语句参数说明
- priv_type 参数表示权限类型;
- columns_list 参数表示权限作用于哪些列上,省略该参数时,表示作用于整个表;
- database.table 用于指定权限的级别;
- user 参数表示用户账户,由用户名和主机名构成,格式是“'username'@'hostname'”;
- IDENTIFIED BY 参数用来为用户设置密码;
- password 参数是用户的新密码。
WITH 子句可用选项
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 个连接。
MySQL 中可以授予的权限
MySQL 中可以授予的权限,大致分为下面几组:
- 列权限,和表中的某一个具体列相关。比如,允许使用 UPDATE 语句更新表 students 中 name 列的值。
- 表权限,和某一张具体表中的全部数据相关。比如,允许使用 SELECT 语句查询表 students 的所有数据。
- 数据库权限,和某个具体数据库中的所有表相关。比如,允许在已有数据库 mytest 中创建新表。
- 用户权限,和 MySQL 中全部数据库相关。比如,允许删除已有数据库,或者新建一个数据库。
GRANT 语句中可用于指定权限级别的值
在 GRANT 语句中,可用于指定权限级别的值,通常有下面这几种格式:
- *:表示当前数据库中的所有表。
- *.*:表示所有数据库中的所有表。
- db_name.*:表示某个数据库中的所有表,db_name 指定数据库名。
- db_name.tbl_name:表示某个数据库中的某个表或视图,db_name 指定数据库名,tbl_name 指定表名或视图名。
- db_name.routine_name:表示某个数据库中的某个存储过程或函数,routine_name 指定存储过程名或函数名。
- TO 子句:如果权限授予给的是一个不存在的用户,MySQL 会自动执行一条 CREATE USER 语句创建该用户,但同时必须为这个用户设置密码。
权限类型说明
下面具体来看 GRANT 语句里的权限类型(可参考《MySQL user表详解》一节阅读)。
1)授予数据库权限时,<权限类型>可以指定为以下值:
| 权限名称 | 对应user表中的字段 | 说明 |
|---|---|---|
| SELECT | Select_priv | 表示授予用户可以使用 SELECT 语句访问特定数据库中所有表和视图的权限。 |
| INSERT | Insert_priv | 表示授予用户可以使用 INSERT 语句向特定数据库中所有表添加数据行的权限。 |
| DELETE | Delete_priv | 表示授予用户可以使用 DELETE 语句删除特定数据库中所有表的数据行的权限。 |
| UPDATE | Update_priv | 表示授予用户可以使用 UPDATE 语句更新特定数据库中所有数据表的值的权限。 |
| REFERENCES | References_priv | 表示授予用户可以创建指向特定的数据库中的表外键的权限。 |
| CREATE | Create_priv | 表示授权用户可以使用 CREATE TABLE 语句在特定数据库中创建新表的权限。 |
| ALTER | Alter_priv | 表示授予用户可以使用 ALTER TABLE 语句修改特定数据库中所有数据表的权限。 |
| SHOW VIEW | Show_view_priv | 表示授予用户可以查看特定数据库中已有视图的视图定义的权限。 |
| CREATE ROUTINE | Create_routine_priv | 表示授予用户可以为特定的数据库创建存储过程和存储函数的权限。 |
| ALTER ROUTINE | Alter_routine_priv | 表示授予用户可以更新和删除数据库中已有的存储过程和存储函数的权限。 |
| INDEX | Index_priv | 表示授予用户可以在特定数据库中的所有数据表上定义和删除索引的权限。 |
| DROP | Drop_priv | 表示授予用户可以删除特定数据库中所有表和视图的权限。 |
| CREATE TEMPORARY TABLES | Create_tmp_table_priv | 表示授予用户可以在特定数据库中创建临时表的权限。 |
| CREATE VIEW | Create_view_priv | 表示授予用户可以在特定数据库中创建新的视图的权限。 |
| EXECUTE ROUTINE | Execute_priv | 表示授予用户可以调用特定数据库的存储过程和存储函数的权限。 |
| LOCK TABLES | Lock_tables_priv | 表示授予用户可以锁定特定数据库的已有数据表的权限。 |
| ALL 或 ALL PRIVILEGES 或 SUPER | Super_priv | 表示以上所有权限/超级权限 |
2) 授予表权限时,<权限类型>可以指定为以下值:
| 权限名称 | 对应user表中的字段 | 说明 |
|---|---|---|
| SELECT | Select_priv | 授予用户可以使用 SELECT 语句进行访问特定表的权限 |
| INSERT | Insert_priv | 授予用户可以使用 INSERT 语句向一个特定表中添加数据行的权限 |
| DELETE | Delete_priv | 授予用户可以使用 DELETE 语句从一个特定表中删除数据行的权限 |
| DROP | Drop_priv | 授予用户可以删除数据表的权限 |
| UPDATE | Update_priv | 授予用户可以使用 UPDATE 语句更新特定数据表的权限 |
| ALTER | Alter_priv | 授予用户可以使用 ALTER TABLE 语句修改数据表的权限 |
| REFERENCES | References_priv | 授予用户可以创建一个外键来参照特定数据表的权限 |
| CREATE | Create_priv | 授予用户可以使用特定的名字创建一个数据表的权限 |
| INDEX | Index_priv | 授予用户可以在表上定义索引的权限 |
| ALL 或 ALL PRIVILEGES 或 SUPER | Super_priv | 所有的权限名 |
3) 授予列权限时,<权限类型>的值只能指定为 SELECT、INSERT 和 UPDATE,同时权限的后面需要加上列名列表 column-list。
4) 最有效率的权限是用户权限。
授予用户权限时,<权限类型>除了可以指定为授予数据库权限时的所有值之外,还可以是下面这些值:
- CREATE USER:表示授予用户可以创建和删除新用户的权限。
- SHOW DATABASES:表示授予用户可以使用 SHOW DATABASES 语句查看所有已有的数据库的定义的权限。
例 1
使用 GRANT 语句创建一个新的用户 testUser,密码为 testPwd。
用户 testUser 对所有的数据有查询、插入权限,并授予 GRANT 权限。SQL 语句和执行过程如下。
mysql> GRANT SELECT,INSERT ON *.*
-> TO 'testUser'@'localhost'
-> IDENTIFIED BY 'testPwd'
-> WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.05 sec)
使用 SHOW GRANTS 语句查询用户 testUser 的权限,如下所示。
mysql> SHOW GRANTS FOR 'testUser'@'localhost'; +-------------------------------------------------------------------------+ | Grants for testUser@localhost | +-------------------------------------------------------------------------+ | GRANT SELECT, INSERT ON *.* TO 'testUser'@'localhost' WITH GRANT OPTION | +-------------------------------------------------------------------------+ 1 row in set (0.00 sec)
从结果可以看出,testUser 对所有数据库中的所有表都拥有查询、插入权限,同时还可以把这些权限继续授予其他用户。
拓展
数据库管理员给普通用户授权时一定要格外谨慎。原因很简单,权限一旦给大了,数据库很可能遭受致命破坏。
一旦发现用户权限过多,就应该尽快使用 REVOKE 语句把权限收回。尤其需要注意的是,最好不要把 SUPER 权限和 GRANT 权限授予普通用户。
关于用户权限的删除,可阅读学习《MySQL REVOKE:删除用户权限》一节。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 迅捷路由器怎么调信号最强,设置时要注意什么?
- 时间:2026-08-27
-
- vivo浏览器怎么卸不掉?原因和解决方法在这里
- 时间:2026-08-27
-
- OPPO R11s黑屏了,怎么强制恢复出厂设置?
- 时间:2026-08-27
-
- 飞利浦显示器包装盒有生产日期和保修期吗?怎么看?
- 时间:2026-08-27
-
- 联想新平板开机必须联网吗?怎么做?
- 时间:2026-08-27
-
- 平板横竖屏切换设置与问题解决
- 时间:2026-08-27
-
- 移动电源容量怎么测?要准备哪些工具?
- 时间:2026-08-27
-
- 荣耀90 Pro防水吗?防水级别多少?怎么用才安全
- 时间:2026-08-27
精选合集
更多大家都在玩
大家都在看
更多-
- 以下哪种食材被称为“地下苹果” 蚂蚁庄园今日答案9.18
- 时间:2026-09-17
-
- 蚂蚁庄园今天答题答案2026年9月18日
- 时间:2026-09-17
-
- 蚂蚁庄园答题今日答案2026年9月18日
- 时间:2026-09-17
-
- 蚂蚁庄园小课堂2026年9月18日最新题目答案
- 时间:2026-09-17
-
- 小鸡答题今天的答案是什么2026年9月18日
- 时间:2026-09-17
-
- 蚂蚁庄园每日答题答案2026年9月18日
- 时间:2026-09-17
-
- 蔬菜洗完掉色,说明是被染色了,是真的吗 蚂蚁庄园今日答案9月18日
- 时间:2026-09-17
-
- 满襟蜡绘花纹巧染就花纹当绣裳说的是哪种传统技艺 蚂蚁新村今日答案2026.9.17
- 时间:2026-09-17
