Oracle DB, Oracle APEX, Linux etc.

четверг, 3 декабря 2009 г.

Oracle DB 11gR2: New features, new bugs...

Недавно наткнулся на новоприобретённый баг, появившийся в Oracle DB 11.2.0.1: MERGE позволяет обходить ограничения-проверки (CHECK CONSTRAINTS), изменяя данные.

Вот тестовый скрипт:

drop table test_merge;

create table test_merge as select 1 m, 2 n from dual;

alter table test_merge add constraint test_merge_chk check (m <= n);

update test_merge set n = m - 1;

rollback;

select * from test_merge;

merge into test_merge tgt
using (select m, m-1 n from test_merge) src
on (tgt.m = src.m)
when matched then update set tgt.n = src.n;

commit;

select * from test_merge;


И вот результат:


Таблица создана.


Таблица изменена.

update test_merge set n = m - 1
*
ошибка в строке 1:
ORA-02290: нарушено ограничение целостности CHECK(XXX.TEST_MERGE_CHK)



Откат завершен.


M N
---------- ----------
1 2


1 строка объединена.


Фиксация обновлений завершена.


M N
---------- ----------
1 0


Как оказалось, этот баг не проявляется, если указать ветку WHEN NOT MATCHED в операторе MERGE. Так что обход бага в случае, когда нужно только обновить данные, но не вставлять новые, прост:
merge into test_merge tgt 
using (select m, m-1 n from test_merge) src
on (tgt.m = src.m)
when matched then update set tgt.n = src.n
when not matched then insert (m) values(null) where 1 = 0;

Главное, чтобы никто не "соптимизировал" этот MERGE, удалив "лишнюю" ветку. ;)

Комментариев нет:

Отправить комментарий