Триггер после обновления таблицы - PullRequest
0 голосов
/ 24 октября 2018

Я не знаю, был ли ответ на этот вопрос раньше, я постараюсь быть как можно более конкретным.

У меня есть эта таблица

TABLE  "MOVIMIENTO_A" 
   (    "COD_MOVIMIENTO" NUMBER, 
    "COD_CUENTA" NUMBER, 
    "COD_T_MOVIMIENTO" NUMBER, 
    "VAL_MOVIMIENTO" NUMBER, 
    "FECHA_MOVIMIENTO" DATE, 
     PRIMARY KEY ("COD_MOVIMIENTO")
  USING INDEX  ENABLE
   )

и эта таблица

TABLE  "CUENTA_A" 
   (    "COD_CUENTA" NUMBER, 
    "NOM_CUENTA" VARCHAR2(30), 
    "SAL_CUENTA" NUMBER, 
    "BANDERA_CUENTA" NUMBER, 
     PRIMARY KEY ("COD_CUENTA")
  USING INDEX  ENABLE
   )

И у меня есть триггер

create or replace trigger AUDITO_CUENTA_A
after insert or update or delete on CUENTA_A 
for each row
BEGIN
IF inserting then
INSERT INTO AUDI_CUENTA_A VALUES(:NEW.cod_CUENTA, :NEW.nom_cuenta, :OLD.SAL_CUENTA, :NEW.sal_cuenta, sysdate, sys_context('USERENV', 'IP_ADDRESS')); 
END IF;
IF deleting then
INSERT INTO AUDI_CUENTA_A VALUES(:NEW.cod_CUENTA, :NEW.nom_cuenta, :OLD.SAL_CUENTA, :NEW.sal_cuenta, sysdate, sys_context('USERENV', 'IP_ADDRESS')); 
END IF;
IF updating then
INSERT INTO AUDI_CUENTA_A VALUES(:NEW.cod_CUENTA, :NEW.nom_cuenta, :OLD.SAL_CUENTA, :NEW.sal_cuenta, sysdate, sys_context('USERENV', 'IP_ADDRESS')); 
END IF;
END;

Итак, сейчас, если я сделаю обновление на MOVIMIENTO_A, триггер сработает, но он должен сработать только тогда, когда яобновлять CUENTA_A напрямую, а не при обновлении MOVIMIENTO_A.

Я был бы очень признателен, если бы мог получить некоторые идеи о том, как обновить мой триггер.

1 Ответ

0 голосов
/ 25 октября 2018

Это подвох: используйте dbms_utility.format_call_stack, чтобы узнать, кто вызвал ваш код:

create or replace trigger AUDITO_CUENTA_A
   after insert or update or delete on CUENTA_A
   for each row
 BEGIN
    if not dbms_utility.format_call_stack like ('%TR_MOVIMIENTO_A%') then
        IF inserting then
          INSERT INTO AUDI_CUENTA_A  VALUES  (:NEW.cod_CUENTA, :NEW.nom_cuenta, :OLD.SAL_CUENTA, :NEW.sal_cuenta, sysdate, sys_context('USERENV', 'IP_ADDRESS'));
        elsif deleting then
           INSERT INTO AUDI_CUENTA_A VALUES  (:NEW.cod_CUENTA, :NEW.nom_cuenta, :OLD.SAL_CUENTA, :NEW.sal_cuenta, sysdate, sys_context('USERENV', 'IP_ADDRESS'));
        elsif updating then
           INSERT INTO AUDI_CUENTA_A VALUES  (:NEW.cod_CUENTA, :NEW.nom_cuenta, :OLD.SAL_CUENTA, :NEW.sal_cuenta, sysdate, sys_context('USERENV', 'IP_ADDRESS'));
        END IF;
    end if;
 END;
...