這表示一旦在觸發程序中提交 BEGIN TRANSACTION 陳述式則實際上便開始巢狀交易。由於在復原巢狀交易時,會忽略巢狀的 BEGIN TRANSACTION 陳述式,因此在觸發程序中提交的 ROLLBACK TRANSACTION,會略過觸發程序本身所提交的 BEGIN TRANSACTION 陳述式而永遠復原。ROLLBACK 復原至最外側的 BEGIN TRANSACTION。
您必須在觸發程序中使用 SAVE TRANSACTION 陳述式來進行部分復原,即使這個陳述式總是在自動認可模式下被呼叫。下列觸發程序說明了這一點:
CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS
SAVE TRANSACTION MyName
INSERT INTO TestAudit
SELECT * FROM inserted
IF (@@error <> 0)
BEGIN
ROLLBACK TRANSACTION MyName
END
這同時也會影響到觸發程序中,接續 BEGIN TRANSACTION 陳述式的 COMMIT TRANSACTION 陳述式。由於 BEGIN TRANSACTION 啟動巢狀交易,後續的 COMMIT 陳述式便僅套用於巢狀交易。如果 ROLLBACK TRANSACTION 陳述式是在 COMMIT 之後執行,ROLLBACK 則將一切都復原到最外側的 BEGIN TRANSACTION。下列觸發程序說明了這一點:
CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS
BEGIN TRANSACTION
INSERT INTO TrigTarget
SELECT * FROM inserted
COMMIT TRANSACTION
ROLLBACK TRANSACTION