Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Bei Fehler alles im Skript beenden und rückgängig machen

Wenn der Fehler auftritt, wird die Transaktion automatisch rückgängig gemacht und der aktuelle Stapel abgebrochen.

Die Ausführung wird jedoch im nächsten Stapel fortgesetzt. Also all das Zeug in den Batches, nachdem der Fehler ausgeführt wurde. Und wenn Sie später nach Fehlern suchen, versuchen Sie, eine bereits zurückgesetzte Transaktion rückgängig zu machen.

Um das gesamte Skript und nicht nur den aktuellen Batch zu stoppen, sollten Sie außerdem Folgendes verwenden:

raiserror('Error description here', 20, -1) with log

Siehe meine Antwort hier für Details dazu.

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

BEGIN TRANSACTION
GO

ALTER Stuff
GO

if @@error != 0 raiserror('Script failed', 20, -1) with log
GO

CREATE New Stuff
GO

if @@error != 0 raiserror('Script failed', 20, -1) with log
GO

DROP Old Stuff
GO

if @@error != 0 raiserror('Script failed', 20, -1) with log
GO

PRINT 'No Errors ... Committing changes'
COMMIT TRANSACTION