MySQL 系统学习 第二阶段 第四章:DCL(Data Control Language)第二节:权限管理与角色(Role)

一、为什么需要 Role?

假设公司有 100 名开发人员。

如果不用 Role:

复制代码
复制代码
开发A
    ├── SELECT
    ├── INSERT
    ├── UPDATE
    └── DELETE

开发B
    ├── SELECT
    ├── INSERT
    ├── UPDATE
    └── DELETE

......

开发100
    ├── SELECT
    ├── INSERT
    ├── UPDATE
    └── DELETE

每来一个新人,都要重新执行很多次 GRANT。

如果权限发生变化,还要修改所有人的权限。

维护成本非常高。


使用 Role 后

复制代码
复制代码
developer_role
    │
    ├── SELECT
    ├── INSERT
    ├── UPDATE
    └── DELETE

        │
        ├──── 开发A
        ├──── 开发B
        ├──── 开发C
        └──── 开发D

以后:

新增开发人员:

复制代码
复制代码
GRANT developer_role TO 'tom'@'localhost';

即可。


二、Role(角色)是什么?

一句话:

Role 是一组权限的集合。

可以理解成:

复制代码
复制代码
Role = 权限包

例如:

复制代码
复制代码
developer_role

包含:

SELECT
INSERT
UPDATE
DELETE

任何用户拥有这个 Role,就拥有这些权限。


三、创建角色(CREATE ROLE)

语法

复制代码
复制代码
CREATE ROLE '角色名';

例如:

复制代码
复制代码
CREATE ROLE 'developer_role';

再创建一个:

复制代码
复制代码
CREATE ROLE 'analyst_role';

四、给角色授权

角色创建出来以后,本身没有任何权限。

例如:

复制代码
复制代码
GRANT
SELECT,
INSERT,
UPDATE,
DELETE
ON school.*
TO 'developer_role';

现在:

复制代码
复制代码
developer_role

↓

拥有:

SELECT
INSERT
UPDATE
DELETE

分析师角色:

复制代码
复制代码
GRANT
SELECT
ON school.*
TO 'analyst_role';

分析师只能查询。


五、把角色赋给用户

例如:

已经有用户:

复制代码
复制代码
tom
jack
lucy

给 tom:

复制代码
复制代码
GRANT 'developer_role'
TO 'tom'@'localhost';

给 Lucy:

复制代码
复制代码
GRANT 'analyst_role'
TO 'lucy'@'localhost';

这样:

Tom:

复制代码
复制代码
拥有:

SELECT
INSERT
UPDATE
DELETE

Lucy:

复制代码
复制代码
拥有:

SELECT

六、设置默认角色

一个用户可能拥有多个角色。

例如:

复制代码
复制代码
developer_role

tester_role

登录以后:

可以指定默认角色:

复制代码
复制代码
SET DEFAULT ROLE
'developer_role'
TO 'tom'@'localhost';

以后登录:

自动启用:

复制代码
复制代码
developer_role

七、查看角色

查看用户权限:

复制代码
复制代码
SHOW GRANTS FOR 'tom'@'localhost';

返回类似:

复制代码
复制代码
GRANT developer_role TO tom@localhost

八、删除角色

复制代码
复制代码
DROP ROLE 'developer_role';

注意:

删除 Role:

复制代码
复制代码
Role 消失

↓

用户仍存在

↓

只是失去这个角色带来的权限

九、Role 和 User 的区别(重点)

很多初学者容易混淆。

User(用户) Role(角色)
能登录数据库 不能登录数据库
有用户名和密码 没有密码
可以拥有角色 可以拥有权限
代表一个人或程序 代表一类权限

可以理解成:

复制代码
复制代码
Role
    ↓
权限集合

User
    ↓
真正登录数据库的人

十、企业真实权限设计

例如:

数据库有三种角色:

复制代码
复制代码
admin_role

权限:

复制代码
复制代码
所有权限

复制代码
复制代码
developer_role

权限:

