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)); ...
在探讨“SQL Where的简单判断”这一主题时,我们首先需要理解SQL(Structured Query Language,结构化查询语言)的基本概念及其在数据管理与检索中的应用。SQL是一种用于处理关系数据库的标准语言,它允许用户创建、...
在Sql Server中,参数化查询是提高查询性能和防止SQL注入攻击的有效方法之一。其中,where in和like是两个常用的查询条件,然而它们的参数化实现却不是那么简单。本文将详细介绍where in和like的参数化查询实现方法...
在SQL查询中,`WHERE`子句是至关重要的部分,它用于从数据库中筛选出满足特定条件的记录。本文将深入探讨`WHERE`条件类在SQL查询中的使用,以及如何结合`SQL_CONDITION`来构建更复杂的查询语句。 首先,我们要明白`...
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
《用“多叉树”构造SQL查询中的WHERE子句——“多叉树”在VB中的实现及应用》 在开发基于数据库的管理信息系统时,信息查询功能是必不可少的一部分。为了满足用户复杂多样的查询需求,程序员需要构建能够处理各种...
在SQL查询中,`WHERE`子句是至关重要的部分,它允许我们根据特定的条件过滤结果集。在本文中,我们将深入探讨`WHERE`子句的使用,包括条件表达式筛选、逻辑表达式筛选以及模糊查询等不同类型的筛选方法。 首先,让...
在这个过程中,库会识别并分解SQL语句的各个组成部分,如SELECT、FROM、WHERE、JOIN等子句,以及它们之间的关系。通过遍历AST,开发者可以轻松地访问和操作SQL语句中的每一个细节。 例如,如果你有一个复杂的SQL...
具体措施包括但不限于按需提取字段、规范化字段名和表名、合理使用过渡表、避免在WHERE子句中使用函数以及选择更高效的子查询方式。在实践中,还需要根据具体的业务场景和数据特点灵活运用这些技巧,以达到最佳的...
本文将深入探讨SQL中的WHERE子句和HAVING子句,这两种子句在查询语句中扮演着重要角色。 WHERE子句是SQL查询语句的基础部分,用于在检索数据时设定条件。它在SELECT语句中使用,对查询结果进行筛选,只返回满足特定...
Lambda表达式在LINQ中的应用主要体现在查询操作上,例如筛选(Where)、投影(Select)、排序(OrderBy)等。在C#中,我们可以使用`IQueryable<T>`接口的扩展方法来构建这些查询,这些方法在内部会将Lambda表达式...
在SQL查询中,`WHERE`、`GROUP BY`和`HAVING`子句都是用于数据筛选和分组的重要部分,但它们各自承担不同的任务。理解它们的用法对于编写有效的SQL查询至关重要。 首先,`WHERE`子句是SQL查询中最基本的过滤条件,...
在Oracle数据库中,`WHERE`子句是SQL查询语句的一部分,用于指定查询条件,而`CASE WHEN`语句则是一种条件表达式,允许我们基于不同的条件返回不同的值。将`CASE WHEN`嵌套在`WHERE`子句中,可以实现更复杂的逻辑...
在SQL中,表格是一个数据库内的结构,用于储存资料。表格处理是SQL的重要组成部分,包括: * 创建表格:CREATE TABLE * 删除表格:DROP TABLE * 修改表格:ALTER TABLE 进阶SQL -------- 进阶SQL是SQL的高级话题...
在 SQL Server 2008 中,如果我们要导入超大 SQL 脚本文件(超过 10MB),使用 SQL Management Studio 查询工具可能无法打开脚本文件。这时,我们可以使用 osql 工具来导入超大 SQL 脚本文件。 osql 工具的使用格式...
在IT行业中,数据库管理系统是核心组成部分,SQL Server和Oracle分别是微软和甲骨文公司推出的两款广泛应用的关系型数据库系统。在企业级应用中,有时需要在不同的数据库系统间进行数据迁移或兼容性处理,这就涉及到...
在MySQL数据库管理中,SQL查询的性能直接影响到系统的响应时间和资源消耗。通过合理的SQL优化,可以显著提高数据处理速度,降低服务器负载,提升用户体验。 ##### 1.1 优化实战 #### 策略1:尽量全值匹配 全值...
select SQL_TEXT from v$sqlarea where address = (select sql_address from v$session where sid = ***); ``` 这里的`***`代表要查询的SID值。 #### 6. 监控SQL执行情况 对于更高级的监控需求,我们还可以查看...