Поделиться через


Использование триггеров DML, содержащих инструкции COMMIT или ROLLBACK TRANSACTION

В SQL Server версиях, более старших, чем SQL Server 7.0, счетчик транзакций увеличивается на единицу только тогда, когда он равен 0 в начале инструкции. В SQL Server версии 7.0 счетчик транзакций увеличивался всегда независимо от его значения в начале инструкции. Таким образом, значение, которое функция @@TRANCOUNT возвращает в триггерах, может оказаться ниже в версиях SQL Server, младше версии 7.0.

В более старших версиях, если инструкция COMMIT TRANSACTION или COMMIT WORK выполняется в триггере и в начале триггера отсутствует явно или неявно вызванная инструкция BEGIN TRANSACTION, это может привести к результатам, отличным от получаемых в SQL Server версии 7.0. Не рекомендуется помещать инструкции COMMIT TRANSACTION и COMMIT WORK в триггер.

Если триггер, содержащий инструкцию COMMIT или ROLLBACK TRANSACTION, выполняется из пакета, будет отменен весь пакет. Кроме того, в SQL Server 2008 и SQL Server 2005 возвращается ошибка.

В следующем примере, если инструкция INSERT вызывает срабатывание триггера DML, содержащего ROLLBACK TRANSACTION, инструкция DELETE не будет выполнена, так как будет отменен весь пакет.

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

Если триггер, содержащий инструкцию ROLLBACK TRANSACTION, срабатывает в пользовательской транзакции, инструкция ROLLBACK TRANSACTION выполняет откат всей транзакции. В следующем примере, если инструкция INSERT вызывает срабатывание триггера, содержащего инструкцию ROLLBACK TRANSACTION, также будет выполнен откат инструкции 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.