SHOW GRANTS 是查看当前用户权限最简单可靠的方式,输出可复用的授权语句;它默认基于 CURRENT_USER(),需配合 SELECT CURRENT_USER(), USER() 区分认证账号与连接声明;查他人权限须指定 'user'@'host' 并具备 SUPER 或 mysql.user 表 SELECT 权限;权限分全局、库、表、列四级存储于对应系统表,低层权限补足高层未授予部分但不覆盖显式拒绝。

直接执行 SHOW GRANTS 就能看到当前权限
这是最简单也最可靠的方式——只要你能成功登录 MySQL,哪怕没有 SELECT 权限查系统表,也能立刻看到自己实际拥有的全部权限语句。
它输出的是可直接复用的授权语句,比如:GRANT SELECT, INSERT ON `appdb`.* TO 'webuser'@'%'
说明你对 appdb 库有读写权;如果只看到 GRANT USAGE ON *.* TO 'guest'@'localhost',那基本等于“没权限”。
-
SHOW GRANTS;默认查的是CURRENT_USER()(即权限系统认定的那个账号),不是你登录时填的USER() - 想确认到底匹配了哪个账号?先运行
SELECT CURRENT_USER(), USER();—— 前者是生效账号(如'admin'@'%'),后者是你声明的连接信息(如'admin'@'192.168.5.22') - MySQL 8.0+ 启用角色后,
SHOW GRANTS不显示角色继承来的权限,得额外查mysql.role_edges表
查别人权限必须写全 'username'@'host',缺一不可
很多人卡在这步:执行 SHOW GRANTS FOR 'api_user'; 报错 ERROR 1141 (42000): There is no such grant defined for user 'api_user' on host '%'。原因就是没带 @'host'。
- MySQL 认证靠的是
user@host这一对组合,单独用户名不唯一——同一个api_user可能在'%'、'10.0.0.%'、'localhost'上有完全不同的权限 - 不确定 host 是什么?先查:
SELECT User, Host FROM mysql.user WHERE User = 'api_user'; - 执行
SHOW GRANTS FOR查他人权限,需要你有SUPER权限,或至少有SELECT权限访问mysql.user表,否则会被拒绝
权限到底存在哪?别只信 SHOW GRANTS 的输出
当你要批量判断某类权限是否启用(比如确认所有用户都禁用了 DROP),光看 SHOW GRANTS 输出再解析字符串,既慢又容易漏——底层权限字段更直接。
- 全局权限存在
mysql.user表里,看Select_priv、Drop_priv、Create_priv这些布尔字段 - 数据库级权限在
mysql.db,表级在mysql.tables_priv,列级在mysql.columns_priv - 注意:
mysql.user里查不到的权限(比如只给了某个库的SELECT),不代表没权限,只是不在全局表里
权限层级影响范围,不理解就容易误判“为什么没权限”
MySQL 权限是分层叠加的:全局 > 数据库 > 表 > 列。低层级权限不会覆盖高层级的拒绝(DENY),但会补足高层级未授予的部分。
- 比如你在全局给了
SELECT,又在testdb库显式REVOKE SELECT,那对该库就真没SELECT权了 - 但反过来:全局没给
CREATE,只在myapp库给了CREATE,那你只能在myapp里建表 - 执行
SHOW GRANTS会把各层权限合并列出,但不会告诉你哪条来自哪一层——要精确定位,还得结合mysql.db等表查
角色权限、host 匹配细节、权限表字段含义——这些点不翻源码也很难一次理清,但日常运维中只要记住:权限永远以 CURRENT_USER() 为准,SHOW GRANTS 是起点,不是终点。










