Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1434064
  • 博文数量: 556
  • 博客积分: 12626
  • 博客等级: 上将
  • 技术积分: 5799
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-11 15:56
个人简介

从事IT基础架构多年,发现自己原来更合适去当老师……喜欢关注新鲜事物,不仅限于IT领域。

文章分类

全部博文(556)

文章存档

2019年(6)

2018年(15)

2017年(17)

2016年(11)

2015年(2)

2014年(2)

2013年(36)

2012年(54)

2011年(100)

2010年(41)

2009年(72)

2008年(14)

2007年(82)

2006年(104)

分类: Oracle

2008-05-08 04:17:39

    好久没更新blog了,来点新鲜的东西。
    今天发现一个很奇怪的sql问题,在一个hp下9205版本的数据库中,执行下面一条语句:
UPDATE A
             SET State = '4'
             WHERE CNumber IN ( SELECT CNumber
                                      FROM b
                                     WHERE Serial = '20080508000001208868');
这里的b表中只有一条记录,而且A表中的CNumber都是唯一的,可执行这条语句后,发现A表所有数据都被更新了。随后分析一下,先把update改成select,发现确实把A所有数据都取出来了,只好单独执行
SELECT CNumber   FROM b
WHERE Serial = '20080508000001208868'
结果报错ORA-00904: "CNUMBER": invalid identifier
检查发现原来b表的相应字段叫Cnum,而不是CNumber。
我怀疑这是一个bug,显然oracle在做语句分析的时候,并不是先判断子查询是否正确,个人的感觉oracle是直接把条件看作CNumber in CNumber了才产生了这样的问题。
从这个问题的影响来看,危险性是相当大的,整张表都被改了,如果发现不及时恢复都是一件很麻烦的事情。
阅读(2081) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~