我有一个创建后触发器,它从插入的行中读取数据,对其进行解析并将其添加到另一个表中。
但是当这个触发器失败时,我的整个插入失败。我的问题是
为什么在创建触发器之后被视为插入操作的一部分,即使它在插入完成并检查约束和验证后被触发?
有什么方法可以将触发器的执行与插入操作分离?
失败可能类似于触发器尝试插入的另一个表上的数据约束违规。即使没有失败,如果触发器在插入事务之外执行,则可以改善事务时间。
我有一个创建后触发器,它从插入的行中读取数据,对其进行解析并将其添加到另一个表中。
但是当这个触发器失败时,我的整个插入失败。我的问题是
为什么在创建触发器之后被视为插入操作的一部分,即使它在插入完成并检查约束和验证后被触发?
有什么方法可以将触发器的执行与插入操作分离?
失败可能类似于触发器尝试插入的另一个表上的数据约束违规。即使没有失败,如果触发器在插入事务之外执行,则可以改善事务时间。
您可以使用队列表和后台作业来防止触发器使外部事务失败。所有必须成功的就是插入到队列表中。
CREATE TABLE dbo.TriggerProcessingQueue
(
...columns...,
Processed BIT NOT NULL DEFAULT = 0
);
所以现在触发器可以只对这个队列表执行插入操作,并且一些后台作业可以执行所有行的处理 whereProcessed = 0
并将它们标记为Processed = 1
. 现在,当后台作业运行时,这可能会稍微干扰触发器,但您可以通过简单地调整作业的计划和/或每次处理的行数来微调它。
您也可以考虑服务代理,但激活过程必须知道要处理哪些数据......
为什么在创建触发器之后被视为插入操作的一部分,即使它在插入完成并检查约束和验证后被触发?
插入和触发器被认为是一个事务。如果失败,则交易失败,因此会回滚以保持数据完整性
有什么方法可以将触发器的执行与插入操作分离?
您可以将其包装在 try catch 块中。