我有一个触发器,我想通过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
触发器执行期间出错。批处理已中止,并且已回滚用户事务(如果有)。
答案 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
注意:插入的记录不会出现在表格中。如果您希望插入的记录存在于表中虽然触发器失败,那么您可能必须首先在触发器内提交事务