Sql server 创建触发器后的SQL Server
我有一个aftercreate触发器,它从插入的行中读取数据,对其进行解析并将其添加到另一个表中 但是当这个触发器失败时,我的整个插入都失败了。我的问题是Sql server 创建触发器后的SQL Server,sql-server,triggers,Sql Server,Triggers,我有一个aftercreate触发器,它从插入的行中读取数据,对其进行解析并将其添加到另一个表中 但是当这个触发器失败时,我的整个插入都失败了。我的问题是 为什么创建后触发器被视为插入操作的一部分,即使它在插入完成并检查约束和验证后被触发 有没有办法将触发器的执行与插入操作分离 失败可能类似于触发器尝试插入到的另一个表上的数据约束冲突。即使没有失败,如果触发器在insert事务之外执行,也可以缩短事务时间 为什么创建后触发器被视为插入操作的一部分 即使在插入和约束完成后激发它 是否检查验证 插入
你可以把它包在试抓块里 您可以使用队列表和后台作业来防止触发器使外部事务失败。要想成功,只需在队列表中插入
CREATE TABLE dbo.TriggerProcessingQueue
(
...columns...,
Processed BIT NOT NULL DEFAULT = 0
);
因此,现在触发器只需在这个队列表中执行一次插入,一些后台作业就可以对Processed=0
的所有行执行处理,并将它们标记为Processed=1
。现在,当后台作业正在运行时,这可能会稍微影响触发器,但是您可以通过简单地调整作业的时间表和/或每次处理的行数来对其进行微调
您也可以考虑service broker,但激活过程必须知道要处理哪些数据…因为在执行事务之前会检查数据完整性,为什么它必须是事务的一部分?
AFTER指定只有在触发SQL语句中指定的所有操作都已成功执行时才会触发DML触发器。在触发此触发器之前,所有引用级联操作和约束检查也必须成功。
->这来自microsoft文档这可以通过触发器内部的异常管理实现,请检查此讨论“触发器失败”是什么意思?你能说得更具体些吗?这里发生的失败类型可以决定你能做些什么来解决这个问题。@AaronBertrand:我已经更新了我的问题。即使触发器没有出现故障,也可以通过让触发器在insert之外独立运行来缩短事务时间transaction@Vimsha触发器在做什么?@AaronBertrand:触发器解析插入的数据并在另一个表中创建一行。这是一个相当复杂的解析过程。所以我希望事务不要等到解析完成