Condividi tramite


Utilizzo di trigger DML che includono COMMIT o ROLLBACK TRANSACTION

Nelle versioni di SQL Server successive a SQL Server 7.0, il conteggio delle transazioni incrementa all'interno di un'istruzione solo quando il numero di transazioni all'inizio dell'istruzione è uguale a 0. In SQL Server versione 7.0 il conteggio delle transazioni viene sempre incrementato, indipendentemente dal numero di transazioni all'inizio dell'istruzione. Il valore restituito da @@TRANCOUNT nei trigger può pertanto essere inferiore rispetto alle versioni successive a SQL Server 7.0.

Nelle versioni successive, se un'istruzione COMMIT TRANSACTION o COMMIT WORK viene eseguita in un trigger e all'inizio di quest'ultimo non è presente un'istruzione BEGIN TRANSACTION implicita o esplicita corrispondente, il funzionamento potrebbe essere diverso rispetto a SQL Server versione 7.0. Non è consigliabile inserire un'istruzione COMMIT TRANSACTION o COMMIT WORK all'interno di un trigger.

Se i trigger che includono istruzioni COMMIT o ROLLBACK TRANSACTION vengono eseguiti da un batch, i trigger annullano l'intero batch. In SQL Server 2008 e SQL Server 2005 viene anche restituito un errore.

Nell'esempio seguente, se l'istruzione INSERT attiva un trigger DML che include un'istruzione ROLLBACK TRANSACTION, l'istruzione DELETE non verrà eseguita perché il batch viene annullato.

/* 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 i trigger che includono le istruzioni ROLLBACK TRANSACTION vengono attivati in una transazione definita dall'utente, l'istruzione ROLLBACK TRANSACTION eseguirà il rollback dell'intera transazione. Nell'esempio seguente, se l'istruzione INSERT attiva un trigger DML che include un'istruzione ROLLBACK TRANSACTION, viene eseguito il rollback anche dell'istruzione UPDATE:

/* 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.