Partilhar via


Usando gatilhos DML que incluem COMMIT ou ROLLBACK TRANSACTION

Em versões de SQL Server posteriores a SQL Server versão 7.0, a contagem de transações é incrementada em uma transação apenas quando a contagem de transações for 0 no início da instrução. No SQL Server versão 7.0, a contagem de transações é sempre incrementada, independentemente da contagem de transações no início da instrução. Portanto, o valor retornado por @@TRANCOUNT em gatilhos pode ser inferior em versões posteriores a SQL Server versão 7.0.

Em versões posteriores, se uma instrução COMMIT TRANSACTION ou COMMIT WORK for executada em um gatilho e não houver uma instrução BEGIN TRANSACTION explícita ou implícita correspondente ao início do gatilho, os usuários poderão presenciar um comportamento diferente do SQL Server versão 7.0. Nós não recomendamos colocar instruções COMMIT TRANSACTION ou COMMIT WORK em um gatilho.

Quando os gatilhos que incluem as instruções COMMIT ou ROLLBACK TRANSACTION forem executados de um lote, eles cancelarão todo o lote. Em SQL Server 2008 e SQL Server 2005, um erro é também retornado.

No exemplo a seguir, se a instrução INSERT acionar um gatilho DML que inclua ROLLBACK TRANSACTION, a instrução DELETE não será executada devido ao lote ter sido cancelado.

/* Start of Batch */
INSERT employee VALUES ('XYZ12345M', 'New', 'M', 'Employee', 1, 1, '9952', '6/1/95') -- Causes trigger to fire and ROLLBACK TRANSACTION.
DELETE employee WHERE emp_id = 'PMA42628M'
GO

Se gatilhos que incluem as instruções ROLLBACK TRANSACTION forem acionados em uma transação definida pelo usuário, ROLLBACK TRANSACTION reverterá toda a transação. No exemplo a seguir, se a instrução INSERT acionar um gatilho que inclua ROLLBACK TRANSACTION, a instrução UPDATE também será revertida.

/* Start of Transaction */
BEGIN TRANSACTION
UPDATE employee SET hire_date = '7/1/94' WHERE emp_id = 'VPA30890F'
INSERT employee VALUES ('XYZ12345M', 'New', 'M', 'Employee', 1, 1, '9952', '6/1/95') -- Causes trigger to fire and ROLLBACK TRANSACTION.