Beste Möglichkeit, mit Transaktionen in MS SQL Server Management Studio zu arbeiten

126

Angenommen, ich habe eine SQL-Anweisung, die syntaktisch und semantisch korrekt ist, damit sie ausgeführt wird.

Wie kann ich in Management Studio (oder einem anderen Abfragetool) SQL-Anweisungen testen und, wenn ich bemerke, dass sie etwas beschädigt haben, ein Rollback durchführen (in einer separaten Abfrage?)

Niels Bosma
quelle

Antworten:

226

Am einfachsten ist es, Ihren Code in eine Transaktion einzuschließen und dann jeden Stapel T-SQL-Code Zeile für Zeile auszuführen.

Beispielsweise,

Begin Transaction

         -Do some T-SQL queries here.

Rollback transaction -- OR commit transaction

Wenn Sie die Fehlerbehandlung einbeziehen möchten, können Sie dies mit einem TRY ... CATCH BLOCK tun. Sollte ein Fehler auftreten, können Sie die Tranasction innerhalb des Catch-Blocks zurücksetzen.

Beispielsweise:

USE AdventureWorks;
GO
BEGIN TRANSACTION;

BEGIN TRY
    -- Generate a constraint violation error.
    DELETE FROM Production.Product
    WHERE ProductID = 980;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;

    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
END CATCH;

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;
GO

Weitere Informationen finden Sie unter folgendem Link.

http://msdn.microsoft.com/en-us/library/ms175976.aspx

Ich hoffe, das hilft, aber bitte lassen Sie mich wissen, wenn Sie weitere Details benötigen.

John Sansom
quelle
3
Hallo danke. Ich habe hier zum ersten Mal von @@ TRANCOUNT gesehen und können Sie mir sagen, was nach der ROLLBACK-Verarbeitung mit "IF @@ TRANCOUNT> 0 COMMIT TRANSACTION" passiert? und welchen Wert hat @@ TRANCOUNT? Danke noch einmal.
QMaster
2
Nach dem Ausführen von ROLLBACK TRANSACTION wird @@ TRANCOUNT auf 0 zurückgesetzt. Dadurch wird die COMMIT TRANSACTION nicht ausgeführt. Siehe msdn.microsoft.com/de-de/library/ms187967.aspx
Christoph Brückmann
8

Ich möchte einen Punkt hinzufügen, den Sie auch (und sollten, wenn das, was Sie schreiben, komplex ist) eine Testvariable zum Rollback hinzufügen können, wenn Sie sich im Testmodus befinden. Dann können Sie das Ganze auf einmal ausführen. Oft füge ich auch Code hinzu, um die Vorher- und Nachher-Ergebnisse verschiedener Operationen anzuzeigen, insbesondere wenn es sich um ein komplexes Skript handelt.

Beispiel unten:

USE AdventureWorks;
GO
DECLARE @TEST INT = 1--1 is test mode, use zero when you are ready to execute
BEGIN TRANSACTION;

BEGIN TRY
     IF @TEST= 1
        BEGIN
            SELECT *FROM Production.Product
                WHERE ProductID = 980;
        END    
    -- Generate a constraint violation error.
    DELETE FROM Production.Product
    WHERE ProductID = 980;

     IF @TEST= 1
        BEGIN
            SELECT *FROM Production.Product
                WHERE ProductID = 980;
            IF @@TRANCOUNT > 0
                ROLLBACK TRANSACTION;
        END    
END TRY

BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;

    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
END CATCH;

IF @@TRANCOUNT > 0 AND @TEST = 0
    COMMIT TRANSACTION;
GO
HLGEM
quelle