SHOW GRANTS 只显示显式授予的权限,不包含隐式继承、角色叠加或间接获得的权限;例如未授权用户返回空,root执行时不带FOR默认查当前会话认证用户权限。

SHOW GRANTS 能查到什么权限?
它只显示当前用户(或指定用户)被显式授予的权限,不包含隐式继承、角色叠加、或 MySQL 8.0+ 中通过角色间接获得的权限。比如你用 CREATE USER 'u'@'%' IDENTIFIED BY 'p' 创建用户但没授任何权,SHOW GRANTS FOR 'u'@'%' 就返回空;而 root 用户执行 SHOW GRANTS(不带 FOR)默认查的是自己当前会话的认证用户权限,不是 'root'@'localhost' 的定义权限。
为什么 SHOW GRANTS 不显示数据库/表级权限?
它其实会显示,但前提是这些权限确实存在且是直接授予的。常见误判原因有:
- 权限是通过
GRANT ... ON *.*授予的全局权限,SHOW GRANTS会显示,但不会展开成每个库的单独条目 - 权限是授予
db_name.*或db_name.table_name的,只要执行过对应GRANT命令,就一定出现在结果里——如果没看到,说明根本没授过 - MySQL 8.0+ 启用了 roles,权限可能来自激活的角色,此时
SHOW GRANTS默认不显示角色权限,得加USING role_name
如何查当前连接用户的实际生效权限?
SHOW GRANTS 看的是“授权记录”,不是“运行时权限”。真正决定你能做什么的,是 SELECT CURRENT_USER(), USER() + 权限合并逻辑。更靠谱的做法是:
- 确认当前会话身份:
SELECT USER(), CURRENT_USER()—— 前者是客户端声明的用户,后者才是 MySQL 实际匹配到的账号 - 查权限合并结果:
SELECT * FROM information_schema.role_table_grants(仅 8.0+,需有访问权限) - 模拟检查:用
SHOW CREATE USER 'u'@'h'看密码、SSL、资源限制等元信息,再配合SHOW GRANTS FOR 'u'@'h' - 别依赖 GUI 工具的“权限面板”,它们常缓存旧数据或解析错误
容易被忽略的权限细节
权限字符串里藏着关键限制,比如 GRANT SELECT ON `mydb`.* TO 'u'@'%' WITH GRANT OPTION 和 GRANT SELECT ON `mydb`.* TO 'u'@'%' REQUIRE SSL 看似一样,但后者要求连接必须加密,否则即使账号密码对也连不上。还有几个坑:
-
USAGE权限表示“仅能登录”,SHOW GRANTS会显示它,但它不赋予任何操作能力 - 权限作用域大小写敏感:
GRANT SELECT ON `MyDB`.*和GRANT SELECT ON `mydb`.*是两条独立权限(取决于系统变量lower_case_table_names) - 通配符
%在 host 部分不匹配 localhost,'u'@'%'和'u'@'localhost'是两个完全不同的账号
查权限不是看一眼就完事的事,得先搞清你是谁、连的是谁、用什么方式连的,再对照 grant 记录一条条核对。尤其在跳板机、代理、容器网络环境下,CURRENT_USER() 经常和你以为的不一样。


















