我在插入后触发器中有一些代码可能会失败。这样的失败并不重要,应该not回滚事务。如何捕获触发器内的错误并让事务的其余部分正常执行?
下面的例子说明了我的意思。触发器故意创建一个错误条件,结果是原始插入 ( "1" ) 永远不会插入到表中。 Try/Catch 似乎没有起到作用。一个相似的,较旧的堆栈溢出问题 https://stackoverflow.com/questions/970266/handle-error-in-sql-trigger-without-failing-transaction除了“首先防止错误发生”之外,没有给出答案 - 这并不总是可能/容易的。
还有其他想法吗?
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 );
触发器不能失败并且仍然可以使事务前滚。您有几个选项可以确保触发器不会失败。
1 - 您可以通过重复检查约束的逻辑并且不尝试违反约束的操作来确保之后不会失败:
i.e.
INSERT INTO test WHERE val IS NOT NULL
2 - 您可以通过使用队列设计模式来推迟可能失败的操作,其中可能会或可能不会失败的操作通过排队到排队操作不可能失败的表来排队。
i.e.
INSERT INTO ACTION_QUEUE (action, parameters) VALUES ('INSERT INTO TEST', val)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)