2016-12-26 111 views
0

我有一個這樣的觸發器:爲什麼觸發器的一部分在其餘部分之前被執行?

DECLARE v1 VARCHAR(4); 
and so on declaration 
... 

IF LENGTH(new.ID) < 11 OR new.ID= '' THEN   
     RAISERROR 23004 'Too short!'; 
ENDIF; 

SET v1 = substring(new.ID,1,3); 
and more action on v1... 

我想說的是,在set部分正在if之前執行,我不知道爲什麼。你有一個想法如何解決它?

在此先感謝

+0

你確定觸發器沒有被執行兩次嗎? – Bohemian

回答

1

有沒有辦法在觸發後編碼代碼前面的代碼之前執行。

您的觸發器正在執行兩次。

第一次執行將id截斷爲3個字符。
由於id太短(因爲第一次執行),第二次執行爆炸。

你需要弄清楚爲什麼它被調用兩次。


可能的修復,如果不能防止它被調用了兩次,可能是允許長度爲3:

IF LENGTH(new.ID) < 11 AND LENGTH(new.ID) != 3 THEN   
    RAISERROR 23004 'Too short!'; 
ENDIF; 

注意,從空白測試是通過測試的覆蓋長度小於11.

+0

我在聲明後添加了一個簡單的'INSERT'來查看觸發器是否工作,是的它被執行兩次。 – Triti

+0

@triti然後代碼行爲正確。請參閱編輯答案以瞭解可能的修復方法 – Bohemian

+0

我忘了說,在所有這些行動後,這是一個更新查詢 – Triti

相關問題