尝试捕获触发器而不是抑制错误

时间:2016-12-01 04:46:49

标签: sql sql-server triggers try-catch

我有一个触发器,我想通过try catch块包围触发器中的dml语句,以便触发器中发生的任何异常都不会在触发器之外抛出任何异常。但错误并未被抑制。

我的触发器是:

ALTER TRIGGER [dbo].[Deal.OnInsertUpdateAddDealAuditDetails]
ON [dbo].[Deal]
AFTER UPDATE, INSERT, DELETE
AS 
BEGIN
    BEGIN TRY
        --SOME DML STATEMENTS
        select 1/0
    END TRY
    BEGIN CATCH
        SELECT 
            ERROR_NUMBER() AS ErrorNumber,
            ERROR_MESSAGE() AS ErrorMessage;
    END CATCH
END

错误输出为:

  

Msg 3616,Level 16,State 1,Line 1
  触发器执行期间出错。批处理已中止,并且已回滚用户事务(如果有)。

1 个答案:

答案 0 :(得分:2)

XACT_ABORT隐含ON内部触发器。当Transact-SQL语句引发运行时错误时,它会回滚当前事务。

您必须在原始Insert查询中处理异常以避免抛出错误。

BEGIN TRY
    INSERT INTO deal(col1,col2,..)
    VALUES      (val1,val2,..)
END TRY

BEGIN CATCH
    SELECT Error_number()  AS ErrorNumber,
           Error_message() AS ErrorMessage;
END CATCH 

注意:插入的记录不会出现在表格中。如果您希望插入的记录存在于表中虽然触发器失败,那么您可能必须首先在触发器内提交事务