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

BJ *_*tel 3 sql sql-server triggers sql-server-2008

我在插入触发器后创建了

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

总之,如果触发器中发生任何错误,则应忽略它。

正如我所用

BEGIN TRY

END TRY
BEGIN CATCH

END CATCH
Run Code Online (Sandbox Code Playgroud)

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

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

Nen*_*vic 5

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

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

选项A(丑陋的方式):

由于事务在触发器开始时处于活动状态,您可以直接使用COMMIT它并继续执行您的触发器命令:

CREATE TRIGGER tgTest1 ON Test1 AFTER INSERT
AS
BEGIN
COMMIT;
... do whatever trigger does
END;
Run Code Online (Sandbox Code Playgroud)

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

选项B(也丑):

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

SQLFiddle 演示