我在一个后插入触发器中有一些可能会失败的代码。这样的失败并不重要,也不应该回滚事务。如何在触发器中捕获错误并让事务的其余部分正常执行?
下面的例子说明了我的意思。触发器故意创建一个错误条件,其结果是原始insert ( "1“)永远不会插入到表中。尝试/抓住似乎没有起作用。类似的,older stack overflow question没有给出一个答案,除了“首先防止错误发生”--这并不总是可能的/容易的。
还有其他想法吗?
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 );发布于 2010-01-29 15:44:41
触发器不能失败,并且仍然让事务前滚。您有几个选项可以确保触发器不会失败。
1-通过重复检查约束的逻辑和不尝试违反约束的操作,可以确保after不会失败:
即
INSERT INTO test WHERE val IS NOT NULL2-您可以通过使用队列设计模式来延迟可能失败的操作,在队列设计模式中,可能或不可能失败的操作通过排队到一个表中,在该表中,登记操作不可能失败。
即
INSERT INTO ACTION_QUEUE (action, parameters) VALUES ('INSERT INTO TEST', val)发布于 2010-01-29 17:05:42
由于触发器在SQL Server中的实现方式,触发器中所有违反约束的行为都会导致事务失败。
这与做以下工作一样:
DROP TABLE test
CREATE TABLE test
(
a INT NOT NULL
)
GO
SET XACT_ABORT ON
GO
BEGIN TRANSACTION
BEGIN TRY
INSERT
INTO test
SELECT NULL
END TRY
BEGIN CATCH
INSERT
INTO test
SELECT 1
END CATCH这会导致事务失败,只是在触发器中无法禁用XACT_ABORT。
SQL Server也缺乏自主事务。
这也是为什么应该将所有逻辑都放入存储过程而不是触发器中的另一个原因。
发布于 2012-05-01 18:29:53
。
https://stackoverflow.com/questions/2162966
复制相似问题