MySQL8.0+中引入的SET_USER_ID权限迭代SUPER权限指定 DEFINER

SET_USER_ID 是 MySQL 8.0 引入的一个细粒度权限(Granular Privilege),旨在解决"最小权限原则"与"指定 DEFINER"之间的矛盾。

在 MySQL 5.7 及以前,如果你想创建一个 DEFINER 为其他用户(非当前登录用户)的存储过程、视图或触发器,你必须拥有全局的 SUPER 权限。

然而,SUPER 权限过大,它包含了重启服务器、修改全局变量、杀死任意线程等高危操作。为了安全起见,云数据库(如阿里云 RDS、AWS Aurora)通常禁止给用户授予 SUPER 权限。

这就导致了一个困境:普通管理员无法创建指定其他用户为 DEFINER 的对象。

MySQL 8.0 引入 SET_USER_ID就是为了解决这个问题。

SET_USER_ID 的核心作用

拥有 SET_USER_ID 权限的用户,可以执行以下操作:

  • 在创建存储过程、函数、视图、触发器时,指定任意其他用户作为 DEFINER。
  • 使用 SET ROLE 语句切换角色。
  • 本质上,它允许你"冒充"另一个用户的身份来定义对象,但不赋予你该用户的其他特权(如删除数据、重启服务等)。

为什么需要它?(场景举例)

假设你是一个 DevOps 工程师,负责部署应用。

  • 应用代码中有一个存储过程 proc_update_order。
  • 为了安全,这个存储过程应该以应用专用账号 app_user 的身份运行(即 DEFINER='app_user'@'%'),而不是以你的个人管理员账号 admin_user 运行。
  • 在 MySQL 5.7 中:你需要 SUPER 权限才能创建 DEFINER='app_user' 的过程。但云厂商不给你 SUPER。
  • 在 MySQL 8.0 中:DBA 可以只给你授予 SET_USER_ID 权限。你就可以合法地创建 DEFINER='app_user' 的过程,而无需拥有危险的 SUPER 权限。

注意事项

  • 在原生 MySQL 中,SET_USER_ID 是一个全局权限(Global Privilege)
  • 授予此权限需要 SUPER 权限执行
  • SET_USER_ID是 MySQL 8.0 引入

总结

SET_USER_ID 是 MySQL 8.0 为了安全地替代 SUPER 权限中"指定 DEFINER"这一功能而设计的。它是一个好特性,但在当前的云数据库环境中,普及度和开放度依然有限。对于大多数开发者来说,避免硬编码 DEFINER 仍然是最稳妥、兼容性最好的做法。

相关推荐
OceanBase数据库官方博客9 小时前
被 VLDB 2027接收OceanBase 最新论文让数据库基(技术解析与实践)
数据库·人工智能·oceanbase
颜酱10 小时前
一栋商业大厦,讲清 InnoDB 的表空间、段、区和页
后端·mysql
创邻科技10 小时前
国产图数据库刷新 LDBC 世界纪录:创邻科技 Galaxybase 在 SF100、SF300、SF1000 测试中全面领先”
数据库·科技
GreatSQL社区10 小时前
主从复制SQL线程中断——字符集砸出的坑
java·数据库·算法
XLYcmy11 小时前
AI 赋能后中文与英文数据库对比分析报告 上
数据库·ai·llm·prompt·检索·wos·cnki
这个DBA有点耶11 小时前
ELT 工具选型完整指南:从 ETL 差异分析到工程落地
数据库·架构·代码规范
IvorySQL11 小时前
PostgreSQL 日报|堆表选择性索引更新(10 月 13 日)
数据库·人工智能·postgresql·开源·区块链
张洛闻Eren11 小时前
Ansible【第一课】:Ansible介绍
运维·数据库·云原生·kubernetes·github·ansible
PC2005-cloud11 小时前
Mysql学习笔记:InnoDB Cluster 集群从零搭建实战,基于 Docker 实现高可用读写分离架构
笔记·学习·mysql
深圳市益普科技有限公司12 小时前
中小封装厂上 MES,为什么十个项目九个坑?
大数据·数据库·人工智能