2012-02-17 20 views
0

Oracleの突然変異テーブルに問題があります。私は2つのテーブル、CustomerPersonを持っています。 Person行の変更中にChangeDateCustomerに更新する必要があるため、トリガーを作成しました。残念ながらCustomerにトリガがあり、Personが更新され、テーブルの変更に問題が発生していることがあります。この変更がCustomerの変更によって発生した場合は、Personを更新するときにCustomer.ChangeDateを更新する必要はありません。トリガのクラッシュ - テーブルの突然変異

ここに私の質問があります:CustomerトリガーによってPersonトリガーが発生したことを確認するにはどうすればよいですか?

+0

は 'customer'は*だけ*' changedate'が変更された場合を含めperson' '更新する必要があり「いくつかの例」を行います'人物 'が直接更新された場合のように見えますか?トリガーと両方のテーブルの構造の両方のコードを投稿すると役に立ちます。 –

+0

こんにちはアレックス、残念ながら、月曜日まで私はトリガのコードを貼り付けることができませんが、私は知っている '変更された'のみが変更されている場合、 '人 'は更新されていません。 –

答えて

0
最後に

私は、コミット後にクリアするとglobal temporary tableを使用しています:

CREATE GLOBAL TEMPORARY TABLE my_temp_table (
    column1 NUMBER, 
    column2 NUMBER 
) ON COMMIT DELETE ROWS; 
4

突然変異テーブルエラーは、ほとんどの場合、データモデルまたは関連するビジネスプロセスに問題があることを示しています。最も一般的な原因は、非正規化です。つまり、あるテーブルのデータが別のテーブルに複製されます。それはここのケースにあるようです - あなたのCUSTOMERテーブルはPERSONという別のテーブルに関するメタデータを保持しています。それだけが、他の方向の情報のカスケードによって複合化されます。

この状況を解決する適切な方法は、データモデルを整理することです。顧客はPERSONのサブタイプですか、それとも逆のですか?親と子供のどちらを決定し、おそらくスーパータイプからサブタイプに情報が一方向に流れることを確認してください。よりよい解決策は、データの伝播を完全に取り除くことです。

回避策がありますが、変更を適用するためのパッケージやその他の工夫が必要です。

0

@APCは完全に正しいです。

私はデータモデルの修正を交渉することができなかった時代を覚えて少し妥協するでしょう。そのような場合は、あるトリガーのパッケージ内の変数を使用して、他のトリガーに信号を送ることができます。

トリガー実行句にWHEN条件を入れることもできます。

最後に、実際のハッカーのような気がする場合は、PL/SQLコール・スタックを調べて、そこに他のトリガーがないか調べることができます。