SQL SERVER中错误delete语句可能误删除所有记录的BUG

sgchen 2009-05-07 09:18:49
SQL SERVER中错误delete语句可能误删除所有记录的BUG
原文摘自【http://blog.sina.com.cn/s/blog_48d560db0100des4.html】

1. 创建表a
create table a(
id int identity(1,1),
a int
)
declare @i int
set @i = 0
while @i<100
begin
insert a(a) select @i+1
set @i=@i+1
end
­
2.创建表b
create table b (
b int
)
insert b(b) values(1)
­
3.以下语句是一个错误语句,原意是删除表a中id存在于表b中b字段的记录。应该是
delete a where id in (select b from b)
但一不小心写错了,写成:delete a where id in (select id from b)
­
4.如果你认为应该有出错提示,那你就错了。你会发现执行成功,以及a表中所有的数据都被删除了。
­
可惜发到Microsoft Connect并没有人回应这个问题!
...全文
130 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
sgchen 2009-05-09
  • 打赏
  • 举报
回复
终于等到Microsoft的回复

Hi,
The behavior you are seeing is by design. In the correlated subquery, if you do not qualify column references we will first try to bind the columns to the FROM clause in the subquery and if that fails we will try to bind to the FROM clause in the outer query. This is also according to ANSI SQL specifications and works pretty much the same in other database systems too. You have to use table aliases to write queries that doesn't result in such ambiguous behavior. See the KB article below for more details.

http://support.microsoft.com/kb/298674

--
Umachandar, SQL Programmability Team

由 Microsoft 在 2009/5/8 10:54 发送

学习
sgchen 2009-05-07
  • 打赏
  • 举报
回复
我认为既然b表没有id列,就应该提示出错,即使不提示出错,也应该不删除任何记录,因为子查询的范围是空值。
如果修改一下delete a where id in (select id1 from b) ,这个语句是会提示没有字段id1。
  • 打赏
  • 举报
回复
这个不是bug吧,delete a where id in (select id from b) 这个你用到子查询,如果b表中没有id列,那么查询的是a表的id列,自然会把a表中所有的数据删掉。看看查询计划就知道了
SQLSERVER数据修复工具主要用途是从损坏的MDF文件提取用户需要的表数据误删除表数据和表对象。软件无需安装,直接运行。   使用简介: 从损坏的MDF文件提取数据 打开程序后,首先选择MDF文件的数据库版本(SQL7SQL2000  或则 SQL2005 或则 SQL2008) ,然后        1、点《open mdf file》,选择需要处理的MDF文件 2、点《user tables》,显示系统对象 ,单选《table only》 则显示用户表 3、选择需要恢复的表,点《get s e l e c ted table data》,显示该表数据 4、如果表记录超过5000,则点《next 5000rows》,继续显示该表数据 5、点《export table Script》,生成表脚本 6、点《export data》,生成表数据脚本(i n s e r t 语句)   行删除修复(用于delete from 误操作): 打开程序后,首先选择MDF文件的数据库版本(SQL7SQL2000  或则 SQL2005 或则 SQL2008),然后        1、点《open mdf file》,选择需要处理的MDF文件 2、点《user tables》,显示系统对象 ,单选《table only》 则显示用户表 3、选择需要恢复的表,点《get deleted row》,显示该表数据 4、如果表记录超过5000,则点《next 5000rows》,继续显示该表数据 5、点《export table script》,生成表脚本 5、点《export table script》,生成表脚本 6、点《export data》,生成表数据脚本(insert语句)    表删除修复: 打开程序后,首先选择MDF文件的数据库版本(SQL7SQL2000  或则 SQL2005 或则 SQL2008),然后        1、点《open mdf file》,选择需要处理的MDF文件 2、点《user tables》,显示系统对象 ,单选《table only》 则显示用户表 3、点《get droped table》,输入该表名称,系统会努力在现有MDF寻找表结构信息。如果从现有MDF找不到表结构信息,则需要从以前的含有该表的备份MDF或初始库MDF寻找该表结构信息。 4、如果表记录超过5000,则点《next 5000rows》,继续显示该表数据 5、点《export table script》,生成表脚本 6、点《export data》,生成表数据脚本(insert 语句)   鱼肠MSSQL数据库修复软件 v3.3更新内容:   修改部分bug
《mysql管理之道:性能调优、高可用与监控》由资深mysql专家撰写,以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障诊断、表设计、sql优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、mysql高可用集群搭建与管理、mysql服务器性能和服务监控等方面多角度深入讲解了如何去管理与维护mysql服务器。 书内容以实战为导向,所有内容均来自于笔者多年实践经验的总结和对新知识的拓展,同时也针对运维人员、dba等相关工作者会遇到的有代表性的疑难问题给出了实用的情景模拟,并给出了解决方案。不论你目前有没有遇到过此类问题,相信对你以后处理相关问题都会有所借鉴。本书适合所有希望构建和管理高性能、高可用性的mysql数据库系统的开发者和dba阅读。 目录 · · · · · · 前言 第一部分 mysql5.5 新特性篇 第1章 mysql5.5介绍 2 1.1 性能上的显著改变 2 1.1.1 mysql5.5默认存储引擎的调整 2 1.1.2 充分利用cpu多核的处理能力 7 1.1.3 提高刷新脏页数量和合并插入数量,改善磁盘i/o处理能力 8 1.1.4 增加自适应刷新脏页功能 9 1.1.5 让innodb_buffer_pool缓冲池的热数据存活更久 9 1.1.6 innodb的数据恢复时间加快 11 1.1.7 innodb同时支持多个bufferpool实例 15 1.1.8 可关闭自适应哈希索引 17 1.1.9 在innodb可选择使用内存分配程序 18 1.1.10 提高默认innodb线程并发数 21 1.1.11 预读算法的变化 22 1.1.12 首次在linux上实现了异步i/o 23 1.1.13 恢复组提交 24 1.1.14 innodb使用多个回滚段提升性能 26 1.1.15 改善清除程序进度 26 .1.1.16 添加删除缓冲和清除缓冲 27 1.1.17 控制自旋锁spin lock轮训间隔 28 1.1.18 快速创建、删除、更改索引 29 1.1.19 innodb支持创建压缩数据页 30 1.1.20 可动态关闭innodb更新元数据的统计功能 37 1.2 安全性、稳定性的显著改变 38 1.2.1 复制功能加强 38 1.2.2 继日志relay-log可自我修复 39 1.2.3 开启innodb严格检查模式 39 1.3 动态更改系统配置参数 39 1.3.1 支持动态更改独立表空间 39 1.3.2 支持动态更改innodb锁超时时间 40 1.4 innodb新参数汇总 40 1.5 同步复制新参数汇总 48 1.6 sql语句写法的改变 53 1.6.1 delete表连接语法改变 53 1.6.2 mysql5.5存储过程支持limit变量 54 1.7 mysql5.1升级为mysql5.5 55 1.7.1 采用mysql_upgrade升级授权表方式升级 55 1.7.2 直接安装mysql5.5,采用数据导出/导入方式升级 59 1.8 性能测试:mysql5.5与mysql5.1 60 第2章 半同步复制 62 2.1 半同步复制简介 62 2.2 半同步复制安装配置 63 2.3 参数说明 63 2.4 功能测试 64 2.4.1 如何验证半同步复制是否正常工作 64 2.4.2 半同步复制与异步复制的切换 65 2.5 性能测试 68 2.6 小结 70 第二部分 故障诊断与性能优化篇 第3章 故障诊断 72 3.1 影响mysql性能的因素 72 3.2 系统性能评估标准 73 3.2.1 影响linux服务器性能的因素 73 3.2.2 系统性能评估指标 74 3.2.3 开源监控和评估工具介绍 76 3.3 故障与处理 79 3.3.1 连接数过多导致程序连接报错的原因 79 3.3.2 记录子查询引起的宕机 84 3.3.3 诊断事务量突高的原因 87 3.3.4 谨慎设置binlog_format=mixed 90 3.3.5 未设置swap分区导致内存耗尽,主机死机 94 3.3.6 mysql故障切换之事件调度器注意事项 95 3.3.7 人工误删除innodb ibdata数据文件,如何恢复 97 3.3.8 update忘加where条件误操作恢复(模拟oracle闪回功能) 99 3.3.9 delete忘加where条件误操作恢复(模拟oracle闪回功能) 108 第4章 同步复制报错故障处理 112 4.1 最常见的3种故障 112 4.1.1 在master上删除一条记录时出现的故障 112 4.1.2 主键重复 114 4.1.3 在master上更新一条记录,而slave上却找不到 115 4.2 特殊情况:slave的继日志relay-log损坏 116 4.3 人为失误 118 4.4 避免在master上执行大事务 119 4.5 slave_exec_mode参数可自动处理同步复制错误 120 4.6 如何验证主从数据一致 121 4.7 binlog_ignore_db引起的同步复制故障 123 4.8 mysql5.5.19/20同步一个bug 124 4.9 恢复slave从机上的某几张表的简要方法  126 4.10 如何干净地清除slave同步信息 127 第5章 性能调优 129 5.1 表设计 129 5.2 字段类型的选取 133 5.2.1 数值类型 134 5.2.2 字符类型 139 5.2.3 时间类型 141 5.2.4 小技巧:快速修改表结构 148 5.2.5 pt-online-schema-change在线更改表结构 152 5.2.6 mysql5.6在线ddl更改表测试 158 5.3 采用合适的锁机制 161 5.3.1 表锁的演示 161 5.3.2 行锁的演示 164 5.3.3 innodb引擎与myisam引擎的性能对比 166 5.4 选择合适的事务隔离级别 168 5.4.1 事务的概念 168 5.4.2 事务的实现 169 5.4.3 事务隔离级别介绍 171 5.5 sql优化与合理利用索引 177 5.5.1 如何定位执行很慢的sql语句 177 5.5.2 sql优化案例分析 178 5.5.3 合理使用索引 188 5.6 my.cnf配置文件调优 198 5.6.1 per_thread_buffers优化 198 5.6.2 global_buffers优化 200 5.6.3 query cache在不同环境下的使用 201 5.6.4 tuning-primer.sh性能调试工具的使用 205 5.6.5 72 gb内存的my.cnf配置文件 208 5.6.6 谨慎使用分区表功能 211 5.7 mysql5.6同步复制新特性详解 213 第6章 备份与恢复 223 6.1 冷备份 224 6.2 逻辑备份 224 6.2.1 mysqldump增加了一个重要参数 225 6.2.2 取代mysqldump的新工具mydumper 226 6.2.3 逻辑备份全量、增量备份脚本 229 6.3 热备份与恢复 230 第三部分 高可用集群管理篇 第7章 目前流行的4种高可用架构 236 7.1 采用mysql自带的replication架构 237 7.1.1 keepalived+mysql replication架构的搭建演示 237 7.1.2 mmm+mysql replication架构的搭建演示 241 7.2 heartbeat+drbd+mysql架构的搭建演示 249 7.3 红帽rhcs共享存储架构的搭建演示 254 7.3.1 安装过程 257 7.3.2 红帽rhcs集群的维护 265 7.4 mysql高可用集群ha解决方案的测试评估 267 第8章 批量管理服务器 270 8.1 开源工具pssh的使用方法 270 8.2 自己编写的ssh服务器批量管理工具 273 第四部分 监控篇 第9章 性能监控 278 第10章 服务监控 283 10.1 nagios搭建与维护 283 10.2 mysql数据库的监控脚本 288 第五部分 项目案例 第11章 项目案例讲解 292 11.1 数据碎片整理方案 292 11.2 用户信息表水平拆表方案 296 11.3 阿里巴巴间件cobar水平拆表方案 299

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