Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 _несистематический_ ORA-02291: integrity constraint  [new]
ORAngutang
Member

Откуда:
Сообщений: 1755
есть циклический инсерт в две таблички Parent-Сhild, у Сhild стандартный FK(ParentId) na ParentTbl.id, not defferable, c обычным btree-индексом. Таблички обычные (heap). Вообщем всё без каких-либо прибамбасов. (версия нашего Оракля стоит внизу)
(вставка в ParentTbl всегда успешна, новое id берется в триггере из секвенции, lNextFkId - выводил-проверял)

declare
  ...
begin
  for Cur in (
    select ComeFieldIds.... from SomeSourceTbl 
     where id in ( 212875,196323,192719 ...)
     order by id      
  ) loop  --//20 times or something...
    lCnt := lCnt + 1;
    insert into ParentTbl ( FieldsM...) values ( ValuesM... ) returning id into lNextFkId;
    --dbms_lock.sleep(1);
    insert into ChildTbl ( ParentId, FieldsC... ) values ( lNextFkId, , ValuesM...);
  end loop
end;  


так вот, НЕ СИСТЕМАТИЧНО получаю на РАЗНЫХ итерациях цикла ( lCnt !)

ORA-02291: integrity constraint FK_ParentId violated - parent key not found.

что за фигня!? Даже если коммита не было после вставки в родит.таблицу - он же уже должен валидировать констрейнт при вставке в "дочку" Или "должен да не обязан"(=bug)? Или "в консерватории что-то подправить"(=я че то ещё недоучил в матчасти)?
Индекс ребилдил, констрейнтс пересоздавал - не помогает. Причем происходит на разных инстанцах даже. И даже при однократной вставке тоже (народ говорит замечал бывало)....

Кто с таким сталкивался?

____________________________________________________________
сейчас работаю на: Oracle 11.2.0.2.0, 64bit, standard edition, OU-Linux.
6 ноя 12, 18:54    [13428831]     Ответить | Цитировать Сообщить модератору
 Re: _несистематический_ ORA-02291: integrity constraint  [new]
Некстфк
Guest
ORAngutang,

Эксепшен секцию добавь и в ней выведи в автономной транзакции в табличку ошибок lNextFKId
И
Select count(*) from parent where pk = lnextFKId

Может и прояснится. Ну или trigger on error.

В триггере ошибки ловятся ?
7 ноя 12, 02:39    [13430175]     Ответить | Цитировать Сообщить модератору
 Re: _несистематический_ ORA-02291: integrity constraint  [new]
ора_гугу
Guest
ORAngutang,

Поищи на металинке в "Bug Database" по ключевым словам "ORA-02291 insert". Среди 285 багов, думаю, найдешь что-то похожее.
Есть даже заголовок, аналогичный твоему: "Bug 12621675 : INSERT FAILS WITH UNEXPECTED ORA-02291: INTEGRITY CONSTRAINT VIOLATED".
Хотя и случай несколько иной зато версия именно 11.2.0.2.

Если облом обращаться в поддержку, то просто приведи детальный скрипт для воспроизведения а не псевдокод, и здесь поставят диагноз.
7 ноя 12, 03:26    [13430216]     Ответить | Цитировать Сообщить модератору
 Re: _несистематический_ ORA-02291: integrity constraint  [new]
ORAngutang
Member

Откуда:
Сообщений: 1755
Некстфк
ORAngutang,

Эксепшен секцию добавь и в ней выведи в автономной транзакции в табличку ошибок lNextFKId
И
Select count(*) from parent where pk = lnextFKId

Может и прояснится. Ну или trigger on error.

В триггере ошибки ловятся ?


Cделал. И count(*) всегда возвращает 1 !!! Без исключений. Т.е. это сам констрейнт таки _периодически_ бредит! (обычно 2-3 раза на цикл из 50 повторений).
P.S. Офигеть!
7 ноя 12, 12:58    [13432361]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить