私のテーブル:
TableA (id number, state number)
TableB (id number, tableAId number, state number)
TableC (id number, tableBId number, state number)
したがって、TableC の項目は TableB の子であり、TableB の項目は TableA の子です。その逆 - TableA の項目は TableB の親であり、TableB の項目は TableC の親です。
親アイテムの状態を制御したい...たとえば、次のデータがあるとしましょう:
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 を更新し (id = 1 の状態 = 50 に設定)、次に TableA (id = 1 の状態に状態 = 50 を設定) も更新する必要があります。
これをトリガー (AFTER UPDATE、INSERT、DELETE、TableA、TableB、TableC で) で行いたいので、すべてのアクションの後にこの手順が実行されます。
- 親IDを取得する
- 現在の親のすべての子から最小の状態を見つける
- すべての子の最小状態が親の状態より大きい場合、親を更新します
「変更テーブルエラー」を回避するにはどうすればよいですか? この例で自律型トランザクションを使用しても問題ないでしょうか? テーブルの変更エラーはアプリケーションのロジックに欠陥があることを示しているという意見をいくつか見ましたが、これは本当ですか?また、このエラーを防ぐためにロジックを変更するにはどうすればよいですか?
ありがとう
編集:すべてのすばらしい答えをありがとう!
最後に、トリガーを使用しました (Tom Kyte の記事を指摘してくれた Vincent Malgrat に感謝します)。
EDIT:REAL ENDでは、ストアドプロシージャを使用し、トリガーを削除しました:)