好久没更新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了才产生了这样的问题。
从这个问题的影响来看,危险性是相当大的,整张表都被改了,如果发现不及时恢复都是一件很麻烦的事情。
阅读(2071) | 评论(0) | 转发(0) |