SHOW GRANTS 不加参数即显示当前会话实际生效的显式权限,基于 CURRENT_USER() 而非 USER();查他人权限须指定 'user'@'host' 全称,且需 SUPER 或 mysql.user 表 SELECT 权限;MySQL 8.0+ 中角色权限不自动展开,需用 USING 显式指定;mysql.user 表仅存全局权限,不可代表全部权限;真正可靠的是 SHOW GRANTS 输出的可复用 SQL 语句。

SHOW GRANTS 不加参数就能看当前用户权限
只要成功连接 MySQL(比如 mysql -u appuser -p),直接执行 SHOW GRANTS; 就能立刻看到当前会话实际生效的全部显式权限。它默认查的是 CURRENT_USER(),不是你登录时声明的 USER() —— 这两者可能不同,比如用代理用户或通配符 host 登录时。
常见误判:只看到 GRANT USAGE ON *.* TO 'xxx'@'%',就以为“连不上库”,其实这只是占位符,表示该账号能连接但没被授过任何操作权限;真要确认,得配合 SELECT CURRENT_USER(), USER(); 看匹配了哪个账号定义。
查别人权限必须写全 'user'@'host'
执行 SHOW GRANTS FOR 'api_user'; 会报错 ERROR 1141 (42000): There is no such grant defined for user 'api_user' on host '%',因为 MySQL 认证靠的是完整用户名+主机对,'api_user'@'localhost' 和 'api_user'@'%' 是两个完全独立的账号。
- 不确定 host 是什么?先跑:
SELECT User, Host FROM mysql.user WHERE User = 'api_user'; - 查他人权限需要你有
SUPER权限,或至少对mysql.user表有SELECT权限 - MySQL 8.0+ 默认 host 缺失时按
'%'处理,但显式写出来更安全,避免歧义
MySQL 8.0+ 启用角色后,SHOW GRANTS 不自动展开角色权限
如果你用 SET DEFAULT ROLE 或登录时激活了角色,SHOW GRANTS 默认只显示用户直授权限,不会合并角色里的权限。想看到“最终生效权限”,得手动组合:
-
SHOW GRANTS FOR 'dev'@'10.%';→ 查用户直授权限 -
SHOW GRANTS FOR 'dev'@'10.%' USING 'app_developer';→ 查该用户在指定角色下的权限 - 或者查绑定关系:
SELECT * FROM role_edges WHERE FROM_HOST = 'app_developer' AND TO_USER = 'dev' AND TO_HOST = '10.%';
注意:USING 后的角色名必须存在且已绑定,否则报错;角色权限不会出现在 mysql.user 表里,也不能通过 SELECT * FROM mysql.user 查到。
别信 mysql.user 表能代表全部权限
mysql.user 只存全局权限(如 Select_priv、Drop_priv),不包含库级(mysql.db)、表级(mysql.tables_priv)、列级权限,更不反映角色继承或动态权限(如 BACKUP_ADMIN)。MySQL 8.0+ 中多数字段已弃用,字段值是 Y/N 字符串,还得人工映射到具体操作。
真正可靠的权限快照只有 SHOW GRANTS 输出的 SQL 语句——它可复用、所见即所得。如果输出里出现 WITH GRANT OPTION,说明该用户还能转授权限,这是高危信号,生产环境应重点排查。
权限不是静态的,它可能随角色激活、REVOKE 操作、甚至代理用户机制实时变化。查完 SHOW GRANTS,最好用一条受控语句(比如 SELECT 1 FROM information_schema.TABLES LIMIT 1;)实测是否真能执行。


















