`GRANT` 语句用于为用户授予特定权限,是 MySQL 权限管理的核心命令。
基本语法
GRANT priv_type [(column_list)] ON [object_type] privilege_level TO user [IDENTIFIED BY 'password'] [, user [IDENTIFIED BY 'password']] ... [WITH with_option ...]
核心参数详解
1. 权限级别 (Privilege Levels)
格式 说明 示例
`*.*` 所有数据库的所有表 `GRANT SELECT ON *.* TO 'user'@'%'`
`database.*` 指定数据库的所有表 `GRANT ALL ON mydb.* TO 'user'@'localhost'`
`database.table` 指定数据库的指定表 `GRANT INSERT ON mydb.users TO 'user'@'%'`
`*` 当前数据库的所有表 `USE mydb; GRANT SELECT ON * TO 'user'@'%'`
2. 常用权限类型
权限 | 说明 | 级别 |
---|---|---|
SELECT | 查询数据 | 全局、数据库、表、列 |
INSERT | 插入数据 | 全局、数据库、表、列 |
UPDATE | 更新数据 | 全局、数据库、表、列 |
DELETE | 删除数据 | 全局、数据库、表 |
CREATE | 创建数据库/表 | 全局、数据库 |
DROP | 删除数据库/表 | 全局、数据库 |
ALTER | 修改表结构 | 全局、数据库、表 |
ALL PRIVILEGES | 所有权限(除GRANT外) | 所有级别 |
GRANT OPTION | 授予权限的权限 | 所有级别 |
3. WITH 选项
选项 | 说明 |
---|---|
GRANT OPTION | 允许用户将自己权限授予他人 |
MAX_QUERIES_PER_HOUR count | 每小时最大查询次数 |
MAX_UPDATES_PER_HOUR count | 每小时最大更新次数 |
MAX_CONNECTIONS_PER_HOUR count | 每小时最大连接数 |
MAX_USER_CONNECTIONS count | 用户最大同时连接数 |
实用示例
示例 1:创建用户并授予基本权限
创建用户并授予所有数据库的查询、插入权限
GRANT SELECT, INSERT ON *.* TO 'testUser'@'localhost' IDENTIFIED BY 'testPwd' WITH GRANT OPTION;
示例 2:授予特定数据库权限
授予用户对mydb数据库的所有权限
GRANT ALL PRIVILEGES ON mydb.* TO 'app_user'@'%' IDENTIFIED BY 'secure_password';
示例 3:授予特定表权限
只允许用户访问特定的表
GRANT SELECT, INSERT, UPDATE ON mydb.users TO 'report_user'@'192.168.1.%';
示例 4:授予列级权限
只允许更新特定列
GRANT UPDATE (name, email) ON mydb.users TO 'support_user'@'localhost';
示例 5:带限制的权限
限制用户每小时最多1000次查询
GRANT SELECT ON mydb.* TO 'readonly_user'@'%' WITH MAX_QUERIES_PER_HOUR 1000;
权限验证
使用 `SHOW GRANTS` 查看授予的权限:
查看当前用户权限
SHOW GRANTS;
查看特定用户权限
SHOW GRANTS FOR 'testUser'@'localhost';
最佳实践和安全建议
1. 最小权限原则:只授予用户完成工作所必需的最小权限
2. 避免使用超级权限:不要轻易授予 `ALL PRIVILEGES` 或 `SUPER` 权限
3. 限制主机访问:使用具体的主机名或IP段,避免使用 `'%'`
4. 定期审计权限:使用 `SHOW GRANTS` 定期检查用户权限
5. 使用强密码:总是为用户设置强密码
6. 及时回收权限:使用 `REVOKE` 语句移除不再需要的权限
回收权限示例
REVOKE INSERT ON *.* FROM 'testUser'@'localhost';
注意事项
1. 自动创建用户:如果用户不存在,`GRANT` 语句会自动创建用户(MySQL 5.7+ 此行为取决于配置)
2. 权限生效:权限更改立即生效,无需重启服务
3. 权限层级:权限具有层级关系,高级别权限会覆盖低级别权限
4. 密码安全:使用 `IDENTIFIED BY` 时会以明文传输密码,建议使用加密连接
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程