查用户绑定的角色需查mysql.role_edges表,WHERE TO_USER='alice' AND TO_HOST='%',FROM_USER为被授予的角色名;角色嵌套关系同样在此表中,FROM_USER为子角色、TO_USER为父角色。

查用户绑定了哪些角色,用 mysql.role_edges
MySQL 8.0 把“谁属于哪个角色”统一存在 mysql.role_edges 表里,不区分用户→角色还是角色→角色。关键字段是 FROM_USER(被授方)和 TO_USER(接收方):
- 查用户
'alice'@'%'直接绑定的角色:SELECT FROM_USER, FROM_HOST FROM mysql.role_edges WHERE TO_USER = 'alice' AND TO_HOST = '%'; - 查角色
'app_writer'是否被其他角色嵌套(即它自己是子角色):SELECT * FROM mysql.role_edges WHERE FROM_USER = 'app_writer'; - 注意:
FROM_HOST和TO_HOST必须严格匹配,'%'和'localhost'是不同条目
看角色带来的权限,必须加 USING 子句
SHOW GRANTS FOR 'alice'@'%' 只显示 alice 自己被直接授予的权限,不会包含任何角色继承来的权限。要看到角色生效后的实际权限,得显式告诉 MySQL “请带上这个角色”:
- 查 alice 通过
'app_writer'获得的权限:SHOW GRANTS FOR 'alice'@'%' USING 'app_writer'; - 查多个角色叠加效果:
SHOW GRANTS FOR 'alice'@'%' USING 'app_writer', 'readonly_analyst'; - 如果
USING后的角色名不存在,或 alice 并未被GRANT过该角色,会报错ER_ROLE_NOT_GRANTED - 这个操作只做静态映射,不检查角色是否已激活;即使没执行过
SET ROLE,也能查到
确认角色是否在当前会话生效,查 INFORMATION_SCHEMA.APPLICABLE_ROLES
角色赋给了用户,不等于当前连接就能用。权限是否落地,取决于会话级激活状态:
- 查当前登录用户已激活的角色:
SELECT * FROM INFORMATION_SCHEMA.APPLICABLE_ROLES; - 查某用户(如
'dev_user'@'localhost')被授予的所有角色(含未激活):SELECT ROLE_NAME, IS_GRANTABLE FROM INFORMATION_SCHEMA.ADMINISTRABLE_ROLE_AUTHORITIES WHERE GRANTEE = '''dev_user'''@'''localhost''';(注意单引号转义) - 若
APPLICABLE_ROLES为空,但你知道用户绑了角色,大概率是漏了SET ROLE 'xxx';或没设默认角色
列级权限要单独查 INFORMATION_SCHEMA.ROLE_COLUMN_GRANTS
SHOW GRANTS FOR ROLE 'xxx' 和 SHOW GRANTS ... USING 都不会显示列级权限(比如只允许更新 users.email)。这类权限从 MySQL 8.0.19 开始才存进系统视图:
- 先确认版本:
SELECT VERSION();,低于 8.0.19 该视图不存在 - 查角色对某列的权限:
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, PRIVILEGE_TYPE FROM INFORMATION_SCHEMA.ROLE_COLUMN_GRANTS WHERE GRANTEE = '''app_writer'''@'''%''';(单引号需写两个) - 该视图只反映「角色」这一层的列授权,不包含用户直授的列权限;如果没结果,先排除版本问题,再确认是不是表级/库级权限
最容易被忽略的是:角色权限不会自动展开,也不会因用户登录就默认激活;SHOW GRANTS 输出的每一条都对应真实可执行的语句,但前提是角色链上每个环节都已正确绑定、且当前会话已激活对应角色。


















