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)
触发器不能简单地停止工作。
可以禁用触发器。可以丢弃触发器。如果对它引用的对象之一进行了 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_step
或TEMPLATE.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
)的原因之一是为了避免无意中使用也被表中的列使用的名称,因为众所周知,这些类型的范围解析问题难以调试。
归档时间: |
|
查看次数: |
1778 次 |
最近记录: |