SQL不慎迷失在WHERE
作者:臭豆腐[trydofor.com]
日期:2009-11-21
授权:署名-非商业-保持一致 1.0 协议
声明:拷贝、分发、呈现和表演本作品,请保留以上全部信息。
文档目录
1. 灾难回顾
出于各种业务需要,项目经常使用SQL手工维护数据。
5个年头里,大概有过4次刻骨铭心的WHERE灾难。
所谓灾难,一般具有以下一些特征。
- 影响了正式生产环境。
- 破坏了百万级或千万级的记录。
- 数据关系复杂,极难还原。
- 几人日的工作或通宵才能恢复。
造成灾难的原因都十分低级,十分低概率,不经历过也许不会相信,
也许再仔细那么一点点,也许再慢那么一小会儿,就完全可以避免。
但事实是,人是会在某些时候短路,犯不可能的低级错误的。
2. 防范措施
正确完成一个操作,我们需要把正确的SQL执行在正确的数据库上。
取其反,结果可能就是一个灾难。
两类错误,
三种情况,
- 正确的SQL执行在错误的数据库上。
- 错误但可执行的SQL执行在正确的数据库上。
- 错误但可执行的SQL执行在错误的数据库上。
防范上最为有效的措施是,结对操作,即找个搭档当听众,
把操作上的每一步逻辑和目标讲给他听,并得其确认。
2.1. 正确的数据库
要求上,必须在连接前和链接后确认。操作上,有以下几种策略,
- 关闭所有无关的链接,或关闭客户端程序。
- 确认目标数据库的连接,并起个醒目而直接的名字。
- 连接后,找服务器特征数据,查看确认。
2.2. 正确的SQL
危险的SQL是UPDATE和DELETE,错误但可执行的SQL一般为,
- 单条SQL,WHERE残缺或错误。
- 一组SQL,丢失部分SQL。
- 一组SQL,混入其他SQL。
一组SQL的情况,防范起来比较容易,做好确认和清场工作就可以了。
单条SQL的情况,最为常见和且危险最大。通常做一些制度防范。
第一,全部数据UPDATE和DELETE时,强制使用WHERE 1=1。
<sql> 强制WHERE |
001
002
003
004
005
006
007
008
009
010
011
012
|
// 正常 UPDATE
UPDATE TEST SET FIELD1=1,FIELD2=2
GO
// 强制WHERE UPDATE
UPDATE TEST SET FIELD1=1,FIELD2=2 WHERE 1=1
GO
// 正常 DELETE
DELETE FROM TEST
GO
// 强制WHERE DELETE
DELETE FROM TEST WHERE 1=1
GO
|
|
第二,部分数据UPDATE和DELETE时,更新前必须SELECT。
即,把SELECT的WHERE完整的使用在UPDATE和DELETE上。
<sql> 强制SELECT |
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
|
// 正常 UPDATE
UPDATE TEST SET FIELD1=1,FIELD2=2 WHERE FIELD3 =3
GO
// 强制SELECT UPDATE
SELECT FIELD1=1,FIELD2=2 FROM TEST
//UPDATE TEST SET FIELD1=1,FIELD2=2
WHERE FIELD3 =3
GO
// 正常 DELETE
DELETE FROM TEST WHERE FIELD3 =3
GO
// 强制SELECT DELETE
SELECT FIELD1=1,FIELD2=2
//DELETE
FROM TEST WHERE FIELD3 =3
GO
|
|
说明,强制SELECT主要是为了观察数据,COUNT(1)或关键字段经常用到。
执行的时候分两次,第一次单条全选,第二次从注释开始选。
3. 补救套路
在既有的容灾策略上,减少或消除不良影响,基本套路有,
- 基于备份回到过去。
- 根据履历从头再来。
- 回到过去并从头再来。
操作上,
首先,要冷静,权当在做梦,虚惊一场。
一般发生这事,相关人员会出汗,发热,而发热的头脑只能导致更发热的事故。
然后,回顾细节和确定影响,及时沟通和上报。
三个臭皮匠顶个诸葛亮,纯客观的一五一十的把事情说清楚,以便决策。
最后,确定补救策略和实施细节。
考虑到各种情况和对策,并在实施前,逐条重述一边。
关键一点,整个过程全部精力锁定在如何补救上,不得追究责任或评估后果。
分享到:
相关推荐
在实际应用中,`SQL WHERE 条件解析器`通常与前端界面结合,用户可以通过界面上的控件设置查询条件,后端服务接收到这些条件后,通过解析器生成相应的SQL查询,从而返回符合用户需求的数据。 总结来说,`SQL WHERE ...
动态拼接sql语句工具类,拼接where后面语句 配合原生jdbc仿动态sql注入 if (ObjectUtil.isNotEmpty(maxLat)&&ObjectUtil.isNotEmpty(minLat)){ sqlParamList.add(new SqlParam("lat",minLat, SqlOpEnum.GE)); ...
方法1、使用语言的for语句循环生成SQL语句中的“?”,类似这样: 新建方法 func placeholders(n int) string { var b strings.Builder for i := 0; i 0 { b.WriteString("?") } return b.String() } 调用...
SQL Where 简单判断
在SQL查询中,`WHERE`子句是至关重要的部分,它用于从数据库中筛选出满足特定条件的记录。本文将深入探讨`WHERE`条件类在SQL查询中的使用,以及如何结合`SQL_CONDITION`来构建更复杂的查询语句。 首先,我们要明白`...
在Sql Server中,参数化查询是提高查询性能和防止SQL注入攻击的有效方法之一。其中,where in和like是两个常用的查询条件,然而它们的参数化实现却不是那么简单。本文将详细介绍where in和like的参数化查询实现方法...
自己总结的 关于sqlserver存储过程与多值参数的解决办法。
SQL where SQL AND & OR SQL Order By SQL insert SQL update SQL delete SQL 高级 SQL Top SQL Like SQL 通配符 SQL In SQL Between SQL Aliases SQL Join SQL Inner Join SQL Left Join SQL Right ...
SQL 语句中 where 条件后 写上 1=1 是什么意思!.doc
java调试中的小问题解决和背景知识; 在SQL语句中"where 1=1"是什么意思.
在SQL查询中,`WHERE 1=1`和`WHERE 1=0`是两种特殊用法,它们在构建动态查询语句时起到关键作用。本文将详细解释这两种条件语句的作用及其应用场景。 首先,`WHERE 1=1`是一个恒为真的条件,无论何时,这个表达式都...
SQL SERVER数据导出工具SQL SERVER数据导出工具SQL SERVER数据导出工具SQL SERVER数据导出工具SQL SERVER数据导出工具SQL SERVER数据导出工具SQL SERVER数据导出工具
SQL中on条件与where条件的区别基础知识
sql中where和havingsql中where和having区别
mybatis动态sql mybatis动态sql(使用<where>标签来处理多个查询条件)
在SQL查询中,`WHERE`子句是至关重要的部分,它允许我们根据特定的条件过滤结果集。在本文中,我们将深入探讨`WHERE`子句的使用,包括条件表达式筛选、逻辑表达式筛选以及模糊查询等不同类型的筛选方法。 首先,让...
在Oracle数据库中,`WHERE`子句是SQL查询语句的一部分,用于指定查询条件,而`CASE WHEN`语句则是一种条件表达式,允许我们基于不同的条件返回不同的值。将`CASE WHEN`嵌套在`WHERE`子句中,可以实现更复杂的逻辑...
SQL(Structured Query Language)是用于管理和处理关系数据库的标准语言,它是数据存储、查询、更新和管理的核心工具。...通过不断练习和实践,你将能够熟练掌握SQL,有效地在各种数据库系统中工作。
用“多叉树”构造SQL查询中的WHERE子句——“多叉树”在VB中的实现及应用.pdf
在实际开发过程中,我们往往需要编写复杂的SQL语句,拼接稍有不注意就会导致错误,Mybatis给开发者提供了动态SQL,大大降低了拼接SQL导致的错误。 动态标签 if标签 if标签通常用那个胡where语句,update语句,insert...