Обновление триггера не срабатывает в oracle - PullRequest
0 голосов
/ 02 апреля 2020

Привет, у меня есть этот существующий триггер, и я в этом новичок, поэтому в моем тригере мне нужно захватить вставку, обновить и удалить, но, похоже, единственная работа - это вставка.

CREATE OR REPLACE TRIGGER ATCB_TCM_SAP."TRI_PM_TBLIF240"
AFTER INSERT ON ATCB_TCM_SAP.PM_TBLIF240_TMP FOR EACH ROW
DECLARE
 updating_key_fields EXCEPTION;
BEGIN
IF INSERTING THEN
  INSERT INTO PM_TBLIF240 VALUES (
  :NEW.MSGID,
  :NEW.WERKS,
  :NEW.EQUNR,
  :NEW.MPTYPE,
  :NEW.DATE_,
  :NEW.TIME,
  :NEW.RECDC,
  :NEW.IDIFF,
  :NEW.READR,
  :NEW.IIND,
  :NEW.QMART
  );
END IF;
IF UPDATING THEN
        IF UPDATING('MSGID') THEN
            RAISE updating_key_fields;
        END IF;
  INSERT INTO PM_TBLIF240 VALUES (
  :OLD.MSGID,
  :OLD.WERKS,
  :OLD.EQUNR,
  :OLD.QMART,
  :OLD.MPTYPE,
  :OLD.RECDC,
  :OLD.IDIFF,
  :OLD.READR,
  :OLD.IIND,
  :OLD.DATE_,
  :OLD.TIME
  );
END IF;
IF DELETING THEN
 INSERT INTO PM_TBLIF240 VALUES (
  :OLD.MSGID,
  :OLD.WERKS,
  :OLD.EQUNR,
  :OLD.QMART,
  :OLD.MPTYPE,
  :OLD.RECDC,
  :OLD.IDIFF,
  :OLD.READR,
  :OLD.IIND,
  :OLD.DATE_,
  :OLD.TIME
  );
END IF;
 EXCEPTION
        WHEN updating_key_fields THEN
            raise_application_error(-20300, 'ActiveDB Error: cannot update key fields of source table.');
END;

Я пробовал это на uodating

IF UPDATING THEN
        IF UPDATING('MSGID') THEN
            RAISE updating_key_fields;
        END IF;
  INSERT INTO PM_TBLIF240 VALUES (
  :OLD.MSGID,
  :NEW.WERKS,
  :NEW.EQUNR,
  :NEW.MPTYPE,
  :NEW.DATE_,
  :NEW.TIME,
  :NEW.RECDC,
  :NEW.IDIFF,
  :NEW.READR,
  :NEW.IIND,
  :NEW.QMART
  );
END IF;

, но все равно не повезло. Я пытаюсь изменить время в таблице 1, но не влияет на таблицу 2. Надеюсь, что кто-нибудь поможет мне с этим.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Посмотрите на эту вторую строку:

CREATE OR REPLACE TRIGGER ATCB_TCM_SAP."TRI_PM_TBLIF240"
AFTER **INSERT** ON ATCB_TCM_SAP.PM_TBLIF240_TMP FOR EACH ROW
1 голос
/ 02 апреля 2020

Как и предполагалось, вы должны проверить вторую строку. Вы говорите, что триггер должен быть выполнен только после INSERT.

Измените его на:

CREATE OR REPLACE TRIGGER atcb_tcm_sap."TRI_PM_TBLIF240" BEFORE
    DELETE OR INSERT OR UPDATE ON atcb_tcm_sap.pm_tblif240_tmp --> this line here
    FOR EACH ROW
DECLARE
    updating_key_fields EXCEPTION;
BEGIN
    IF inserting THEN
        INSERT INTO pm_tblif240 VALUES (
            :new.msgid,
            :new.werks,
            :new.equnr,
            :new.mptype,
            :new.date_,
            :new.time,
            :new.recdc,
            :new.idiff,
            :new.readr,
            :new.iind,
            :new.qmart
        );

    END IF;

    IF updating THEN
        IF updating('MSGID') THEN
            RAISE updating_key_fields;
        END IF;
        INSERT INTO pm_tblif240 VALUES (
            :old.msgid,
            :old.werks,
            :old.equnr,
            :old.qmart,
            :old.mptype,
            :old.recdc,
            :old.idiff,
            :old.readr,
            :old.iind,
            :old.date_,
            :old.time
        );

    END IF;

    IF deleting THEN
        INSERT INTO pm_tblif240 VALUES (
            :old.msgid,
            :old.werks,
            :old.equnr,
            :old.qmart,
            :old.mptype,
            :old.recdc,
            :old.idiff,
            :old.readr,
            :old.iind,
            :old.date_,
            :old.time
        );

    END IF;

EXCEPTION
    WHEN updating_key_fields THEN
        raise_application_error(-20300, 'ActiveDB Error: cannot update key fields of source table.');
END;
...