首页/数据/数据库速查/角色 ROLE 与 SET ROLE 权限复用

角色 ROLE 与 SET ROLE 权限复用

8.0 角色把权限模板化:建角色、授角色给账号、账号激活角色,权限变更只改角色一处,回收账号时统一清理。

数据库速查数据更新于 2026-10-13

角色解决什么问题

MySQL 8.0 引入角色(ROLE):把一组权限打包成命名实体,账号通过获得角色来继承权限。权限模板只维护一份,新同事入职授予角色,岗位调整改角色,离职回收账号即可,避免了逐个账号 GRANT 带来的遗漏与漂移。角色本身也可以被授予其他角色,从而形成层级化的权限模型。

基本信息

适用平台MySQL 8.0+;5.7 及以下无原生角色
核心语句CREATE ROLE、GRANT 角色 TO 账号、SET ROLE、SET DEFAULT ROLE
激活方式SET DEFAULT ROLE 持久化,或登录后 SET ROLE 临时激活
相关参数activate_all_roles_on_login、mandatory_roles、partial_revokes
元数据角色与授权关系持久化在 mysql 系统库

典型使用场景

  • 按岗位划分权限:只读分析师、应用读写账号、运维管理账号各建一个角色
  • 新人入职:一条 GRANT 授予角色即可,不必逐个库逐个表授权
  • 权限批量变更:给角色追加权限,所有持有该角色的账号同时生效
  • 审计与合规:通过 SHOW GRANTS FOR 角色快速列出该岗位的完整权限
  • 离职回收:删除账号即彻底断开继承链,不需要逐个 REVOKE

创建与使用角色

创建与使用角色
-- 创建只读角色并授予库级查询权限
CREATE ROLE 'r_readonly';
GRANT SELECT, SHOW VIEW ON appdb.* TO 'r_readonly';
-- 把角色授予账号
GRANT 'r_readonly' TO 'analyst'@'%';
-- 设为默认角色,登录后自动生效
SET DEFAULT ROLE 'r_readonly' TO 'analyst'@'%';
-- 会话内临时激活并确认
SET ROLE 'r_readonly';
SELECT CURRENT_ROLE();

角色运维管理

角色运维管理
-- 查看角色自身的权限
SHOW GRANTS FOR 'r_readonly';
-- 查看账号被授予了哪些角色
SHOW GRANTS FOR 'analyst'@'%';
-- 收回角色与删除角色
REVOKE 'r_readonly' FROM 'analyst'@'%';
DROP ROLE 'r_readonly';
-- 需要临时获取全部已授角色时
SET ROLE ALL;

关键语句对照

语句作用生效范围
CREATE ROLE创建角色(不是账号,不能直接登录)实例级
GRANT 权限 TO 角色给角色打包权限实例级,长期有效
GRANT 角色 TO 账号建立继承关系实例级,不自动激活
SET DEFAULT ROLE指定登录后自动激活的角色对该账号持久有效
SET ROLE仅当前会话激活会话级,断开即失效
SHOW GRANTS查看账号或角色的权限清单查询,不改变权限
授予角色不等于权限立即生效:没有设置默认角色、也没有会话内 SET ROLE 时,账号的 CURRENT_ROLE() 为空,执行查询会被拒绝,这是最常见的角色使用事故。
两个容易忽略的参数:mandatory_roles 指定的角色对所有账号强制生效,适合放登录审计这类共性权限;activate_all_roles_on_login 打开后登录即激活全部已授角色,方便但会放大权限面,生产慎用。

易错点

  • 授完角色就以为完事:账号登录后权限不生效,报错提示权限不足,需要补 SET DEFAULT ROLE 或会话内 SET ROLE
  • 角色当账号用:CREATE ROLE 创建的对象默认不能登录,直接拿它连库会认证失败
  • 把全局宽权限授予角色后只回收部分库:未开启 partial_revokes 时无法对单库做回收,只能重建更细的角色
  • 角色命名与账号名混用同一个命名空间:同名角色与账号会互相干扰,命名时加统一前缀区分

数据来源与参考

  • MySQL 8.0 Reference Manual: Using Roles

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