gpt4 book ai didi

sql - 如何忽略触发器中的错误并在 MS SQL Server 中执行相应的操作

转载 作者:行者123 更新时间:2023-12-04 13:39:16 29 4
gpt4 key购买 nike

我在 INSERT TRIGGER 之后创建了

现在,如果在执行触发器时发生错误。它不应该影响对触发表的插入操作。

一句话,如果触发器发生任何错误,它应该忽略它。

我用过

BEGIN TRY

END TRY
BEGIN CATCH

END CATCH

但它给出了以下错误消息并在触发表上回滚插入操作

An error was raised during trigger execution. The batch has been aborted and the user transaction, if any, has been rolled back.

最佳答案

有趣的问题。默认情况下,触发器的设计是如果它们失败,它们会回滚触发它的命令。因此,只要触发器正在执行,就会有一个事件事务,无论外部是否有显式的 BEGIN TRANSACTION。而且触发器内部的 BEGIN/TRY 也不起作用。您的最佳做法是不要在触发器中编写任何可能失败的代码 - 除非希望触发语句也失败。

在这种情况下,为了抑制这种行为,有一些解决方法。

选项 A(丑陋的方式):

由于事务在触发器开始时处于事件状态,您只需 COMMIT 它并继续执行您的触发器命令:

CREATE TRIGGER tgTest1 ON Test1 AFTER INSERT
AS
BEGIN
COMMIT;
... do whatever trigger does
END;

请注意,如果触发器代码有错误,仍然会产生错误消息,但 Test1 表中的数据是安全插入的。

选项 B(也很丑):

您可以将代码从触发器移动到存储过程。然后从实现 BEGIN/TRY 的 Wrapper SP 调用该存储过程,最后 - 从触发器调用 Wrapper SP。如果在逻辑中需要(现在在 SP 中),从 INSERTED 表中移动数据可能有点棘手 - 可能使用一些临时表。

SQLFiddle DEMO

关于sql - 如何忽略触发器中的错误并在 MS SQL Server 中执行相应的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17722967/

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