0

我有一个创建后触发器,它从插入的行中读取数据,对其进行解析并将其添加到另一个表中。

但是当这个触发器失败时,我的整个插入失败。我的问题是

  1. 为什么在创建触发器之后被视为插入操作的一部分,即使它在插入完成并检查约束和验证后被触发?

  2. 有什么方法可以将触发器的执行与插入操作分离?

失败可能类似于触发器尝试插入的另一个表上的数据约束违规。即使没有失败,如果触发器在插入事务之外执行,则可以改善事务时间。

4

2 回答 2

1

您可以使用队列表和后台作业来防止触发器使外部事务失败。所有必须成功的就是插入到队列表中。

CREATE TABLE dbo.TriggerProcessingQueue
(
  ...columns...,
  Processed BIT NOT NULL DEFAULT = 0
);

所以现在触发器可以只对这个队列表执行插入操作,并且一些后台作业可以执行所有行的处理 whereProcessed = 0并将它们标记为Processed = 1. 现在,当后台作业运行时,这可能会稍微干扰触发器,但您可以通过简单地调整作业的计划和/或每次处理的行数来微调它。

您也可以考虑服务代理,但激活过程必须知道要处理哪些数据......

于 2013-09-26T16:49:41.000 回答
1

为什么在创建触发器之后被视为插入操作的一部分,即使它在插入完成并检查约束和验证后被触发?

插入和触发器被认为是一个事务。如果失败,则交易失败,因此会回滚以保持数据完整性

有什么方法可以将触发器的执行与插入操作分离?

您可以将其包装在 try catch 块中。

于 2013-09-26T16:03:05.710 回答