Oracle

如果“插入或更新後觸發器”停止工作,是否可以通知我?

  • October 18, 2011

上週,我發現我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;

觸發器不能簡單地停止工作。

可以禁用觸發器。可以放下觸發器。如果對它引用的對象之一執行 DDL,則觸發器將無效,但如果執行觸發語句,它仍將執行。如果觸發器重新編譯失敗,觸發語句會報錯

ORA-04098: trigger ' MASTER.INSTANCE_STEP_TRG' is invalid and failed re-validation

觸發器似乎也有可能像聲明的那樣正常工作,但不像您預期的那樣工作。例如,new.sysid 可能不大於 0(請記住 NULL 不大於 0)導致WHEN不滿足子句。可能是您的SELECT語句返回的值小於或等於 0,從而導致您INSERT沒有被執行。如果其中一個TEMPLATE.wf_stepTEMPLATE.step_stage有一個列STEP_ID,則該WHERE子句

where ws.sysid= step_id;

將解釋STEP_ID為表中的列,而不是您的局部變數STEP_ID。PL/SQL 開發人員通常為局部變數添加前綴(即L_STEP_ID,而不是STEP_ID)的原因之一是避免無意中使用表中的列也使用的名稱,因為眾所周知,這類範圍解析問題難以調試。

引用自:https://dba.stackexchange.com/questions/6880