【发布时间】:2011-07-26 19:20:58
【问题描述】:
我有一个插入/更新/删除后触发器,每次对特定表进行插入/更新/删除时,它都会在 AuditTable 中插入一条新记录。如果在 AuditTable 中的插入失败,我希望无论如何都要插入第一条记录,并将错误记录在另一个表“AuditErrors”中。
这是我迄今为止所做的,我尝试了许多不同的方法,但如果触发器插入到 AuditTable 失败,我无法让它工作(我通过在 AuditTable 插入中拼错列的名称来测试它)。注意:@sql 是对 AuditTable 的插入。
DECLARE @TranCounter INT
SET @TranCounter = @@TRANCOUNT
IF @TranCounter > 0
SAVE TRANSACTION AuditInsert;
ELSE
BEGIN TRANSACTION;
BEGIN TRY
EXEC (@sql)
IF @TranCounter = 0
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
-- roll back
IF @TranCounter = 0
ROLLBACK TRANSACTION;
ELSE
IF XACT_STATE() <> -1
ROLLBACK TRANSACTION AuditInsert;
-- insert error into database
IF @TranCounter > 0
SAVE TRANSACTION AuditInsert;
ELSE
BEGIN TRANSACTION;
BEGIN TRY
INSERT INTO [dbo].[AuditErrors] ([AuditErrorCode], [AuditErrorMsg]) VALUES (ERROR_NUMBER(), ERROR_MESSAGE())
IF @TranCounter = 0
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
-- roll back
IF @TranCounter = 0
ROLLBACK TRANSACTION;
ELSE
IF XACT_STATE() <> -1
ROLLBACK TRANSACTION AuditInsert;
END CATCH
END CATCH
【问题讨论】:
标签: sql-server-2005 tsql triggers