Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 创建触发器后的SQL Server_Sql Server_Triggers - Fatal编程技术网

Sql server 创建触发器后的SQL Server

Sql server 创建触发器后的SQL Server,sql-server,triggers,Sql Server,Triggers,我有一个aftercreate触发器,它从插入的行中读取数据,对其进行解析并将其添加到另一个表中 但是当这个触发器失败时,我的整个插入都失败了。我的问题是 为什么创建后触发器被视为插入操作的一部分,即使它在插入完成并检查约束和验证后被触发 有没有办法将触发器的执行与插入操作分离 失败可能类似于触发器尝试插入到的另一个表上的数据约束冲突。即使没有失败,如果触发器在insert事务之外执行,也可以缩短事务时间 为什么创建后触发器被视为插入操作的一部分 即使在插入和约束完成后激发它 是否检查验证 插入

我有一个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:触发器解析插入的数据并在另一个表中创建一行。这是一个相当复杂的解析过程。所以我希望事务不要等到解析完成