gpt4 book ai didi

sql-server - 忽略触发器中的错误

转载 作者:行者123 更新时间:2023-12-02 23:17:04 26 4
gpt4 key购买 nike

我有一个存储过程,在插入/更新/删除时在触发器内调用。

问题是这个 SP 中有一个不重要的代码块。因此我想忽略此代码块引起的任何错误。

我将此代码块插入到 TRY CATCH block 中。但令我惊讶的是,我收到了以下错误:

当前事务无法提交,并且无法支持写入日志文件的操作。回滚事务。

然后我尝试使用 SAVE & ROLLBACK TRANSACTION 以及 TRY CATCH,但也失败并出现以下错误:

当前事务无法提交,也无法回滚到保存点。回滚整个事务。

我的服务器版本是:Microsoft SQL Server 2008 (SP2) - 10.0.4279.0 (X64)

示例 DDL:

IF OBJECT_ID('TestTrigger') IS NOT NULL
DROP TRIGGER TestTrigger
GO
IF OBJECT_ID('TestProcedure') IS NOT NULL
DROP PROCEDURE TestProcedure
GO
IF OBJECT_ID('TestTable') IS NOT NULL
DROP TABLE TestTable
GO

CREATE TABLE TestTable (Data VARCHAR(20))
GO

CREATE PROC TestProcedure
AS
BEGIN

SAVE TRANSACTION Fallback
BEGIN TRY
DECLARE @a INT = 1/0
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION Fallback
END CATCH
END
GO

CREATE TRIGGER TestTrigger
ON TestTable
FOR INSERT, UPDATE, DELETE
AS
BEGIN
EXEC TestProcedure
END
GO

复制错误的代码:

BEGIN TRANSACTION
INSERT INTO TestTable VALUES('data')
IF @@ERROR > 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION
GO

最佳答案

我也经历过同样的折磨,我刚刚解决了它!只需在触发器的第一步添加这一行就可以了:

SET XACT_ABORT OFF;

就我而言,我正在处理向特定表提供导致错误的批处理和来自 SQL 的错误变量的错误。

XACT_ABORT 的默认值为ON,因此即使您在 TRY CATCH block 内处理错误,也不会提交整个事务(就像我正在做)。将其值设置为OFF 将导致即使发生错误也会提交事务。

但是,在错误没有处理的情况下我没有测试...

了解更多信息:

关于sql-server - 忽略触发器中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9971602/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com