У мене є таблиця, яка змінюється після вставки / видалення рядка. Тобто мутація полягає в тому, що при вставці в таблицю, треба перерахувати значення, що знаходяться в інших рядках. Я написав тригер, але він не працює, відбувається помилка. Проблема, як я розумію, виникає, коли в тригері рівня рядка є спроба звернутися до таблиці, яка змінюється тією ж пропозицією. У чому причини цієї помилки? І як можна її уникнути? І яким чином можна реалізувати перерахунок значень таблиці при зміні одного рядка (instert / delete)?
заданий 19 Січня '11 о 17:48
2 data3 data4 50
Ви робите insert в таблицю, наприклад:
id field1 field2 field3
1 data1 data2 30
2 data3 data4 50
3 data5 data6 70
Через вставки вам потрібно зробити update, наприклад, всіх field3:
Проблема полягає в тому, що дії ви виконуєте на залоченним таблиці (не знаю як oracle, я пишу про mysql, думаю, що в oracle теж саме), тобто дані не можуть бути оновлено, видалено або якось змінені, поки таблиця залочений. У mysql це LOCK TABLE / UNLOCK TABLE. По скільки insert за фактом ще не завершився, таблицю можна оновити, для цього можна піти іншим шляхом - зробити 2 запити, 1-й додасть, 2-й оновить. Можливо, що в oracle можна перевірити доступність на оновлення таблиці, і, наприклад, у другій потік сунути оновлення, або чекати поки таблиця не «звільниться", тим самим ставши доступною для поновлення. Сподіваюся, що хоч чимось допоміг.
відповідь дан 19 Січня '11 о 21:43
Ту Алекс Силаєв. Для того щоб прочитати дані немає необхідності блокувати дані. Оракл НЕ MySQL. Також читання не вимагає звільнення таблиці, на це є реалізована Багатоверсійність з використанням сегментів відкоту.
Зазвичай, помилка мутує таблиці вирішується двома способами:
- Тригер в автономній транзаціі, але корефеі Оракл не рекомендують його використовувати.
- І більш вірний спосіб. Відкладене обробка в тригері AFTER, як і запропонував (14 Mar 14:09) andivanov. Зберігаєте дані в масив, потім вибираєте їх.
відповідь дан 24 Серпня '11 о 15:46
Хотілося б поглянути на код вашого тригера.
Накидав невеликий прімерчік, думаю він направить вас.
відповідь дан 3 Лютого '11 об 11:26