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
>>>错误截图>>>
>>>解决>>>
1、我的报错是 ORA-04088 ,直接删除触发器中的 or DELETE ,然后执行,删除操作就可以了。
查询下:
修改后,执行一次这个定时任务,结果成功采集到数据:
2、如果是 ORA-04084,该错误可能是发生在你创建触发器的时候,可以看看是不是你的触发器执行的时机不对,如下:
将 AFTER 改为 BEFORE 即可创建。
>>>拓展>>>
直接在数据库操作,还是上面的触发器。
数据库修改前:
执行操作:
修改后:
你会发现,每一次insert,id自动递增一个,而update操作,则会覆盖之前的那个id,生成新的id。