oracle - 更新表后触发
问题描述
不知道以前有没有回答过,我会尽量具体一点。
我有这张桌子
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
。
如果我能对如何更新触发器有一些想法,我将不胜感激。
解决方案
这是一个肮脏的技巧:使用 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;
推荐阅读
- javascript - 使用 JavaScript 构建 SVG 图标
- flutter - Obx 不工作 - Flutter Getx 包
- c# - 在 C# WinForm 中的窗口后面截屏
- c - 在 C 中使用“框模糊”技术模糊 image.bmp
- flutter - 当用户未登录时,颤动重定向到登录小部件(有状态类)?
- python - 如何让循环创建函数?
- regex - 相对路径的 VS 代码片段正则表达式
- file-upload - 无法在 Play 管理中心上传 APK 文件,要求 AAB 文件扩展
- node.js - 为数字海洋部署配置基本 url nuxt
- pandas - 使用分钟柱数据(多只股票,一个 df 中的多个会话)获取不完整每日柱的股票日低 (LOD) 价格 SettingWithCopyWarning