2016-12-26 6 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

トリガーが2回実行されていませんか? – Bohemian

答えて

1

おかげトリガーにコード化されて以降のコードは、以前のコードの前に実行された方法はありません。

トリガーが2回実行されています。

最初の実行では、idが3文字に切り詰められます。
idが短すぎるため(最初の実行のため)、2回目の実行が爆発します。

なぜ2度呼び出されているのか把握する必要があります。


可能性を修正しました、あなたは二回呼び出されることを防ぐことができない場合は、になる可能性が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

関連する問題