这样的SQL太吓人了
昨天松哥在朋友圈发了这样一张图:
很多小伙伴看到了能够快速发现问题,当 company_id 为 null 的时候,会导致全表更新。
但是也有小伙伴不解,自己平时就是这么写的呀,也没什么问题,如果有问题,那么上面的 SQL 该怎么改呢?
松哥来和大家简单聊几句。
一 防止全表更新
如果在生产环境中使用 UPDATE 语句更新表数据,此时如果忘记携带本应该添加的 WHERE 条件,那么后果不堪设想。
那么怎么避免这个问题呢?
二 sql_safe_updates
sql_safe_updates 是 MySQL 数据库中的一个参数,它的作用是增强数据安全性,防止因误操作导致的数据丢失或破坏。
具体来说,当 sql_safe_updates 设置为 ON(启用)时,MySQL 将阻止执行没有明确 WHERE 子句的 UPDATE 或 DELETE 语句。这意味着如果试图运行一个不包含 WHERE 条件来限定更新或删除范围的 DML 语句,MySQL 会抛出一个错误。而当 sql_safe_updates 设置为 OFF(禁用)时,MySQL 不会对此类无条件更新或删除操作进行特殊限制,允许它们按常规方式执行
这个参数可以配置在会话级别或全局级别。
在会话级别,可以通过执行 SET sql_safe_updates = 1;
命令来启用,这只对当前连接有效。
在全局级别,可以通过 SET GLOBAL sql_safe_updates = 1;
命令或在 MySQL 配置文件中设置,这会影响服务器上所有新的会话,但是这个配置不会修改当前会话。
启用 sql_safe_updates 参数可以减少因人为失误引发的重大数据事故,尤其适合开发环境和对数据完整性要求严格的生产环境。
我们可以先执行 SHOW VARIABLES LIKE '%sql_safe_updates%';
查看当前配置:
然后执行 SET sql_safe_updates = 1;
去更新,更新之后再去查看配置,发现 sql_safe_updates
就已经开启了:
这个时候,假设我们执行如下 SQL:
UPDATE user set username='javaboy';
就会报一个错误:
需要注意的是,启用 sql_safe_updates 参数可能会影响现有应用程序的正常运行,特别是那些依赖于无条件更新或删除操作的程序,因此在生产环境中启用之前,必须确保所有相关的应用程序代码已经过严格审查和适配。
三 SQL 插件
MyBatis-Plus 提供了一个非法 SQL 拦截插件叫做 IllegalSQLInnerInterceptor。这是 MyBatis-Plus 框架中的一个安全控制插件,用于拦截和检查非法 SQL 语句。
这个插件主要提供了四方面的功能:
- 识别并拦截特定类型的 SQL 语句,如全表更新、删除等高风险操作。
- 确保在执行查询时使用索引,以提高性能并避免全表扫描。
- 防止未经授权的全表更新或删除操作,减少数据丢失风险。
- 对包含 not、or 关键字或子查询的 SQL 语句进行额外检查,以防止逻辑错误或性能问题。
插件用法也简单,配置一个 Bean 即可:
@Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 添加非法SQL拦截器 interceptor.addInnerInterceptor(new IllegalSQLInnerInterceptor()); return interceptor; } }
配置完成后,如果执行了不带 where 条件的 update 或者 delete 语句,就会报如下错误。
但是!!!
如果你的 SQL 后面有个 where 1=1
,那么这样的 SQL 是不会被 IllegalSQLInnerInterceptor 插件识别并拦截的。
四 IDEA 插件
利用 IDEA 的一些插件,也可以检测到有风险的 SQL,比如松哥常用的这个:
不过这些插件不一定能检测出来文章一开始所提出的问题。
五 Code Review
日常的 Code Review 也不可少,很多问题都是在 CR 的时候发现的。
六 问题解决
除了上面提到的各种办法之外,对于本文一开始提出的问题,这个有问题的 SQL 还可以做哪些修改呢?
欢迎小伙伴们评论区给出自己的答案~松哥也会在评论区给出我的看法!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
开源日报 | 微软开源C++库Proxy 3;字节发布豆包视频生成大模型;开源苹果手机备份工具;腾讯发布第五代机器人;纯血鸿蒙应用适配工作量大
欢迎阅读 OSCHINA 编辑部出品的开源日报,每天更新一期。 # 2024.9.24 今日要闻 腾讯发布第五代机器人 The Five 腾讯 Robotics X 实验室公布最新机器人研究进展,推出人居环境机器人 “5 号”(The Five,小五),目标是成为可以与人居环境和谐相处的通用机器人。 该机器人拥有四腿轮足复合设计、大面积触觉皮肤、多指灵巧手以及安全人机物理交互等多项能力。可在真实人居环境中完成行走、搬运物体等动作,处理复杂任务,与人进行交互。 字节跳动发布豆包视频生成大模型 字节跳动今天在深圳举办 2024 火山引擎 AI 创新巡展,并发布豆包・视频生成模型以及豆包・音乐模型、豆包・同声传译模型等产品。 据悉,豆包・视频生成模型能遵从复杂 prompt,解锁时序性多拍动作指令与多个主体间的交互能力。 据火山引擎介绍,豆包视频生成模型基于 DiT 架构,通过高效的 DiT 融合计算单元,让视频在大动态与运镜中自由切换,拥有变焦、环绕、平摇、缩放、目标跟随等多镜头语言能力,灵活控制视角,带来真实世界的体验。支持包括黑白、3D 动画、2D 动画、国画等多种风格,包含 1:1、...
- 下一篇
蚂蚁Raft一致性算法库SOFAJRaft深入分析
大家好,我是 V 哥,SOFAJRaft 是蚂蚁金服开源的一个基于 Raft 共识算法的 Java 实现,它特别适合高负载、低延迟的分布式系统场景。SOFAJRaft 支持 Multi-Raft-Group,能够同时处理多个 Raft 集群,具有扩展性和强一致性保障。这个项目是从百度的 braft 移植而来的,并且在性能和功能上做了多项优化。今天的文章,V 哥来聊一聊SOFAJRaft的核心源码实现。 打开全球最大的基友网站 Github,搜索 sofa-jraft,可以找到SOFAJRaft库的源码实现: SOFAJRaft 是一个基于 RAFT 一致性算法的生产级高性能 Java 实现,支持 MULTI-RAFT-GROUP,适用于高负载低延迟的场景。 使用 SOFAJRaft 你可以专注于自己的业务领域,由 SOFAJRaft 负责处理所有与 RAFT 相关的技术难题,并且 SOFAJRaft 非常易于使用,你可以通过几个示例在很短的时间内掌握它。 V哥要介绍的不是基础应用,而是通过SOFAJRaft库的实现原理,帮助兄弟们来理解Raft算法。 SOFAJRaft 核心概念 SO...
相关文章
文章评论
共有0条评论来说两句吧...