欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ORA-04088(ORA-04084): cannot change NEW values for this trigger type

程序员文章站 2022-07-13 14:11:27
...

>>>bug背景>>>

bug来源一个定时任务的删除操作。这里需要删除原来数据,然后插入定时采集到的数据。因采集到的数据中没有id这个字段,所以插入这个过程需要借助oracle的触发器,来自动生成一个id。最终我写的触发器逻辑跟删除操作,产生冲突,所以报错。

// 以下sql 可用于插入数据自动生成id的功能,仅仅在数据库层面就可以完成

// 创建队列 
CREATE SEQUENCE RM_LINK_OLT_SEQUENCE
INCREMENT BY 1
START WITH 1
NOMINVALUE
NOMAXVALUE
NOCYCLE

// 执行查看是否存在序列
select RM_LINK_OLT_SEQUENCE.NEXTVAL from dual;

// 创建触发器 (依托队列生成id)

CREATE OR REPLACE TRIGGER RM_LINK_OLT_SEQ_TRIGGER
   BEFORE INSERT or UPDATE or DELETE ON RM_LINK_OLT 
   FOR EACH ROW
 BEGIN
   SELECT RM_LINK_OLT_SEQUENCE.NEXTVAL INTO :NEW.ID FROM DUAL;
END TR_FCBOOK;

// 查询触发器
select * from all_source where type='TRIGGER' AND name='RM_LINK_OLT_SEQ_TRIGGER';

// 删除触发器
drop trigger RM_LINK_OLT_SEQ_TRIGGER

>>>错误截图>>>

ORA-04088(ORA-04084): cannot change NEW values for this trigger type

 >>>解决>>>

1、我的报错是 ORA-04088 ,直接删除触发器中的 or DELETE ,然后执行,删除操作就可以了。

查询下:

ORA-04088(ORA-04084): cannot change NEW values for this trigger type

 修改后,执行一次这个定时任务,结果成功采集到数据:

ORA-04088(ORA-04084): cannot change NEW values for this trigger type

2、如果是 ORA-04084,该错误可能是发生在你创建触发器的时候,可以看看是不是你的触发器执行的时机不对,如下:

ORA-04088(ORA-04084): cannot change NEW values for this trigger type

将 AFTER 改为 BEFORE 即可创建。

>>>拓展>>>

直接在数据库操作,还是上面的触发器。

数据库修改前:

ORA-04088(ORA-04084): cannot change NEW values for this trigger type

执行操作:

ORA-04088(ORA-04084): cannot change NEW values for this trigger type

 

修改后:

ORA-04088(ORA-04084): cannot change NEW values for this trigger type 

你会发现,每一次insert,id自动递增一个,而update操作,则会覆盖之前的那个id,生成新的id。