ユーザーがオンライン アプリで ADDRESS テーブルを更新した後、ESTABLISHMENT テーブルの state_id フィールドの値を自動的に変更するトリガーを作成します。問題は、ユーザーがテーブル アドレスで OTHER_STATE_ID = 16 および POSTAL_STATE_ID = 16 を更新すると、テーブル ESTABLISHMENT の OTHER_STATE_ID の値がまだ古い値を保持していることです。新しい値で更新された POSTAL_STATE_ID フィールドのみ。トリガーコードを確認しましたが、奇妙なコードは何も見つかりませんでした。トリガーは、other_state_id を更新するために古い値を保持しているようです。ここにデータのシナリオがあります:-
更新前(ADDRESSテーブル)
- ADDRESS_TYPE = 1 の場合、値 LOCATION_STATE_ID = 8
- ADDRESS_TYPE = 2 の場合、値 POSTAL_STATE_ID = 8
- ADDRESS_TYPE = 11 の場合、値 OTHER_STATE_ID = 8
トリガー前 (ESTABLISHMENT テーブル)
- 値 LOCATION_STATE_ID = 8
- 値 POSTAL_STATE_ID = 8
- 値 OTHER_STATE_ID = 8
更新後の値(ADDRESS テーブル)
- ユーザー更新値 LOCATION_STATE_ID = 8
- ADDRESS_TYPE = 2 の場合、値 POSTAL_STATE_ID = 16
- ADDRESS_TYPE = 11 の場合、値 OTHER_STATE_ID = 16
トリガー後 (ESTABLISHMENT テーブル)
- 値 LOCATION_STATE_ID = 8
- 値 POSTAL_STATE_ID = 16
- 値 OTHER_STATE_ID = 8
このコード行で奇妙なことが起こるかもしれません。誰..?
以下のように完全なコード
create or replace TRIGGER "TR_ADDRESS_EE" AFTER INSERT OR UPDATE ON ADDRESS FOR EACH ROW BEGIN IF INSERTING THEN IF (:NEW.STATE_ID IS NOT NULL) THEN IF (:NEW.RECORD_TYPE_ID = 401) THEN IF (:NEW.ADDRESS_TYPE = 1) THEN UPDATE ESTABLISHMENT SET LOCATION_STATE_ID = :NEW.STATE_ID WHERE ESTABLISHMENT_ID = :NEW.RECORD_ID; ELSIF (:NEW.ADDRESS_TYPE = 2) THEN UPDATE ESTABLISHMENT SET POSTAL_STATE_ID = :NEW.STATE_ID WHERE ESTABLISHMENT_ID = :NEW.RECORD_ID; ELSIF (:NEW.ADDRESS_TYPE = 11) THEN UPDATE ESTABLISHMENT SET OTHER_STATE_ID = :NEW.STATE_ID WHERE ESTABLISHMENT_ID = :NEW.RECORD_ID; END IF; END IF; END IF; ELSIF UPDATING ('STATE_ID') THEN IF (:OLD.RECORD_TYPE_ID = 401 AND :NEW.STATE_ID <> :OLD.STATE_ID) THEN IF (:NEW.ADDRESS_TYPE = 1) THEN UPDATE ESTABLISHMENT SET LOCATION_STATE_ID = :NEW.STATE_ID WHERE ESTABLISHMENT_ID = :OLD.RECORD_ID; ELSIF (:NEW.ADDRESS_TYPE = 2) THEN UPDATE ESTABLISHMENT SET POSTAL_STATE_ID = :NEW.STATE_ID WHERE ESTABLISHMENT_ID = :OLD.RECORD_ID; ELSIF (:NEW.ADDRESS_TYPE = 11) THEN UPDATE ESTABLISHMENT SET OTHER_STATE_ID = :NEW.STATE_ID WHERE ESTABLISHMENT_ID = :OLD.RECORD_ID; END IF; END IF; END IF; END;