Melhor maneira de trabalhar com transações no MS SQL Server Management Studio

127

Digamos que eu tenho uma instrução SQL correta e sintática e semanticamente correta para que ela seja executada.

No Management Studio (ou em qualquer outra ferramenta de consulta), como posso testar instruções SQL e, se perceber que elas quebraram alguma coisa, reverter (em uma consulta separada?)

Niels Bosma
fonte

Respostas:

227

A coisa mais fácil a fazer é agrupar seu código em uma transação e, em seguida, executar cada lote de código T-SQL linha por linha.

Por exemplo,

Begin Transaction

         -Do some T-SQL queries here.

Rollback transaction -- OR commit transaction

Se você deseja incorporar o tratamento de erros, pode fazê-lo usando um TRY ... CATCH BLOCK. Se ocorrer um erro, você poderá reverter a transação dentro do bloco de captura.

Por exemplo:

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

Veja o link a seguir para mais detalhes.

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

Espero que isso ajude, mas entre em contato se precisar de mais detalhes.

John Sansom
fonte
3
Oi obrigado Vi pela primeira vez sobre @@ TRANCOUNT aqui e você pode me dizer o que aconteceu com "SE @@ TRANCOUNT> 0 COMMIT TRANSACTION" após o processamento de ROLLBACK? e qual o valor @@ TRANCOUNT? Obrigado novamente.
Qmaster
2
Após a extração, ROLLBACK TRANSACTION @@ TRANCOUNT volta a 0. Com isso, a COMMIT TRANSACTION não será executada. Consulte msdn.microsoft.com/de-de/library/ms187967.aspx
Christoph Brückmann
8

Quero acrescentar um ponto em que você também pode (e deve, se o que está escrevendo é complexo) adicionar uma variável de teste à reversão, se estiver no modo de teste. Então você pode executar a coisa toda de uma vez. Frequentemente, também adiciono código para ver os resultados anteriores e posteriores de várias operações, especialmente se for um script complexo.

Exemplo abaixo:

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
fonte