Всем привет!
Поиском не нашёл, потому создаю тему. В Oracle DB 11gR2 наткнулся на, кмк, баг. Данные:
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;
В 11gR2:
SQL> @test.sql
Таблица создана.
Таблица изменена.
update test_merge set n = m - 1
*
ошибка в строке 1:
ORA-02290: нарушено ограничение целостности CHECK(XXX.TEST_MERGE_CHK)
Откат завершен.
M N
---------- ----------
1 2
1 строка объединена.
Фиксация обновлений завершена.
M N
---------- ----------
1 0
Это же в 11.1.0.7 и в 9.2.0.6 (с добавленной инструкцией WHEN NOT MATCHED, без которой MERGE в девятке не заработает) честно даёт ошибку:
SQL> @test.sql
Таблица создана.
Таблица изменена.
update test_merge set n = m - 1
*
ошибка в строке 1:
ORA-02290: нарушено ограничение целостности CHECK(XXX.TEST_MERGE_CHK)
Откат завершен.
M N
---------- ----------
1 2
merge into test_merge tgt
*
ошибка в строке 1:
ORA-02290: нарушено ограничение целостности CHECK(XXX.TEST_MERGE_CHK)
Фиксация обновлений завершена.
M N
---------- ----------
1 2
Если кто-то уже встречался - дайте, пожалуйста, номер бага на металинке, чтобы я сэкономил время нашим АБД. И если кто способ обойти скажет, то буду очень благодарен. Кроме как отказаться от MERGE вообще для подобной ситуации, ничего в голову не приходит. :(
-------------------------------------------------------
When I say "RTFM" or "STFF" or "STFW",
the third letter means "Following" or "Fine"...