复制代码
复制代码
SELECT
INSERT
UPDATE
DELETE

复制代码
复制代码
analyst_role

权限:

复制代码
复制代码
SELECT

然后:

复制代码
复制代码
Tom

↓

developer_role

Lucy:

复制代码
复制代码
Lucy

↓

analyst_role

以后:

Tom 换部门。

只需要:

复制代码
复制代码
REVOKE 'developer_role'
FROM 'tom'@'localhost';

GRANT 'analyst_role'
TO 'tom'@'localhost';

不用重新一条一条修改权限。


十一、企业为什么喜欢 Role?

因为:

① 权限统一管理

修改一次 Role:

所有用户自动生效。


② 新员工入职简单

只需要:

复制代码
复制代码
GRANT developer_role
TO 新员工;

③ 更安全

不会出现:

复制代码
复制代码
A 有 SELECT

B 少 UPDATE

C 多 DELETE

权限混乱。


④ 易于维护

几十人:

还能管理。

几百人:

必须用 Role。


十二、本节总结

命令 作用
CREATE ROLE 创建角色
GRANT ... TO role 给角色授权
GRANT role TO user 给用户分配角色
SET DEFAULT ROLE 设置默认角色
SHOW GRANTS 查看角色/权限
DROP ROLE 删除角色

十三、User 与 Role 对比

对比 User Role
是否能登录 ✅ ❌
是否有密码 ✅ ❌
是否拥有权限 ✅(直接或通过角色) ✅
是否代表人员 ✅ ❌(代表权限集合)

🎯 本节核心一句话

Role(角色)本质上是一组权限的集合,企业通过"角色 → 用户"的方式管理权限,而不是给每个用户单独授权。


📚 思考题

  1. 为什么企业更推荐使用 Role,而不是直接给每个用户执行 GRANT?
    企业使用 Role 是为了实现权限复用、统一管理和降低维护成本。
  2. Role 和 User 有哪些本质区别?
    User 代表"人或程序",Role 代表"权限集合"。
  3. 为什么说 Role 能降低权限管理成本?
    Role 把"用户管理"与"权限管理"分离,大幅减少重复操作。
  4. 一个用户可以拥有多个 Role 吗?为什么需要这样设计?
    多 Role 设计可以让权限组合更加灵活,适应复杂企业组织结构。
  5. 如果开发人员调到数据分析岗位,使用 Role 和直接修改权限,两种方式哪种维护成本更低?为什么?
    使用 Role 只需要调整用户所属角色,不需要逐个修改权限,因此维护成本更低。
相关推荐
对空六课36 分钟前
支持注意力分析的热力图工具有哪些?
前端·数据库·数据分析
南京码讯光电技术有限公司1 小时前
How to Design an Antenna System for an Industrial WiFi Module
数据库·人工智能
lusklusklusk2 小时前
Oracle数据库基础之2_体系结构
数据库·oracle
可乐ea2 小时前
从第一性原理构建 AI Agent:提示词、工具、技能与记忆全解剖
数据库·人工智能·工具调用·ai智能体·提示词工程·agent开发·智能体记忆
余槐i2 小时前
MySQL 深分页从 4 秒到 60 毫秒:延迟关联减少回表的实测与代价
mysql·性能优化·sql优化·执行计划·慢查询优化
东方护航数据恢复(深圳)3 小时前
医疗案例:HIS/PACS 数据库页损坏修复,医院不停诊完成恢复【东方护航数据恢复深圳店】
数据库·数据恢复·医疗·二次开盘
传奇开心果编程3 小时前
【SwiftUI提高练中学】第13课 实时活动与灵动岛:ActivityKit 实战
学习·ui·ios·swiftui·swift
欣欣之王来了3 小时前
Python入门:什么是Python以及为什么选择它
学习·架构·面向对象·项目·python教程
dadaobusi4 小时前
pcie原子操作和nvme原子操作
学习
lusklusklusk4 小时前
Oracle数据库基础之11_Duplicate和Dataguard和RAC
数据库·oracle