2016-12-26 12 views
0

Ich habe ein Auslöser wie folgt aus:Warum wird ein Teil eines Triggers vor dem Rest ausgeführt?

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... 

Was ich sagen will, ist, dass der set Teil vor dem if ausgeführt wird, und ich weiß nicht, warum. Hast du eine Idee, wie du es reparieren kannst?

Vielen Dank im Voraus

+0

Sind Sie sicher, dass der Trigger nicht zweimal ausgeführt wird? – Bohemian

Antwort

1

Es gibt keine Möglichkeit, später Code vor früherem Code ausgeführt wird, wie in der Trigger-codiert.

Ihr Trigger wird zweimal ausgeführt.

Die erste Ausführung schneidet die ID auf 3 Zeichen ab.
Die zweite Ausführung explodiert aufgrund der zu kurzen ID (wegen der ersten Ausführung).

Sie müssen herausfinden, warum es zweimal aufgerufen wird.


Mögliche fix, wenn Sie es nicht verhindern kann, zweimal aufgerufen wird, könnte es sein, erlauben eine Länge von 3:

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

Hinweis, dass das Testen von Leer durch Tests abgedeckt ist für Länge kleiner als 11.

+0

Ich habe nach der Deklaration einfach 'INSERT' hinzugefügt, um zu sehen, ob der Trigger funktioniert und ja, es wird zweimal ausgeführt. – Triti

+0

@triti dann verhält sich der Code richtig. Siehe bearbeitete Antwort für mögliche Fehlerbehebung. – Bohemian

+0

Ich habe vergessen zu sagen, dass nach all dieser Aktion ist das eine Update-Abfrage – Triti

Verwandte Themen