Table 更新后触发
Trigger after update on Table
我不知道以前是否有人回答过这个问题,我会尽量具体一点。
我有这个table
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
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
.
如果我能得到一些关于如何更新我的触发器的想法,我将不胜感激。
这是一个卑鄙的把戏:使用 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;
我不知道以前是否有人回答过这个问题,我会尽量具体一点。
我有这个table
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
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
.
如果我能得到一些关于如何更新我的触发器的想法,我将不胜感激。
这是一个卑鄙的把戏:使用 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;