Beenden und Rollback alles im Skript bei Fehler

8

Ich habe ein TSQL-Skript, das viele Anpassungen der Datenbankstruktur vornimmt, aber es ist nicht wirklich sicher, es einfach durchzulassen, wenn etwas fehlschlägt.

um klarzustellen:

  • mit MS SQL 2005
  • es ist keine gespeicherte Prozedur, nur eine Skriptdatei (.sql)

Was ich habe, ist etwas in der folgenden Reihenfolge

%Vor%

nur um zu veranschaulichen, mit was ich arbeite ... kann nicht auf Einzelheiten eingehen jetzt, das Problem ...

Wenn ich einen Fehler einführe (um zu testen, ob die Dinge rückgängig gemacht werden), bekomme ich eine Aussage, dass die ROLLBACK TRANSACTION keine entsprechende BEGIN TRANSACTION finden konnte. Dies führt mich zu der Annahme, dass etwas, wenn wirklich falsch und die Transaktion wurde bereits getötet. Was ich auch bemerkt habe, ist, dass das Skript bei einem Fehler nicht vollständig beendet wurde und somit versucht hat, jede Anweisung auszuführen, nachdem der Fehler aufgetreten ist. (Ich bemerkte dies, als neue Tabellen auftauchten, als ich sie nicht erwartete, weil sie zurückrollen sollte)

    
Jan W. 26.05.2010, 08:05
quelle

5 Antworten

7

Wenn der Fehler auftritt, wird die Transaktion automatisch zurückgesetzt, und der aktuelle Stapel wird abgebrochen.

Die Ausführung wird jedoch in den nächsten Stapel fortgesetzt. So werden alle Daten in den Stapeln nach dem Fehler ausgeführt. Und wenn Sie später nach Fehlern suchen, versuchen Sie, eine bereits rückgängig gemachte Transaktion rückgängig zu machen.

Um das gesamte Skript und nicht nur den aktuellen Stapel zu stoppen, sollten Sie Folgendes verwenden:

%Vor%

Siehe meine Antwort hier für Details zu diesem.

Sie müssen also nach jedem Batch nach @error suchen, ich denke, so etwas sollte funktionieren:

%Vor%     
Blorgbeard 26.05.2010, 08:16
quelle
4

Versuchen Sie es mit RETURN. Dies beendet das Skript oder die Prozedur sofort und führt keine der folgenden Anweisungen aus. Sie können dies in Verbindung mit den Anweisungen BEGIN, ROLLBACK und COMMIT TRANSACTION verwenden, um jeglichen Datenschaden rückgängig zu machen:

%Vor%     
A___ 12.06.2012 21:50
quelle
3

Ich habe die raisegerror-Lösung nicht verwendet, weil sie fehlgeschlagen ist, da ich keine Administratorrechte hatte. Ich habe die Noexec-On / Off-Lösung mit der Transaktionsverarbeitung wie folgt erweitert:

%Vor%

Offenbar "versteht" der Compiler die Variable @finished in der IF, auch wenn ein Fehler aufgetreten ist und die Ausführung deaktiviert wurde. Der Wert wird jedoch nur dann auf 1 gesetzt, wenn die Ausführung nicht deaktiviert wurde. Daher kann ich die Transaktion entsprechend festlegen oder zurücksetzen.

    
Tz_ 25.10.2011 12:33
quelle
0

Sie könnten so etwas versuchen ... Wenn Sie Try block verwenden ... Die Fehlerstufe 16 (oder der größte Teil des Anwendungsfehlers) überträgt die Steuerung sofort an den CATCH-Block, ohne weitere Anweisungen in try auszuführen blockieren ...

%Vor%

Hoffe, das hilft ...

    
The King 26.05.2010 10:55
quelle
0
%Vor%     
Edward Olamisan 09.04.2013 13:06
quelle