Utilizzo di trigger DML che includono COMMIT o ROLLBACK TRANSACTION

In Microsoft SQL Server 2000 e SQL Server 2005, il conteggio delle transazioni viene incrementato 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 in SQL Server 2000 e SQL Server 2005 rispetto al valore restituito in SQL Server versione 7.0.

In SQL Server 2000 e SQL Server 2005, 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 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.

Vedere anche

Concetti

Rollback e commit in stored procedure e trigger
Transazioni (Motore di database)

Altre risorse

ROLLBACK TRANSACTION (Transact-SQL)

Guida in linea e informazioni

Assistenza su SQL Server 2005