COMMIT 또는 ROLLBACK TRANSACTION이 포함된 DML 트리거 사용

SQL Server 버전 7.0 이후의 SQL Server에서는 문이 시작될 때 트랜잭션 수가 0인 경우에만 문에서 트랜잭션 수가 증가합니다. SQL Server 버전 7.0에서는 문 시작 시 트랜잭션 수와 상관없이 항상 증가합니다. 따라서 SQL Server 7.0에 비해 이후의 버전에서 @@TRANCOUNT가 트리거에서 반환하는 값이 낮을 수 있습니다.

이후 버전에서 COMMIT TRANSACTION 또는 COMMIT WORK 문이 트리거에서 실행되고 트리거 시작 시 해당 명시적 또는 암시적 BEGIN TRANSACTION 문이 없을 경우 SQL Server 버전 7.0과는 다른 동작이 수행될 수 있습니다. 트리거에 COMMIT TRANSACTION 또는 COMMIT WORK 문을 배치하지 않는 것이 좋습니다.

일괄 처리에서 COMMIT 또는 ROLLBACK TRANSACTION 문을 포함하는 트리거를 실행하면 전체 일괄 처리가 취소됩니다. SQL Server 2008 및 SQL Server 2005에서는 오류도 반환됩니다.

다음 예에서 INSERT 문이 ROLLBACK TRANSACTION을 포함하는 DML 트리거를 시작하면 일괄 처리가 취소되기 때문에 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.