MySQL 提供了两种主要方法来查看用户权限,适用于不同场景。
方法一:使用 `SHOW GRANTS` 语句(推荐首选)
这是最常用、最直观的方法,直接显示授予用户的权限语句。
语法:
SHOW GRANTS [FOR 'username'@'hostname'];
使用场景:
1. 查看当前用户权限:不指定 `FOR` 子句
SHOW GRANTS;
2. 查看特定用户权限:必须提供完整的用户名和主机名
SHOW GRANTS FOR 'testuser1'@'localhost'; SHOW GRANTS FOR 'root'@'localhost';
权限要求:
查看自己的权限:任何用户都可以
查看其他用户的权限:需要 `SELECT` 权限 on `mysql` 数据库或 `CREATE USER` 权限
示例解析:
1. 新用户权限:
GRANT USAGE ON *.* TO 'testuser1'@'localhost'
`USAGE`:表示"无权限",只能登录服务器
`ON *.*`:权限作用范围是所有数据库的所有表
2. root用户权限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION
`ALL PRIVILEGES`:拥有所有权限
`WITH GRANT OPTION`:可以将权限授予其他用户
优点:
输出直观,直接显示 GRANT 语句
自动包含所有层级的权限(全局、数据库、表等)
在 MySQL 8.0+ 中会自动显示通过角色授予的权限
方法二:查询 `mysql.user` 系统表
这种方法直接查询系统权限表,获得原始的权限数据。
语法:
SELECT * FROM mysql.user WHERE User='username' AND Host='hostname';
更友好的查看方式(使用 `\G`):
SELECT * FROM mysql.user WHERE User='testuser1' AND Host='localhost'\G
权限要求:
需要对 `mysql.user` 表有 `SELECT` 权限
注意:新用户默认无此权限,无法执行此查询
输出特点:
返回大量字段,每个权限对应一个字段
权限字段值为 `'Y'`(有权限)或 `'N'`(无权限)
只显示全局权限(`ON *.*`)
常用字段示例:
SELECT
User | 用户名 |
Host | 允许连接的主机 |
Select_priv | 查询权限 |
Insert_priv | 插入权限 |
Update_priv | 更新权限 |
Delete_priv | 删除权限 |
Create_priv | 创建数据库/表权限 |
Drop_priv | 删除数据库/表权限 |
Grant_priv | 授予权限的权限 |
FROM mysql.user
WHERE User='username';
权限层级说明
MySQL 权限分为多个层级,存储在不同的系统表中:
1. 全局权限 (`mysql.user`):作用于所有数据库
2. 数据库权限 (`mysql.db`):作用于特定数据库
3. 表权限 (`mysql.tables_priv`):作用于特定表
4. 列权限 (`mysql.columns_priv`):作用于特定列
`SHOW GRANTS` 会汇总所有层级的权限,而直接查询系统表需要分别查询不同的表。
实用技巧
1. 查看当前用户:
SELECT CURRENT_USER();
2. 查看所有用户:
SELECT User, Host FROM mysql.user;
3. 如果遇到权限错误,可以使用有权限的用户(如 root)来查看其他用户的权限。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程