如何在MySQL 8.0中使用SHOW GRANTS FOR查看指定角色详情

夜涛吖_3108

夜涛吖_3108

2026-10-03

371人浏览

原创

show grants for角色必须带主机名,如'app_reader'@'%';返回仅直接授予的权限,不含间接继承权限;查角色持有者需反查用户或查询mysql.role_edges表。

如何在mysql 8.0中使用show grants for查看指定角色详情

SHOW GRANTS FOR role_name@'host' 语法必须带主机名

MySQL 8.0 的角色(role)是数据库级对象,但 SHOW GRANTS FOR 命令仍按「用户账户」语法解析——它不识别纯角色名。直接写 SHOW GRANTS FOR 'app_reader' 会报错 ERROR 1141 (42000): There is no such grant defined for user 'app_reader' on host '%',因为 MySQL 默认补全为 'app_reader'@'%',而角色没有 host 段。

正确做法是显式指定主机名为 '%'(角色创建时默认绑定该 host),即使你没在 CREATE ROLE 里写:

SHOW GRANTS FOR 'app_reader'@'%';

如果角色是用带 host 的方式创建的(比如 CREATE ROLE 'admin'@'localhost'),那这里也得严格匹配:SHOW GRANTS FOR 'admin'@'localhost'。

角色本身不存权限,只存「被授予的权限集合」

SHOW GRANTS FOR 返回的是该角色当前被显式授予的权限(即通过 GRANT ... TO role_name 添加的),不包括角色间接继承的权限(比如角色 A 被授给用户 B,B 再被授给角色 C —— 这种链式授权不会出现在 C 的 SHOW GRANTS 结果里)。

这意味着你看到的只是「角色直接拥有的权限」,不是它最终能行使的所有权限。要查角色实际生效权限,得结合 ROLE_TABLES 和 APPLICABLE_ROLES 视图,或模拟激活后查 INFORMATION_SCHEMA.ROLE_TABLE_GRANTS。

常见误判点:

  • 看到 GRANT SELECT ON `sales`.* TO 'reporter'@'%',就认为 reporter 能查所有 sales 库表 —— 实际上若该角色还被 GRANT 了其他角色(如 WITH ADMIN OPTION 授权链),这些不会列在这里
  • 执行 SHOW GRANTS FOR 'reporter'@'%' 返回空,不代表角色没权限 —— 可能只是它没被直接授过权限,而是通过其他角色间接获得

查看角色包含哪些用户/角色,要用 SHOW GRANTS FOR user_name

想确认某个角色被哪些用户或角色持有,不能对角色本身运行 SHOW GRANTS,而要反过来查用户:运行 SHOW GRANTS FOR 'alice'@'%' ,结果里会出现类似 GRANT 'app_reader'@'%' TO 'alice'@'%' 的行 —— 这表示 alice 持有 app_reader 角色。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

MySQL 不提供「列出所有持有某角色的主体」的原生命令。替代方案是查系统表:

SELECT * FROM mysql.role_edges WHERE TO_HOST = '%' AND TO_USER = 'app_reader';

注意:该表字段名是 FROM_HOST/FROM_USER(被授权者)和 TO_HOST/TO_USER(角色名),顺序容易看反。

SHOW GRANTS 输出里的 WITH ADMIN OPTION 很关键

如果某行输出含 WITH ADMIN OPTION,说明该角色不仅能使用所授权限,还能把**相同角色**再授给其他用户或角色(注意:不是授出底层权限,而是授出这个角色本身)。

例如:

GRANT 'backup_admin'@'%' TO 'dbmgr'@'%' WITH ADMIN OPTION;

这时 dbmgr 就能执行 GRANT 'backup_admin'@'%' TO 'junior'@'%'。但若漏掉 WITH ADMIN OPTION,后续授权会报错 ERROR 3530 (HY000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation。

这个选项不会自动继承,每次 GRANT ... TO 都得显式加上,否则下游无法继续分发角色。

角色权限的「可见性」取决于你用什么账号执行 SHOW GRANTS:必须有 SELECT 权限访问 mysql.role_edges 和 mysql.proxies_priv 等系统表,否则连基本角色关系都查不到。普通账号默认看不到其他角色详情,这点比用户权限更严格。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql mysql 8.0

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

3963

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

851

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1029

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5801

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2743

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5780

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7661

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1050

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

912

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 178人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 282人学习