Каковы причины и способы устранения ошибок таблицы?

12

Я понимаю, что ошибки таблицы мутаций вызваны недостатком дизайна или проблемным запросом.

Недавно был запущен старый запрос, который выдает ошибку таблицы мутаций. Наш DBA решил проблему, но мы не знаем как.

Что именно приводит к ошибкам изменяющейся таблицы и как наш администратор БД решит проблему?

Пармананд
источник

Ответы:

17

Наиболее вероятной причиной ошибки таблицы мутаций является неправильное использование триггеров. Вот типичный пример:

  1. Вы вставляете строку в таблицу A
  2. триггер для таблицы A (для каждой строки) выполняет запрос к таблице A, например, для вычисления итогового столбца
  3. Oracle выдает ORA-04091: таблица A мутирует, триггер / функция может ее не видеть

Это ожидаемое и нормальное поведение, Oracle хочет защитить вас от себя, поскольку Oracle гарантирует:

  • (i) что каждое утверждение является атомарным (то есть либо потерпит неудачу, либо завершится успешно)
  • (ii) что каждое утверждение видит последовательное представление данных

Скорее всего, когда вы напишите триггер такого типа, вы ожидаете, что запрос (2) увидит строку, вставленную в (1). Это противоречило бы обоим пунктам выше, поскольку обновление еще не закончено (может быть добавлено больше строк).

Oracle может вернуть результат в соответствии с моментом времени непосредственно перед началом оператора, но из большинства примеров, которые я видел, пытаясь реализовать эту логику, люди рассматривают многострочный оператор как серию последовательных шагов и ожидают, что оператор [2], чтобы увидеть изменения, сделанные в предыдущих шагах. Oracle не может вернуть ожидаемый результат и поэтому выдает ошибку.

Для дальнейшего чтения: «Стол для мутаций» на Ask Tom .

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

Винсент Малграт
источник
9

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

Ли Риффель
источник
1
По крайней мере для меня, изменение после триггера не удается на 11.2.0.4.0
Software Prophets
Также для меня; версия 12.1.0.2.0, а ПОСЛЕ не работает.
Eidylon