0

ユーザーがオンライン アプリで ADDRESS テーブルを更新した後、ESTABLISHMENT テーブルの state_id フィールドの値を自動的に変更するトリガーを作成します。問題は、ユーザーがテーブル アドレスで OTHER_STATE_ID = 16 および POSTAL_STATE_ID = 16 を更新すると、テーブル ESTABLISHMENT の OTHER_STATE_ID の値がまだ古い値を保持していることです。新しい値で更新された POSTAL_STATE_ID フィールドのみ。トリガーコードを確認しましたが、奇妙なコードは何も見つかりませんでした。トリガーは、other_state_id を更新するために古い値を保持しているようです。ここにデータのシナリオがあります:-

  1. 更新前(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
  2. 更新後の値(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;
4

0 に答える 0