如果“插入或更新后触发器”停止工作,是否可以通知我?

50L*_*V3R 2 trigger oracle oracle-10g

上周,我发现我after insert or update trigger没有工作。在我禁用并启用它后,它又开始工作了。

我还不知道它为什么停止工作。有什么办法可以解决这个问题吗?因为此触发器正在记录日常作业的值,并用于报告目的。如果这个触发器在没有我通知或错误的情况下在几天内消失,我将陷入困境。

我正在使用 Oracle 10g,使用 sqldeveloper 访问数据库

My Trigger

create or replace
TRIGGER MASTER.INSTANCE_STEP_TRG 
AFTER INSERT OR UPDATE OF SYSID,STEP_ID,INSTANCE_ID,PARENT_STEP_ID ON MASTER.WF_INSTANCE_STEP 
REFERENCING OLD AS old NEW AS new 
FOR EACH ROW 
WHEN (new.sysid > 0) 
declare 
stepSysid number;
crCode varchar(50);
crDate date;
step_id number;
BEGIN
  step_id := :new.step_id;

  select ss.sysid into stepSysid from TEMPLATE.wf_step ws 
  inner join TEMPLATE.step_stage ss on ss.sysid=ws.stage_id
  where ws.sysid= step_id;


  if ( stepSysid>0) then
    insert into MASTER.fact_cr_progress values(0,:new.instance_id,stepSysid,:new.create_dt);
  end if;

  dbms_output.enable(10000);
  dbms_output.put_line('start print');

END;
Run Code Online (Sandbox Code Playgroud)

Jus*_*ave 7

触发器不能简单地停止工作。

可以禁用触发器。可以丢弃触发器。如果对它引用的对象之一进行了 DDL,则触发器将无效,但如果执行触发语句,它仍将被执行。如果触发器重新编译成功失败,触发语句会报错

ORA-04098: trigger ' MASTER.INSTANCE_STEP_TRG' is invalid and failed re-validation
Run Code Online (Sandbox Code Playgroud)

触发器似乎也有可能按照声明正常工作,但并非如您所愿。例如,可能 new.sysid 不大于 0(记住 NULL 不大于 0)导致WHEN不满足子句。可能是你的SELECT语句返回了一个小于等于0的值,从而导致你的INSERT不被执行。如果其中一个TEMPLATE.wf_stepTEMPLATE.step_stage有一个列STEP_ID,则该WHERE子句

where ws.sysid= step_id;
Run Code Online (Sandbox Code Playgroud)

将解释STEP_ID为表中的列,而不是您的局部变量STEP_ID。PL/SQL 开发人员通常为局部变量添加前缀(即L_STEP_ID而不是STEP_ID)的原因之一是为了避免无意中使用也被表中的列使用的名称,因为众所周知,这些类型的范围解析问题难以调试。