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 只需要调整用户所属角色,不需要逐个修改权限,因此维护成本更低。
相关推荐
肖永威1 小时前
金仓数据库麒麟环境SQL终端使用入门实践(增删改查篇)
数据库·sql·金仓数据库
霸道流氓气质1 小时前
Java 工程师 AI 智能体(Agent)完整学习路线
java·人工智能·学习
m0_715674431 小时前
2026年医疗行业数据库风险监测产品综合能力排名分析
网络·数据库
想要入门的程序猿2 小时前
摄影测量学习()
数码相机·学习
worilb2 小时前
Spring Cloud 学习与实践(13):使用 Seata 解决分布式事务问题
分布式·学习·spring cloud
宠友信息2 小时前
多端即时通讯源码技术实践,Redis路由、MySQL持久化与Socket接入
spring boot·websocket·mysql·uni-app
渣渣灰飞2 小时前
MySQL 系统学习 第四阶段:MySQL 高级 第一节:索引(Index)
数据库·学习·mysql
山峰哥2 小时前
数据库工程与SQL优化实战指南‌
数据库·sql·oracle·深度优先·宽度优先
Quincy_Freak3 小时前
Python 轻量化数据存储实践:国产化环境下SQLite高效管理方案
数据库·sqlite·数据库管理·大数据分析·sqlitego