Oracle
如果“插入或更新後觸發器”停止工作,是否可以通知我?
上週,我發現我
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_step
或TEMPLATE.step_stage
有一個列STEP_ID
,則該WHERE
子句where ws.sysid= step_id;
將解釋
STEP_ID
為表中的列,而不是您的局部變數STEP_ID
。PL/SQL 開發人員通常為局部變數添加前綴(即L_STEP_ID
,而不是STEP_ID
)的原因之一是避免無意中使用表中的列也使用的名稱,因為眾所周知,這類範圍解析問題難以調試。