Freigeben über


Verwenden von DDL-Triggern mit einer COMMIT- oder ROLLBACK TRANSACTION-Anweisung

In höheren SQL Server-Versionen als SQL Server Version 7.0 wird die Transaktionsanzahl in einer Anweisung nur inkrementiert, wenn die Transaktionsanzahl beim Start der Anweisung den Wert 0 besitzt.In SQL Server, Version 7.0, wird die Transaktionsanzahl unabhängig von der Transaktionsanzahl beim Start der Anweisung immer inkrementiert. Aus diesem Grund ist der Wert, den @@TRANCOUNT in Triggern zurückgibt, möglicherweise in späteren Versionen kleiner als in SQL Server 7.0.

Wenn in späteren Versionen eine COMMIT TRANSACTION- oder COMMIT WORK-Anweisung in einem Trigger ausgeführt wird und keine entsprechende explizite oder implizite BEGIN TRANSACTION-Anweisung am Anfang des Triggers vorhanden ist, sehen Benutzer möglicherweise ein anderes Verhalten als in SQL Server, Version 7.0.Es wird nicht empfohlen, COMMIT TRANSACTION- oder COMMIT WORK-Anweisungen in einem Trigger zu verwenden.

Werden Trigger, die COMMIT- oder ROLLBACK TRANSACTION-Anweisungen enthalten, innerhalb eines Batches ausgeführt, wird der gesamte Batch abgebrochen. In SQL Server 2008 und SQL Server 2005 wird außerdem ein Fehler zurückgegeben.

Im folgenden Beispiel wird, wenn die INSERT-Anweisung einen DML-Trigger auslöst, der ROLLBACK TRANSACTION enthält, die DELETE-Anweisung nicht ausgeführt, da der Batch abgebrochen wird:

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

Wenn Trigger, die ROLLBACK TRANSACTION-Anweisungen enthalten, innerhalb einer benutzerdefinierten Transaktion ausgelöst werden, führt ROLLBACK TRANSACTION für die gesamte Transaktion einen Rollback aus. Im folgenden Beispiel wird für die UPDATE-Anweisung ebenfalls ein Rollback ausgeführt, wenn die INSERT-Anweisung einen Trigger auslöst, der ROLLBACK TRANSACTION enthält:

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