0

Oracleのテーブルの変更に問題があります。2つのテーブルがCustomerありPersonます。行の変更中に更新ChangeDateする必要があるため、トリガーを作成しました。残念ながら、場合によっては更新されるトリガーがあり、それがテーブルの変更の問題を引き起こしています。幸い、この変更が変更によるものである場合は、更新時に更新する必要はありません。CustomerPersonCustomerPersonCustomer.ChangeDatePersonCustomer

Personだからここに私の質問があります:トリガーがトリガーによって起動されたことをどのように認識できCustomerますか?

4

3 に答える 3

4

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

この状況を解決する適切な方法は、データモデルを整理することです。CUSTOMERはPERSONのサブタイプですか、それともその逆ですか?どちらが親でどちらが子であるかを判別し、情報が一方向(おそらくスーパータイプからサブタイプ)にのみ流れるようにします。より良い解決策は、データ伝播を完全に削除することですが。

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

于 2012-02-17T12:53:21.647 に答える
0

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

データモデルの修正について交渉できなかった時期を思い出して、少し妥協します。このような場合、一方のトリガーのパッケージ内の変数を使用して、もう一方のトリガーに信号を送ることができます。

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

最後に、本当のハッカーのように感じている場合は、PL / SQLコールスタックに問い合わせて、そこで他のトリガーを探すことができます。

于 2012-02-17T14:12:07.807 に答える
0

最後にglobal temporary table、コミット後のクリアに慣れています。

CREATE GLOBAL TEMPORARY TABLE my_temp_table (
  column1  NUMBER,
  column2  NUMBER
) ON COMMIT DELETE ROWS;
于 2012-02-22T14:00:08.220 に答える