无法一键列出所有激活角色及其完整权限,因激活状态是会话级的,需先用SELECT CURRENT_ROLE()查当前激活角色,再对每个角色执行SHOW GRANTS FOR ROLE 'role_name'查直授权限,嵌套角色需查mysql.role_edges,列级权限需查INFORMATION_SCHEMA.ROLE_COLUMN_GRANTS(MySQL 8.0.19+)。

不能直接“一键列出所有激活角色及其完整权限”,因为激活状态是会话级的,而权限需合并角色自身权限 + 当前会话启用的角色。
查看当前会话已激活的角色
执行 SELECT CURRENT_ROLE(); 只返回当前会话生效的角色名(如 'dev_role' 或 ALL),不显示权限内容。若返回 NULL,说明没激活任何角色;返回 ''(空字符串)表示激活了匿名角色(极少见)。该语句对普通用户也开放,无需高权限。
查出所有被激活角色的具体权限
必须对每个激活角色单独执行 SHOW GRANTS FOR ROLE,且角色名必须用单引号包裹:
-
SHOW GRANTS FOR ROLE 'dev_role';—— 正确 -
SHOW GRANTS FOR ROLE dev_role;—— 报错ERROR 1064 (42000) -
SHOW GRANTS FOR ROLE "dev_role";—— 双引号也不行,MySQL 不认
注意:该命令只显示角色直授的权限,不递归展开它所依赖的其他角色(比如 dev_role 被 GRANT readonly_role TO dev_role 过,也不会体现)。要查嵌套关系,得查 mysql.role_edges 表,其中 FROM_USER 是授予方(即父角色),TO_USER 是接收方(子角色或用户)。
列级权限不会出现在 SHOW GRANTS FOR ROLE 结果里
如果角色有列级授权(如只允许更新 users.email),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 = '''dev_role'''@'''%'''(注意单引号要写两个,这是 MySQL 字符串转义规则) - 该视图只反映「角色」这一层的列授权,不包含用户直授的列权限
为什么你查不到权限,可能不是权限不存在
常见盲区:
- 角色虽已分配给用户,但未激活(没执行
SET DEFAULT ROLE或SET ROLE),此时CURRENT_ROLE()返回NULL,SHOW GRANTS FOR ROLE的结果和当前会话无关 - 用户有多个角色,但只激活了其中一个,其余权限不会自动合并进来
-
SHOW GRANTS FOR ROLE输出里出现USAGE ON *.*,不代表没权限——这只是占位符,实际权限可能在库级、表级或列级,得继续查mysql.db或INFORMATION_SCHEMA.ROLE_TABLE_GRANTS
真正生效的权限,永远是「用户显式权限 + 当前激活角色的直授权限」的并集,且列级、行级等细粒度控制必须分表查,没有统一视图能一网打尽。


















