Мои таблицы:
TableA (id number, state number)
TableB (id number, tableAId number, state number)
TableC (id number, tableBId number, state number)
Таким образом, элементы в TableC являются дочерними элементами TableB, а элементы в TableB являются дочерними элементами TableA. И наоборот - элементы в таблице А являются родителями таблицы В, а элементы в таблице В являются родителями таблицы С.
Я бы хотел контролировать состояние родительских элементов ... скажем, например, что у нас есть эти данные:
TableA (id, state):
1, 40
TableB (id, tableAId, state):
1, 1, 40
2, 1, 60
TableC (id, tableBId, state):
1, 1, 40
2, 1, 50
3, 2, 60
4, 2, 70
Родительский штат должен всегда иметь малейшее состояние его детей. Так что, если мы сейчас обновим TableC следующим образом:
update TableC set state = 50 where Id = 1;
мой триггер должен автоматически обновить TableB (установить состояние = 50, где id = 1), а затем обновить также TableA (установить состояние = 50, где id = 1)
Я хотел бы сделать это с помощью триггеров (AFTER UPDATE, INSERT, DELETE, для TableA, TableB, TableC), чтобы после каждого действия выполнялись следующие шаги:
- получить идентификатор родителя
- найти наименьшее состояние из всех дочерних элементов текущего родителя
- если наименьшее из всех дочерних состояний больше, чем родительское, обновите родительский
Как мне избежать "ошибки таблицы мутаций"? Сохраняется ли использование автономных транзакций в этом примере? Я видел некоторые мнения, что ошибка таблицы мутаций указывает на недостатки в логике приложения - так ли это и как я могу изменить свою логику, чтобы предотвратить эту ошибку?
Спасибо
EDIT:
Спасибо за отличные ответы!
В конце концов, я использовал триггеры (спасибо Винсенту Малграту, который указал на статью Тома Кайта).
EDIT:
В РЕАЛЬНОМ КОНЦЕ я использовал хранимые процедуры и удалил триггеры:)