MySQL 角色继承权限后 SHOW GRANTS 如何解读
给用户分配 MySQL 角色后,最容易误判的地方是:SHOW GRANTS 看见了角色名,就以为角色里的表权限已经全部生效。实际要分三层看:账号本身拿到什么、角色里定义了什么、当前会话激活了什么。账号直接获得的权限始终有效,角色则要经过默认角色或 SET ROLE 激活。
官方文档:https://dev.mysql.com/doc/refman/8.4/en/
SHOW GRANTS FOR 'u1'@'localhost'先看直接授权和角色分配,不自动展开角色权限。USING 'r1', 'r2'用于把指定角色的权限展开到用户视角,便于解释合并结果。- 要判断当前连接是否真的使用角色,还要查
CURRENT_ROLE()和INFORMATION_SCHEMA.ENABLED_ROLES。
先把 SHOW GRANTS 的两层输出分开看
假设管理员创建了两个角色:r1 负责查询,r2 负责写入,再把它们授予 u1@localhost。先执行下面的语句:
-- 只查看账号被授予了什么,不展开角色内部权限
SHOW GRANTS FOR 'u1'@'localhost';
-- 查看角色自身定义的权限
SHOW GRANTS FOR 'r1'@'%';
SHOW GRANTS FOR 'r2'@'%';
第一条结果里可能有 GRANT USAGE ON *.*,以及一行类似 GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost`。这表示角色关系存在,但不是把 SELECT、INSERT 等对象权限直接复制到用户上。要追溯权限来源,应继续查看角色本身,或者使用下一节的 USING。

用 USING 展开角色权限,而不是凭角色名猜结果
SHOW GRANTS 的 USING 子句适合做“权限解释”。它要求列出的角色已经授予该用户,然后将这些角色关联的权限合并到用户视角:
-- 只展开查询角色,观察单个来源
SHOW GRANTS FOR 'u1'@'localhost' USING 'r1'@'%';
-- 同时展开两个已授予角色,观察合并后的对象权限
SHOW GRANTS FOR 'u1'@'localhost' USING 'r1'@'%', 'r2'@'%';
如果 r1 有 SELECT,r2 有 INSERT、UPDATE,同时展开时就能看到合并后的授权表达式。这个结果回答的是“这些角色能提供哪些权限”,不等于“本连接此刻已经激活了这些角色”。此外,MySQL 8.4 的全局权限输出会显式列出已授予的全局权限,程序不要再假设一定会出现 ALL PRIVILEGES。
| 要确认的对象 | 适合使用的语句 | 结果应该怎么读 |
|---|---|---|
| 账号和角色关系 | SHOW GRANTS FOR 用户 | 看直接权限与角色授予行 |
| 某角色能提供什么 | SHOW GRANTS FOR 角色 或 USING | 看角色定义或合并后的用户视角 |
| 当前连接启用了什么 | CURRENT_ROLE()、ENABLED_ROLES | 看本会话的实际激活状态 |
默认角色不等于当前会话一定激活
生产排查时,常见症状是“角色已经授予,但查询仍报权限不足”。先检查默认角色和会话操作的差别:
-- 让用户登录后默认激活指定角色
SET DEFAULT ROLE 'r1'@'%', 'r2'@'%' TO 'u1'@'localhost';
-- 在当前会话重新套用账号默认角色
SET ROLE DEFAULT;
-- 也可以只在当前会话临时激活一个已授予角色
SET ROLE 'r1'@'%';
SET DEFAULT ROLE 修改的是账号的默认配置,SET ROLE DEFAULT 修改的是当前会话的激活状态。若实例启用了 activate_all_roles_on_login,登录时的行为还会不同。不要只凭管理员连接执行的 SHOW GRANTS 下结论,应用连接必须在自己的会话里复查。

最后用会话视图确认权限是否真正生效
在应用账号自己的连接中执行以下检查。CURRENT_ROLE() 适合快速查看当前角色组合,ENABLED_ROLES 则能看到角色是否为默认角色或强制角色:
-- 查看当前会话启用的角色组合
SELECT CURRENT_ROLE();
-- 查看角色名称、默认角色和 mandatory 标记
SELECT ROLE_NAME, ROLE_HOST, IS_DEFAULT, IS_MANDATORY
FROM INFORMATION_SCHEMA.ENABLED_ROLES;
如果 SHOW GRANTS ... USING 能看到 SELECT,但 ENABLED_ROLES 里没有对应角色,排查重点应放在角色激活,而不是继续重复授权。反过来,如果角色已启用但目标对象仍访问失败,再核对对象名、主机部分、数据库级与表级范围,以及是否存在部分撤销。
相关问题
为什么 SHOW GRANTS 只显示角色名?
因为默认语义是展示账号的直接授权和角色分配关系。要展开角色权限,应使用 USING 或单独查看角色的授权。
USING 可以随便写一个角色吗?
不可以。USING 中的每个角色都必须已经授予目标用户,否则这条检查语句不能按预期展开。
SHOW GRANTS 能证明角色已经生效吗?
不能单独证明。它能解释授权来源;当前会话是否启用角色,要结合 CURRENT_ROLE() 和 ENABLED_ROLES 判断。
Go crypto/tls Config.MinVersion 如何限制握手版本
- 上一篇
- Go crypto/tls Config.MinVersion 如何限制握手版本
- 下一篇
- Go pprof alloc_space 和 inuse_space 为什么结论相反
-
- 数据库 · MySQL | 2小时前 |
- MySQL 复制状态中 Retrieved_Gtid_Set 如何辅助定位缺口
- 221浏览 收藏
-
- 数据库 · MySQL | 3小时前 | MySQL · 性能分析 · Performance Schema · SQL耗时 · mysql Performance Schema events_statements 平均耗时
- MySQL Performance Schema events_statements 如何找平均耗时
- 125浏览 收藏
-
- 数据库 · MySQL | 6小时前 |
- MySQL LOAD DATA 导入 TSV 时如何处理字段内制表符
- 253浏览 收藏
-
- 数据库 · MySQL | 8小时前 |
- MySQL 窗口函数按时间去重时如何保留最新行
- 312浏览 收藏
-
- 数据库 · MySQL | 9小时前 |
- MySQL CTE 递归深度如何避免意外超限
- 191浏览 收藏
-
- 数据库 · MySQL | 10小时前 | MySQL · JSON · 数据校验 · mysql CHECK JSON Schema JSON_SCHEMA_VALID
- MySQL JSON_SCHEMA_VALID 如何在入库前拒绝结构错误
- 446浏览 收藏
-
- 数据库 · MySQL | 11小时前 |
- MySQL 多列索引遇到 IS NULL 时如何判断顺序
- 107浏览 收藏
-
- 数据库 · MySQL | 13小时前 |
- MySQL 8.4 EXPLAIN ANALYZE 的 actual rows 怎么和估算对比
- 181浏览 收藏
-
- 数据库 · MySQL | 14小时前 | MySQL · 性能优化 · 执行计划 · mysql optimizer statistics column selectivity
- MySQL 直方图之外如何判断列选择性是否真实下降
- 432浏览 收藏
-
- 数据库 · MySQL | 15小时前 |
- MySQL sys.schema_unused_indexes 的结果为什么不能直接删索引
- 327浏览 收藏
-
- 数据库 · MySQL | 16小时前 | MySQL · 慢查询 · 性能分析 · mysql 慢SQL performance_schema DIGEST
- MySQL performance_schema 语句 digest 如何定位慢 SQL 模式
- 284浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 35次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 135次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 72次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 28次使用
-
- CMMLU
- 深入了解CMMLU中文评估基准,涵盖67个学科主题,提供数据集下载、Zero-shot/Five-shot评估方法及排行榜,助力优化中文语言模型性能。
- 19次使用
-
- MySQL JSON_TABLE 展开数组时如何保留缺失字段
- 2026-09-10 501浏览
-
- MySQL 分区表怎么处理跨分区唯一键:分区列约束与建表取舍
- 2026-08-30 501浏览
-
- MySQL权限管理设置全攻略
- 2026-03-29 501浏览
-
- MySQL分片实现方法及常见方案解析
- 2025-06-24 501浏览
-
- MySQL表空间碎片怎么清理?超详细优化教程
- 2025-06-13 501浏览

