2016-05-12 30 views
0

我創建了一個觸發與下面的代碼發現SQL異常。錯誤是:ORA-04098:觸發器是無效的,失敗再驗證

create or replace trigger DTE_SAVE_ORIGINAL_VAL 
after update 
on attrvaldesc 
FOR Each row 
when (new.field2 is null) 
Declare 
attrvaloriginal attrval.attrval_id%TYPE; 
attrval_id attrval.attrval_id%TYPE; 
language_id attrvaldesc.language_id%type; 
storeent_id attrval.storeent_id%type; 
PRAGMA AUTONOMOUS_TRANSACTION; 
Begin 
Dbms_Output.Put_Line(:OLD.attrval_id); 
select attrval_id into attrvaloriginal from attrval where identifier = (select identifier||'_original' from attrval where attrval_id= :OLD.attrval_id and storeent_id=10051) and storeent_id=10051; 
if (attrvaloriginal > 0) then 
Dbms_Output.Put_Line(attrvaloriginal); 
Dbms_Output.Put_Line(:NEW.value); 
delete from attrval where attrval_id = attrvaloriginal and storeent_id=10051; 
commit; 
END IF; 
End; 

觸發已編譯的,當我觸發一個作業,用於更新attrvaldesc表,我「M面向下方例外

異常消息:

甲SQL異常被捕獲。錯誤是:ORA-04098:觸發器 'WCS_ADMIN_HFI.DTE_SAVE_ORIGINAL_VAL' 是無效的,失敗再驗證

堆棧跟蹤:
com.ibm.commerce.foundation.dataload.exception.DataLoadSQLException:SQL異常被抓住了。錯誤是:ORA-04098:觸發器「WCS_ADMIN_HFI.DTE_SAVE_ORIGINAL_VAL」是無效的,失敗再驗證

要檢查,如果在我的觸發任何錯誤,我做了一個

SHOW ERRORS TRIGGER DTE_SAVE_ORIGINAL_VAL; 

我回到下面

18/1 PLS-00103:出現符號 「DROP」

+0

你的觸發器沒有'drop' - 你確定你有正確的版本加載嗎?啊,它也沒有18行,所以你創建它作爲一個更大的腳本的一部分,只是省略'/'執行'create trigger'?你需要這個,因爲它是PL/SQL。 –

+0

是的,我沒有添加/在最後。讓我試試 – Shiva

+0

現在它的工作。謝謝Alex! – Shiva

回答

1

還有你的代碼做不包括'drop'一詞。但錯誤消息也指向第18行。在觸發器中,PLS錯誤僅指代以declarebegin開頭的PL/SQL部分。你的PL/SQL部分只有16行,從declareend;。這表明問題與您所展示的不完全相同。

從此我們可以推斷出您已經創建觸發器作爲腳本的一部分,下面的語句一度下探對象:

create or replace trigger DTE_SAVE_ORIGINAL_VAL 
... 
End; 

drop ... 

因爲它的PL/SQL觸發創作needs to be submitted with a / character。目前,在你的實際觸發後,一直到你的腳本(或潛在的腳本末尾)出現/,這個意外事件被意外地包含在觸發器定義中,這意味着它包括了不是有效的PL/SQL。從包含drop的錯誤中,但它也可能包含其他語句,刪除,創建或更改任意數量的對象。

因此,你需要在你的腳本觸發後添加斜線:

create or replace trigger DTE_SAVE_ORIGINAL_VAL 
... 
End; 
/

drop ... 

您只需重新運行在自己的觸發聲明,但請記住,任何跟隨它 - 這就是一切偶然被視爲觸發器的一部分 - 完全沒有執行,所以你可能會遺漏其他對象,或者讓它們的構建方式與預期不同(如果腳本應該放下然後重新創建對象)。

可能想要修復,然後重新運行整個腳本,只要你沒有添加任何會破壞的數據 - 如果你現在正在更新數據,這很可能。如果這不是一件安全的事情,那麼請查看還沒有做什麼,然後手動執行這些部分,再次注意潛在的數據丟失。

+0

謝謝!它的工作現在 – Shiva

相關問題