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

In Microsoft SQL Server 2000 und SQL Server 2005 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 SQL Server 2000 und SQL Server 2005 kleiner als in SQL Server 7.0.

In SQL Server 2000 und SQL Server 2005 tritt möglicherweise ein anderes Verhalten als in SQL Server, Version 7.0, auf, wenn eine COMMIT TRANSACTION- oder COMMIT WORK-Anweisung in einem Trigger ausgeführt wird und keine entsprechende explizite oder implizite BEGIN TRANSACTION-Anweisung beim Start des Triggers vorhanden ist. 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 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.

Siehe auch

Konzepte

Rollbacks und Commits in gespeicherten Prozeduren und Triggern
Transaktionen (Datenbankmodul)

Andere Ressourcen

ROLLBACK TRANSACTION (Transact-SQL)

Hilfe und Informationen

Informationsquellen für SQL Server 2005