SHOW GRANTS FOR ROLE 必须用单引号包裹角色名,如 'analyst_role';仅显示直授权限,不递归嵌套角色;列级权限需查 INFORMATION_SCHEMA.ROLE_COLUMN_GRANTS(8.0.19+);权限需 SET ROLE 或默认角色激活才生效。

SHOW GRANTS FOR ROLE 必须带单引号,否则报错
直接执行 SHOW GRANTS FOR ROLE analyst_role 会触发 ERROR 1064 (42000)。MySQL 要求角色名必须用单引号包裹,和查用户权限时写 'user'@'host' 是同一套规则。正确写法只有这一种:SHOW GRANTS FOR ROLE 'analyst_role'。双引号、不加引号、或把引号当成注释去掉,全都不行。
结果只显示直授权限,不递归展开嵌套角色
如果角色 'app_writer' 被授予了另一个角色 'readonly_analyst',SHOW GRANTS FOR ROLE 'app_writer' 不会列出 readonly_analyst 所含的 SELECT ON logdb.* 权限。它只反映你对这个角色“直接执行过哪些 GRANT”。要确认是否嵌套了其他角色,得查 mysql.role_edges:
- 查
'app_writer'绑定了哪些子角色:SELECT TO_USER, TO_HOST FROM mysql.role_edges WHERE FROM_USER = 'app_writer' - 查谁把
'app_writer'当作子角色用了:SELECT FROM_USER, FROM_HOST FROM mysql.role_edges WHERE TO_USER = 'app_writer'
注意字段方向:FROM_USER 是授出方(可能是用户或角色),TO_USER 是接收方。
列级权限不会出现在 SHOW GRANTS 结果里
像 UPDATE(email) ON users 这类列级权限,SHOW GRANTS FOR ROLE 默认完全不显示。必须用 INFORMATION_SCHEMA.ROLE_COLUMN_GRANTS 单独查,且仅限 MySQL 8.0.19 及以上版本:
- 先确认版本:
SELECT VERSION() - 再查权限:
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, PRIVILEGE_TYPE FROM INFORMATION_SCHEMA.ROLE_COLUMN_GRANTS WHERE GRANTEE = '''app_writer'''@'''%'''(注意单引号要写两个,这是 MySQL 字符串转义规则)
这张表只存「角色」层级的列授权,不包含用户直授的列权限;如果查不到结果,优先排查版本是否够高,或权限本身其实是表级/库级的。
权限查到了,但实际用不了?检查角色是否激活
SHOW GRANTS FOR ROLE 'analyst_role' 告诉你“这个角色被给了什么”,但不保证当前会话能用。普通用户连接后,默认不自动启用任何角色。必须显式执行:SET ROLE 'analyst_role' 或 SET DEFAULT ROLE 'analyst_role' TO 'user'@'host',否则即使权限清单完整,执行 INSERT 或 SELECT 仍会报错。验证当前已激活的角色,运行:SELECT * FROM INFORMATION_SCHEMA.ENABLED_ROLES。











