乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • 第1章 数据库基础与安装

    • MySQL 简介
    • MySQL 5.6 到 5.7 到 8.0 关键差异速查
    • 安装 MySQL 5.7
    • 连接与断开服务器
    • 创建数据库
    • 创建数据表
    • 数据库与数据表
    • 加载数据
    • 获取数据库信息
    • 批处理模式
    • SHOW 语句汇总
    • FLUSH 与 RESET 语句
    • my.cnf 核心参数
    • 字符集与排序规则
  • 第2章 SQL基础查询

    • SELECT
    • WHERE
    • ORDER BY
    • LIMIT
    • COUNT
    • 聚合函数
    • 比较运算符
    • 逻辑运算符
    • 算术运算符
    • 模式匹配
    • NULL 值处理
    • UPDATE
    • DELETE
    • REPLACE
    • SELECT INTO
  • 第3章 数据类型与运算符

    • 数值类型
    • 字符串类型
    • 日期时间类型
    • BIT 类型
    • ENUM 类型
    • SET 类型
    • JSON 类型
    • 类型转换
  • 第4章 函数与表达式

    • 字符串函数
    • 数值函数
    • 日期函数
    • 全文检索函数
  • 第5章 高级查询与子查询

    • JOIN
    • 子查询
    • UNION
    • GROUP BY
    • HAVING
    • DISTINCT
  • 第6章 表与索引

    • 数据定义语言
    • 修改表结构
    • 视图
    • 修改视图与检查选项
    • 外键
    • 索引
    • 唯一索引
    • 复合索引
    • 存储引擎对比
    • 分区表
    • 第一范式与第二范式
    • 第三范式与 BC 范式
    • 反范式设计
  • 第7章 存储过程与函数

    • 存储过程
    • 存储函数
    • 变量
    • 流程控制
    • 游标
    • 预处理语句
  • 第8章 事务与锁

    • 事务
    • 事务隔离级别
    • 锁机制
    • MVCC
    • 死锁专题分析
    • LOCK TABLES
    • XA 事务
  • 第9章 用户管理与安全

    • 用户管理
    • 权限管理
    • 角色
    • SQL 注入防范
  • 第10章 性能优化入门

    • 执行计划
    • 索引优化
    • 查询优化
    • 查询优化器提示
    • 慢查询日志
    • InnoDB 深入机制
    • InnoDB 专项优化
    • Performance Schema
    • sys Schema
  • 第11章 复制与高可用

    • 主从复制原理
    • 半同步复制配置
    • binlog 开启与 point-in-time 恢复
    • mysqldump 全库备份
    • mysqldump 单表与条件备份
    • mysqldump 恢复与导入
    • xtrabackup 全量热备
    • xtrabackup 准备与恢复
    • xtrabackup 增量与流式备份
  • 第12章 触发器与事件

    • 触发器
    • 事件调度器
  • 参考

    • MySQL 5.7 专业术语大全
    • MySQL 5.7 关键字与保留字大全

角色

导学

MySQL 5.7 不支持角色(Role)机制。角色是 MySQL 8.0 才引入的新特性。在 5.7 中,权限只能直接授予用户。本节先澄清这一版本差异,再介绍 5.7 中批量管理权限的实用替代方案。

版本差异速查:

特性MySQL 5.7MySQL 8.0
CREATE ROLE❌ 不支持✅ 支持
GRANT role TO user❌ 不支持✅ 支持
SET ROLE❌ 不支持✅ 支持
SET DEFAULT ROLE❌ 不支持✅ 支持
激活/切换角色❌ 不支持✅ 支持

定义

角色(Role):命名的权限集合,本身不能登录,但可以授予用户使其继承权限。这是**MySQL 8.0+**的特性,MySQL 5.7 中不存在。

在 MySQL 5.7 中,权限管理只能采用直接授权模式:每个用户的权限通过 GRANT 直接赋予,无法通过中间层(角色)批量继承。

MySQL 5.7 的替代方案

方案一:直接批量 GRANT(最常用)

虽然没有角色,但可以通过脚本批量给多个用户授予相同权限。

前置准备:

CREATE DATABASE IF NOT EXISTS app_db CHARACTER SET utf8mb4;
USE app_db;

CREATE TABLE employees (
    emp_id INT AUTO_INCREMENT PRIMARY KEY,
    emp_name VARCHAR(20),
    dept VARCHAR(20),
    score DECIMAL(5, 2)
);

INSERT INTO employees (emp_name, dept, score) VALUES
('大翔', '技术部', 100),
('白歌', '技术部', NULL);

创建用户并直接授权:

-- 创建只读用户
CREATE USER 'analyst'@'localhost' IDENTIFIED BY 'Analyst123!';
CREATE USER 'analyst'@'%' IDENTIFIED BY 'Analyst123!';

-- 创建读写用户
CREATE USER 'backend'@'localhost' IDENTIFIED BY 'Backend123!';
CREATE USER 'backend'@'%' IDENTIFIED BY 'Backend123!';

-- 创建管理员用户
CREATE USER 'db_admin'@'localhost' IDENTIFIED BY 'DbAdmin123!';

