2011-08-11 19 views
1

IDPARENT_IDのテーブルがあるとします。Oracle:ツリー更新トリガー

"更新中"トリガーを作成したいので、IDが更新されるたびにIDを指すPARENT_IDが更新されます。

しかし、これでわかる主な問題は、Oracleでは、トリガーが現在実行中のテーブルから選択することを許可していないと考えていることです。

"更新"コードをPL/SQL関数でラップすることができますが、SQLだけでこのデータをより快適に操作できるユーザーがいます。

ユーザーが多くのPL/SQLを呼び出すことなく強制的に実行するにはどうすればいいですか(PL/SQLで実装するのはうれしいです。 。

答えて

1

テーブルのビューをベースにして、instead ofトリガーを使用してビューを更新可能にすることで、これを実現しました。これは、トリガーの代わりに、idparent_idの適切な更新を実行しました。

1

トリガーにネストされたPL/SQLでさえ、ここで突然変異が発生します。

正規化の問題のようです。なぜあなたは別の行を更新する必要がありますか?私はあなたが維持しているその価値を見て、それを別のテーブルに移動することをお勧めします...

時々正当な突然変異を回避するために必ずしも推奨される方法はありません... PRAGMA AUTONOMOUS_TRANSACTION - 私はそれを残すでしょうあなたはそれを見て:

+0

+1は、技術的には正規化の問題ではなく、代わりにサロゲートの代わりに自然なキーを選択する問題を除いて、合意しました。 –

1

あなたはパッケージと2つのトリガーが必要です。

最初のトリガーはafter update for each rowです。それは、パッケージのグローバル変数で更新されたIDを保存します。

2番目のトリガーはafter update trigger (without for each row)です。このトリガーは、パッケージのグローバル変数からIDのparent_idを更新できます

+0

同意します。 2つの異なるセッションが同じ親の2つの異なる子レコードを同時に更新する場合、並行性の問題について考えることを忘れないでください。 –