TSQL使触发器无声地失败

Bus*_*icK 6 t-sql sql-server error-handling triggers sql-server-2008

我在后插入触发器中有一些可能会失败的代码.这样的失败不是关键,应该不会回滚事务.如何在触发器中捕获错误并使事务的其余部分正常执行?

下面的例子显示了我的意思.触发器故意创建一个错误条件,结果原始插入("1")从不插入表中.尝试/ Catch似乎没有做到这一点.一个类似的,较旧的堆栈溢出问题没有产生答案,除了"防止错误首先发生" - 这并不总是可能/容易.

还有其他想法吗?

create table test 
(
  a int not null
);
go

create trigger testTrigger on test 
after insert as 
begin 
  insert into test select null;
end;
go

insert into test values ( 1 );
Run Code Online (Sandbox Code Playgroud)

Cad*_*oux 3

触发器不能失败并且仍然可以使事务前滚。您有几个选项可以确保触发器不会失败。

1 - 您可以通过重复检查约束的逻辑并且不尝试违反约束的操作来确保之后不会失败:

IE

INSERT INTO test WHERE val IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

2 - 您可以通过使用队列设计模式来推迟可能失败的操作,其中可能会或可能不会失败的操作通过排队到排队操作不可能失败的表来排队。

IE

INSERT INTO ACTION_QUEUE (action, parameters) VALUES ('INSERT INTO TEST', val)
Run Code Online (Sandbox Code Playgroud)