批量授权:

-- 给所有分析师授予只读权限
GRANT SELECT ON app_db.* TO 'analyst'@'localhost';
GRANT SELECT ON app_db.* TO 'analyst'@'%';

-- 给所有后端开发授予读写权限
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'backend'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'backend'@'%';

-- 给管理员授予所有权限
GRANT ALL PRIVILEGES ON app_db.* TO 'db_admin'@'localhost' WITH GRANT OPTION;

验证权限:

SHOW GRANTS FOR 'analyst'@'localhost';
SHOW GRANTS FOR 'backend'@'localhost';
SHOW GRANTS FOR 'db_admin'@'localhost';

analyst 的权限:

Grants for analyst@localhost
GRANT USAGE ON . TO 'analyst'@'localhost'
GRANT SELECT ON app_db.* TO 'analyst'@'localhost'

backend 的权限:

Grants for backend@localhost
GRANT USAGE ON . TO 'backend'@'localhost'
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'backend'@'localhost'

db_admin 的权限:

Grants for db_admin@localhost
GRANT USAGE ON . TO 'db_admin'@'localhost'
GRANT ALL PRIVILEGES ON app_db.* TO 'db_admin'@'localhost' WITH GRANT OPTION

结果解读:

  • 每个用户的权限直接绑定,没有中间层(角色)
  • 新增用户时需要重新执行一遍 GRANT 语句
  • 权限变更时需要逐个用户 REVOKE 再 GRANT

方案二:用存储过程封装批量授权逻辑

将"权限模板"封装在存储过程中,模拟角色的批量授予效果。

创建存储过程:

DELIMITER //

CREATE PROCEDURE GrantReadOnly(IN user_host VARCHAR(100))
BEGIN
    SET @sql = CONCAT('GRANT SELECT ON app_db.* TO ', user_host);
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END //

CREATE PROCEDURE GrantReadWrite(IN user_host VARCHAR(100))
BEGIN
    SET @sql = CONCAT('GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO ', user_host);
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END //

DELIMITER ;

调用存储过程批量授权:

-- 给新用户授予只读权限
CALL GrantReadOnly("'new_analyst'@'localhost'");

-- 给新用户授予读写权限
CALL GrantReadWrite("'new_dev'@'localhost'");

结果解读:

  • 存储过程充当了"权限模板"的角色,减少重复 SQL
  • 但本质上仍是直接授权,没有真正的角色继承机制
  • 删除用户权限时仍需逐个 REVOKE

方案三:用脚本/程序管理权限(生产推荐)

在应用层或运维脚本中维护权限配置,通过程序批量执行 GRANT/REVOKE。

示例:Python 批量授权脚本思路

# 权限配置表(在程序中维护)
permissions = {
    'analyst': ['SELECT'],
    'backend': ['SELECT', 'INSERT', 'UPDATE', 'DELETE'],
    'admin': ['ALL PRIVILEGES']
}

# 批量执行 GRANT
for user, perms in permissions.items():
    sql = f"GRANT {', '.join(perms)} ON app_db.* TO '{user}'@'localhost'"
    # execute(sql)

结果解读:

  • 将"角色"概念下沉到应用配置层
  • 新增用户时只需在配置表中添加一行
  • 权限变更时修改配置表并重新执行脚本
  • 这是 MySQL 5.7 生产环境中最实用的"伪角色"方案

常见误区

误区正解
"MySQL 5.7 支持 CREATE ROLE"不支持。CREATE ROLE 是 MySQL 8.0 的语法,5.7 执行会报错。
"MySQL 5.7 可以用 GRANT 'role' TO 'user'"不支持。这种语法在 5.7 中会报错。
"MySQL 5.7 有 SET ROLE 切换角色"不支持。SET ROLE 是 8.0 特性。
"没有角色就无法批量管理权限"可以用存储过程、脚本或程序配置层模拟批量授权。

面试考点

Q:MySQL 5.7 支持角色吗?

不支持。角色(Role)是 MySQL 8.0 引入的特性。5.7 中权限只能直接授予用户,无法通过角色继承。替代方案包括:直接批量 GRANT、存储过程封装、应用层配置管理。

Q:MySQL 5.7 和 8.0 在权限管理上的最大区别?

5.7 只有直接授权模型;8.0 引入了角色机制,支持 CREATE ROLE、GRANT role TO user、SET ROLE 等完整角色生命周期管理。

Q:在 5.7 中如何模拟角色的批量授权效果?

  1. 直接批量 GRANT 给同类用户;2. 用存储过程封装权限模板;3. 在应用层维护权限配置表,通过脚本同步到数据库。

小结

  • MySQL 5.7 不支持角色(Role),这是 8.0 的特性
  • 5.7 中权限只能直接授予用户,没有继承机制
  • 替代方案:批量 GRANT、存储过程封装、应用层配置管理
  • 如果业务需要角色机制,建议升级到 MySQL 8.0

下一章引子:权限管理除了授权,还需要定期审计和回收——SQL 注入防范是权限管理的重要延伸。

上一页
权限管理
下一页
SQL 注入防范