角色解决什么问题
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 打开后登录即激活全部已授角色,方便但会放大权限面,生产慎用。