当前位置:首页 > 文章列表 > 数据库 > MySQL > MySQL 角色继承权限后 SHOW GRANTS 如何解读

MySQL 角色继承权限后 SHOW GRANTS 如何解读

来源:17golang原创 2026-09-15 13:54:23 0浏览 收藏

给用户分配 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`。这表示角色关系存在,但不是把 SELECTINSERT 等对象权限直接复制到用户上。要追溯权限来源,应继续查看角色本身,或者使用下一节的 USING

MySQL SHOW GRANTS 将用户、角色分配和角色内部对象权限分层展示的关系说明图
图1:结构说明图,区分账号直接授权、角色分配和角色内部权限;这是静态说明图,不是截图或运行证据。

用 USING 展开角色权限,而不是凭角色名猜结果

SHOW GRANTSUSING 子句适合做“权限解释”。它要求列出的角色已经授予该用户,然后将这些角色关联的权限合并到用户视角:

-- 只展开查询角色,观察单个来源
SHOW GRANTS FOR 'u1'@'localhost' USING 'r1'@'%';

-- 同时展开两个已授予角色,观察合并后的对象权限
SHOW GRANTS FOR 'u1'@'localhost' USING 'r1'@'%', 'r2'@'%';

如果 r1SELECTr2INSERTUPDATE,同时展开时就能看到合并后的授权表达式。这个结果回答的是“这些角色能提供哪些权限”,不等于“本连接此刻已经激活了这些角色”。此外,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 下结论,应用连接必须在自己的会话里复查。

MySQL 登录后从默认角色和 SET ROLE 到 ENABLED_ROLES 的会话激活验证流程说明图
图2:操作示意图,展示默认角色、SET ROLE 与当前会话激活角色之间的关系;这是静态说明图,不是截图或运行证据。

最后用会话视图确认权限是否真正生效

在应用账号自己的连接中执行以下检查。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 判断。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go crypto/tls Config.MinVersion 如何限制握手版本Go crypto/tls Config.MinVersion 如何限制握手版本
上一篇
Go crypto/tls Config.MinVersion 如何限制握手版本
Go pprof alloc_space 和 inuse_space 为什么结论相反
下一篇
Go pprof alloc_space 和 inuse_space 为什么结论相反
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    35次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    135次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    72次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    28次使用
  • CMMLU中文大模型评估基准:功能、使用教程与应用场景解析
    CMMLU
    深入了解CMMLU中文评估基准,涵盖67个学科主题,提供数据集下载、Zero-shot/Five-shot评估方法及排行榜,助力优化中文语言模型性能。
    19次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码