Які причини та рішення мутування помилок таблиці?


12

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

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

Що саме викликає мутаційні помилки таблиці та як би наша DBA виправила проблему?

Відповіді:


17

Найбільш вірогідною причиною помилки мутуючої таблиці є неправильне використання тригерів. Ось типовий приклад:

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

Це очікувана і нормальна поведінка, Oracle хоче захистити вас від себе, оскільки Oracle гарантує:

  • (i) що кожне твердження є атомним (тобто буде або невдалим, або успішним повністю)
  • (ii) що кожне твердження бачить послідовний вигляд даних

Швидше за все, коли ви пишете подібний тригер, ви очікуєте, що запит (2) побачить рядок, вставлений на (1). Це суперечить обом пунктам вище, оскільки оновлення ще не завершено (може бути вставлено більше рядків).

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

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

Якщо я підозрюю, що причина мутаційної помилки таблиці - це тригер, одним із способів уникнути помилки є переміщення логіки з тригера в процедури.


9

Таблиця, що мутує, виникає, коли оператор викликає активацію тригера, і цей тригер посилається на таблицю, яка викликала тригер. Найкращий спосіб уникнути подібних проблем - це не використовувати тригери, але я підозрюю, що DBA не встигнути зробити це. Він міг зробити одне з наступних:


1
Принаймні для мене, зміна на тригер не вдається 11.2.0.4.0
Software Prophets

Також для мене; версія 12.1.0.2.0, а ПІСЛЯ не працює.
ейдилон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.