ORACLE После триггера обновления: устранение ошибки таблицы мутаций ORA-04091 - PullRequest
3 голосов
/ 02 августа 2011

Я пытаюсь создать триггер:

  create or replace trigger NAME_OF_TRIGGER
  after insert or update on table1
  REFERENCING OLD AS OLD NEW AS NEW
  for each row

для автоматического заполнения пары необязательных полей при обновлении / вставке в таблицу.

Для этого требуется, чтобы я использовал курсор, который выбирает из таблицы2, а также из таблицы1 (предмет триггера).

Есть ли способ избежать ошибки таблицы мутаций без использования временной таблицы значений или автономной транзакции?

1 Ответ

9 голосов
/ 02 августа 2011

"Есть ли способ избежать ошибки таблицы мутаций без использования временной таблицы значений или автономной транзакции?"

tl; др нет.


Ошибка таблицы мутаций вызвана запросом таблицы, которой принадлежит триггер, или таблиц, которые связаны связью внешнего ключа с таблицей-владельцем (по крайней мере, в более старых версиях базы данных, не уверенполучит ли оно еще).

В правильно разработанном приложении это не обязательно.Вот почему многие люди считают таблицы мутаций индикатором плохого моделирования данных.Например, мутация часто связана с недостаточной нормализацией.


Перефразируя Джейми Завински: Некоторые люди, сталкиваясь с исключением таблицы мутаций, думают: «Я знаю, я буду использовать автономные транзакции».Теперь у них две проблемы.


Иногда ошибки можно избежать, просто изменив значения: NEW в триггере BEFORE INSERT OR UPDATE или используя виртуальные столбцы.Но вам нужно будет опубликовать более подробную информацию, чтобы увидеть, применимы ли они.

Но лучший обходной путь - не нуждаться ни в каком другом.

...