刚才打开google reader的时候,突然看到一篇文章,让俺大吃一惊呀。详细内容如下:
请谨慎注意这一微软SQLBug
刚来博客园,有什么不对,需要改进的地方,欢迎各位同道指出来,谢谢。
今天在使用数据库时出现意外操作,将一张表的数据删除了。仔细查看SQL语句,发现问题。将问题类推到Northwind中。我们使用两个表,Employees和Products
SQL语句如下:
select * from Products where CategoryID in (select CategoryID from Employees)
不看表结构是看不出什么问题的,不清楚的看一下表结构。执行上面的SQL语句,你将能看到所有的产品记录。
当你执行上面语句的"select CategoryID from Employees",将会提示一个错误提示:
消息 207,级别 16,状态 3,第 1 行
列名 'CategoryID' 无效。
表Employees中根本就没有CategoryID列,而微软忽略了括号中的错误,执行前面的语句。如果是应用在删除,更新,那后果将是不可现象的。我曾为此付出了代价。
这个应该就是微软SQL的BUG吧,我们需要特别注意。
在SQL2000企业管理器,SQL2000的查询分析器,SQL2005的Management Studio Express中均有此Bug。
然后有人回复为:
我在Sql2000上测试,确实有这个问题。
有意思的问题,在我的management studio里面查询,也会有这个问题,要好好地研究一下。
Microsoft SQL Server Management Studio 9.00.1399.00
有楼主说的问题!
确实应该注意一下。
看了表结构才知道,Employees 表里面没有 CategoryID字段。为什么不报错呢。错误被吃掉了。
select * from Products where CategoryID in (select CategoryID from Employees)
select * from Products where CategoryID in (select EmployeeID from Employees)
我比较了一下这两个语句的执行计划,不完全一样。建议lz分析一下执行计划。
因为我还不能完全看懂执行计划。只能看出来两个执行计划是不一样的。呵呵。
在MYSQL里没有试会不会遇到这种情况,我用navicat试是没有这种情况的。不知道其他的会不会有。
联想起以前写CRUD之类的东西时候,在过滤条件时,自动将空值直接unset掉,然后再拼成SQL,后来被BOBBY严厉批评了一下,确实,查询的时候感觉不出有什么问题,可如果是在UPDATE或者是DELETE的时候呢?本来是有条件的,可突然被unset掉成为没有条件了,那岂不是很恐怖?
借这个机会再次提醒自己,细心、周全、小心

评论 (0)
暂无评论