【问题标题】:Are Sql Triggers synchronous or asynchronous?Sql 触发器是同步的还是异步的?
【发布时间】:2008-10-16 20:12:12
【问题描述】:

我有一个表,上面有一个插入触发器。如果我在存储过程的一个插入语句中向该表中插入 6000 条记录,存储过程会在插入触发器完成之前返回吗?

为了确保我的想法正确,触发器应该只被调用一次(我知道“调用”不是正确的词),因为只有 1 个插入语句,对吧?

我的主要问题是:即使触发器尚未完成,存储过程也会完成吗?

【问题讨论】:

    标签: sql stored-procedures triggers timing


    【解决方案1】:

    您的插入触发器将针对整个插入语句运行一次。这就是为什么使用inserted 临时表来查看实际插入的内容很重要,而不仅仅是选择最近的单个记录或类似的东西。

    我刚刚测试了一个插入和更新触发器,事实上,它们被 sql server 视为插入的一部分。在触发器完成之前,该过程不会完成。

    【讨论】:

    • 感谢您提及这一点。我忘记了这一点,并且使用我即将部署的触发器在类似情况下做了我不应该做的事情。我只是重写了它来处理插入的整个插入集,而不是最近的 id。哎呀!可能是一个地狱般的错误。 ;)
    【解决方案2】:

    触发器是调用它们的事务的一部分。

    您必须注意的关于触发器的重要一点是触发器为每个事务触发一次(至少在 SQL Server 中,您应该检查其他数据库,但即使它会逐行处理,这通常是糟糕的主意),所以如果你插入 6000 条记录,触发器会触发一次而不是 6000 次。许多人没有意识到这一点并编写触发器,就好像他们将处理多个记录一次插入一条记录一样。这不是真的,您的触发器必须考虑处理多条记录插入。

    【讨论】:

    【解决方案3】:

    触发器调用不是异步的。对您的插入过程的每次调用都会触发触发器,并且在触发器完成之前该过程不会返回。

    查看查询计划以了解其工作原理。您会看到,每次调用过程都会调用触发器中的语句。

    【讨论】:

      【解决方案4】:

      问题是,每次满足 TRIGGER 条件时,TRIGGER 都会触发。它在批处理或事务中触发一次。在 TRIGGER 上查看我的lesson 101

      【讨论】:

        【解决方案5】:

        您应该在插入语句中使用游标来处理触发行。 因为 SQL Server 中的触发器每条语句触发一次,而不是每行一次。

        【讨论】:

        • 在任何情况下都不应该在 sql server 触发器中使用游标。您需要编写游标以保持数据完整性并尽可能快地运行。虽然游标可能是第一个,但它最后却惨遭失败。您应该使用基于集合的处理。我不想在通过游标处理可能需要几秒钟或几毫秒的事情时将我的表锁定几个小时。我们删除了一个从 45 分钟处理 40,000 条记录到 40 秒的她。在触发器中使用游标是不负责任的。
        猜你喜欢
        • 2010-09-10
        • 2021-03-17
        • 2020-05-15
        • 2020-02-21
        • 2013-02-25
        • 2012-12-30
        • 2014-04-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多