【问题标题】:How to Ignoring errors in Trigger and Perform respective operation in MS SQL Server如何忽略触发器中的错误并在 MS SQL Server 中执行相应的操作
【发布时间】:2013-07-18 12:05:38
【问题描述】:

我在 INSERT TRIGGER 之后创建了

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

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

我用过

BEGIN TRY

END TRY
BEGIN CATCH

END CATCH

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

触发器执行期间出现错误。该批次已 已中止并且用户事务(如果有)已回滚。

【问题讨论】:

  • 你能发布你的整个代码吗?
  • 由于目前触发器代码中没有错误,但为了安全起见,我需要在上线之前做同样的事情,所以如果触发器中发生任何错误,它不会影响插入操作

标签: sql sql-server sql-server-2008 triggers


【解决方案1】:

有趣的问题。默认情况下,触发器被设计为如果它们失败,它们会回滚触发它的命令。因此,只要触发器正在执行,就会有一个活动事务,无论外部是否有显式的 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

【讨论】:

    【解决方案2】:

    你不能,任何解决它的尝试都是蛇油。再多的 TRY/CATCH 或 @@ERROR 检查都无法解决根本问题。

    如果您想使用触发器的紧密耦合,那么您必须接受耦合导致的较低可用性。

    如果你想保持可用性(即让 INSERT 成功),那么你必须放弃耦合(移除触发器)。您必须在一个单独的事务中执行您计划在触发器中执行的所有处理,该事务在您的 INSERT 提交之后开始。轮询表中新插入的行的 SQL 代理作业、Service Broker 启动的过程甚至是应用程序层步骤都将符合要求。

    【讨论】:

      【解决方案3】:

      接受答案的选项 A 给了我以下错误:“事务在触发器中结束。批处理已中止。”。我使用下面的 SQL 绕过了这个问题。

      CREATE TRIGGER tgTest1 ON Test1 AFTER INSERT
      AS
      BEGIN
          SET XACT_ABORT OFF
          BEGIN TRY  
              SELECT [Column1] INTO #TableInserted FROM [inserted]
              EXECUTE sp_executesql N'INSERT INTO [Table]([Column1]) SELECT [Column1] FROM #TableInserted'
          END TRY  
          BEGIN CATCH
          END CATCH
          SET XACT_ABORT ON
      END
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-15
        • 1970-01-01
        • 2012-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-28
        • 1970-01-01
        相关资源
        最近更新 更多