`
trydofor
  • 浏览: 150546 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

SQL不慎迷失在WHERE

阅读更多
SQL不慎迷失在WHERE
作者:臭豆腐[trydofor.com]
日期:2009-11-21
授权:署名-非商业-保持一致 1.0 协议
声明:拷贝、分发、呈现和表演本作品,请保留以上全部信息。

 

文档目录
1. 灾难回顾
出于各种业务需要,项目经常使用SQL手工维护数据。
5个年头里,大概有过4次刻骨铭心的WHERE灾难。

所谓灾难,一般具有以下一些特征。
  • 影响了正式生产环境。
  • 破坏了百万级或千万级的记录。
  • 数据关系复杂,极难还原。
  • 几人日的工作或通宵才能恢复。

造成灾难的原因都十分低级,十分低概率,不经历过也许不会相信,
也许再仔细那么一点点,也许再慢那么一小会儿,就完全可以避免。
但事实是,人是会在某些时候短路,犯不可能的低级错误的。

2. 防范措施
正确完成一个操作,我们需要把正确的SQL执行在正确的数据库上。
取其反,结果可能就是一个灾难。

两类错误,
  • 错误的服务器
  • 错误的但可执行的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. 补救套路
在既有的容灾策略上,减少或消除不良影响,基本套路有,

  • 基于备份回到过去。
  • 根据履历从头再来。
  • 回到过去并从头再来。

操作上,
首先,要冷静,权当在做梦,虚惊一场。
一般发生这事,相关人员会出汗,发热,而发热的头脑只能导致更发热的事故。

然后,回顾细节和确定影响,及时沟通和上报。
三个臭皮匠顶个诸葛亮,纯客观的一五一十的把事情说清楚,以便决策。

最后,确定补救策略和实施细节。
考虑到各种情况和对策,并在实施前,逐条重述一边。

关键一点,整个过程全部精力锁定在如何补救上,不得追究责任或评估后果。
2
0
分享到:
评论

相关推荐

    SQL WHERE 条件解析器

    在实际应用中,`SQL WHERE 条件解析器`通常与前端界面结合,用户可以通过界面上的控件设置查询条件,后端服务接收到这些条件后,通过解析器生成相应的SQL查询,从而返回符合用户需求的数据。 总结来说,`SQL WHERE ...

    动态拼接sql语句工具类,拼接where后面语句

    动态拼接sql语句工具类,拼接where后面语句 配合原生jdbc仿动态sql注入 if (ObjectUtil.isNotEmpty(maxLat)&&ObjectUtil.isNotEmpty(minLat)){ sqlParamList.add(new SqlParam("lat",minLat, SqlOpEnum.GE)); ...

    sqlserver的存储过程与 where in 多值参数

    本文将探讨在SQL Server中,存储过程与`WHERE IN`子句结合使用时,处理多值参数的几种方法。 **方法一:拼接SQL字符串并调用`EXEC`** 这是最简单也是最直观的方法。你可以在存储过程中接收一个包含多个值的参数,...

    SQL Where的简单判断

    在探讨“SQL Where的简单判断”这一主题时,我们首先需要理解SQL(Structured Query Language,结构化查询语言)的基本概念及其在数据管理与检索中的应用。SQL是一种用于处理关系数据库的标准语言,它允许用户创建、...

    Sql Server参数化查询之where in和like实现详解

    在Sql Server中,参数化查询是提高查询性能和防止SQL注入攻击的有效方法之一。其中,where in和like是两个常用的查询条件,然而它们的参数化实现却不是那么简单。本文将详细介绍where in和like的参数化查询实现方法...

    Golang sqlx 使用sql语句 Where in 解决办法

    方法1、使用语言的for语句循环生成SQL语句中的“?”,类似这样: 新建方法 func placeholders(n int) string { var b strings.Builder for i := 0; i 0 { b.WriteString("?") } return b.String() }  调用...

    SQL_CONDITION.rar_condition sql_condition sql_sql where conditi

    在SQL查询中,`WHERE`子句是至关重要的部分,它用于从数据库中筛选出满足特定条件的记录。本文将深入探讨`WHERE`条件类在SQL查询中的使用,以及如何结合`SQL_CONDITION`来构建更复杂的查询语句。 首先,我们要明白`...

    SQL 语句中 where 条件后 写上 1=1 是什么意思!.doc

    SQL 语句中 where 条件后 写上 1=1 是什么意思!.doc

    SQL SERVER数据导出工具可以根据WHERE条件导出数据

    SQL SERVER数据导出工具SQL SERVER数据导出工具SQL SERVER数据导出工具SQL SERVER数据导出工具SQL SERVER数据导出工具SQL SERVER数据导出工具SQL SERVER数据导出工具

    mybatis动态sql(使用<where>标签来处理多个查询条件)

    - `&lt;where&gt;` 标签则确保在没有满足任何条件的情况下,SQL语句不会以“WHERE”开头,同时会自动移除多余的“AND”。 #### 四、其他动态SQL标签 除了`&lt;where&gt;`标签之外,MyBatis还提供了其他一些有用的动态SQL标签,...

    用“多叉树”构造SQL查询中的WHERE子句——“多叉树”在VB中的实现及应用.pdf

    《用“多叉树”构造SQL查询中的WHERE子句——“多叉树”在VB中的实现及应用》 在开发基于数据库的管理信息系统时,信息查询功能是必不可少的一部分。为了满足用户复杂多样的查询需求,程序员需要构建能够处理各种...

    SQL语句之条件查询-WHERE(where).docx

    在SQL查询中,`WHERE`子句是至关重要的部分,它允许我们根据特定的条件过滤结果集。在本文中,我们将深入探讨`WHERE`子句的使用,包括条件表达式筛选、逻辑表达式筛选以及模糊查询等不同类型的筛选方法。 首先,让...

    java的sql解析器jsqlparser

    在这个过程中,库会识别并分解SQL语句的各个组成部分,如SELECT、FROM、WHERE、JOIN等子句,以及它们之间的关系。通过遍历AST,开发者可以轻松地访问和操作SQL语句中的每一个细节。 例如,如果你有一个复杂的SQL...

    jsqlparser解析复杂sql

    jsqlparser解析复杂sql 获取where条件字段 select字段 表名table 查询join 查询 group by 查询order by 子查询 判断是否为多级子查询

    SQL Server数据库性能优化之SQL语句篇

    具体措施包括但不限于按需提取字段、规范化字段名和表名、合理使用过渡表、避免在WHERE子句中使用函数以及选择更高效的子查询方式。在实践中,还需要根据具体的业务场景和数据特点灵活运用这些技巧,以达到最佳的...

    详析SQL语言的WHERE子句与HAVING子句.pdf

    本文将深入探讨SQL中的WHERE子句和HAVING子句,这两种子句在查询语句中扮演着重要角色。 WHERE子句是SQL查询语句的基础部分,用于在检索数据时设定条件。它在SELECT语句中使用,对查询结果进行筛选,只返回满足特定...

    SQL_where_1=1的用法

    通过在动态SQL查询语句中添加 `WHERE 1=1`,可以确保无论用户是否提供了具体的搜索条件,查询语句总是合法且可执行的。这是一种简单但实用的方法,有助于提高代码的健壮性和灵活性。此外,`WHERE 1=0` 也可以作为一...

    C#将Lambda表达式转成Sql语句

    Lambda表达式在LINQ中的应用主要体现在查询操作上,例如筛选(Where)、投影(Select)、排序(OrderBy)等。在C#中,我们可以使用`IQueryable&lt;T&gt;`接口的扩展方法来构建这些查询,这些方法在内部会将Lambda表达式...

    sql中的 where 、group by 和 having 用法解析

    在SQL查询中,`WHERE`、`GROUP BY`和`HAVING`子句都是用于数据筛选和分组的重要部分,但它们各自承担不同的任务。理解它们的用法对于编写有效的SQL查询至关重要。 首先,`WHERE`子句是SQL查询中最基本的过滤条件,...

    oracle where case when where后面跟case when

    在Oracle数据库中,`WHERE`子句是SQL查询语句的一部分,用于指定查询条件,而`CASE WHEN`语句则是一种条件表达式,允许我们基于不同的条件返回不同的值。将`CASE WHEN`嵌套在`WHERE`子句中,可以实现更复杂的逻辑...

Global site tag (gtag.js) - Google Analytics