【问题标题】:Trigger is not fired multiple time in sql server触发器在sql server中没有多次触发
【发布时间】:2015-08-19 11:56:55
【问题描述】:

我的表上有一个触发器,它将在行的任何更新时触发。

我的表中有 10 行。

我正在使用存储过程中的某些条件更新所有行。

我发现我的触发器只被触发了一次。

但我需要为每一行的每次更新运行触发器。

你能帮我解决这个问题吗?

【问题讨论】:

  • 触发器按语句执行,而不是按行执行,您会得到包含受影响行的元表 INSERTED 和 DELETED,您不会让触发器按行执行。

标签: sql-server stored-procedures triggers


【解决方案1】:

在您的触发器中,您有一个表 INSERTED,其架构与触发表相同,您将在其中找到插入/更新的所有 10 行。你可以这样进行批量处理。否则,您可以迭代此临时表以进行单一处理。

【讨论】:

  • 但是我有很多关于触发器中插入和删除表的语句和条件。他们还有其他方法吗?
  • 批处理是什么意思?我们正在尝试通过使用插入的表来迭代游标。但是这里要修改很多逻辑。
  • 您可以使用CURSOR 或循环对INSERTED 表进行迭代并调用存储过程或UDF。我不知道有什么方法可以在一个UPDATE 中多次调用光标。 10次​​调用存储过程和10次接收触发器有什么区别?
  • 我只调用了一次 SP,但我需要触发器应该执行 10 次。
  • 在INSERTED 上执行cursor 并调用SP 10 次。
【解决方案2】:

当您就此事寻求“帮助”时,我会尝试为您指出一个可能更好的方向。您的问题表明您可能缺乏有关 SQL 的重要知识。为了补救,您应该阅读以下内容:

http://www.codeproject.com/Articles/34142/Understanding-Set-based-and-Procedural-approaches

与基于集合的方法相比,这完全是关于程序方法的。对我来说,信息量很大。我会强调这段摘录:

数据库内部执行引擎的设计和优化 将“基于集合的指令”作为输入(SQL)并执行这些 以最好的方式进行说明(这取决于很多 标准)以产生输出。这就是为什么“基于集合的方法”是 几乎总是更好的选择。

也就是说,我相信这不仅仅是关于性能,我相信你应该修复你的设计。

或者,仍然存在使用游标的情况。您能否更具体一些并提供有关您的场景的更多信息?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多