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

Там нет никакого способа позже код выполняется перед ранее кода, кодируются в триггере.

Ваш триггер выполняется дважды.

Первое исполнение обрезает идентификатор до 3 символов.
Второе исполнение взрывается из-за слишком короткого идентификатора (из-за первого выполнения).

Вам нужно выяснить, почему его зовут дважды.


Возможно исправить, если вы не можете предотвратить его называют в два раза, может быть позволить длиной 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