【问题标题】:Can you disable a trigger within a trigger? SQL Server 2008您可以在触发器中禁用触发器吗? SQL Server 2008
【发布时间】:2012-07-06 11:59:36
【问题描述】:

您能否在触发器中禁用和重新启用触发器?

例如,我在前端应用程序中有一条信息可以放在两个位置之一。如果有人将它放在 A 位置,我想将它复制到 B 位置,反之亦然。

所以,我的想法是在不同的表上放置两个触发器 1)当它放在 A 中时,它会放在 B 中。2)当它放在 B 中时,它会放在 A 中

这将创建一个永无止境的循环(我假设?)所以您可以在触发器 2 运行时禁用触发器 1 并在最后启用它吗?

【问题讨论】:

  • 您不应该这样做 - 如果连接 1 刚刚在表 A 上进行了插入 - 触发器禁用表 B 上的触发器 - 现在连接 2 在那里进行插入,而触发器没有火。
  • 每当您考虑在数据库中复制数据时,您首先应该问自己模型是否正确——A 和 B 是否应该是建立在单个视图之上的两个视图比如表?
  • 100 次中有 99 次我都同意你的观点。将它放在 2 个位置的原因是因为一个是前端的任何人都可以覆盖的字段,另一个是固定的,"仅查看”区域(因为它像网格一样可见)。人们懒得把数据放在这两个区域,所以我想办法自动将数据从一个区域复制到另一个区域,反之亦然。

标签: sql sql-server-2008 triggers


【解决方案1】:

虽然我同意 Damien 的评论,即在同一个数据库中的两个表中复制数据通常是不可取的,但如果您确实有充分的理由这样做,那么您可以使用 INSTEAD OF 触发器而不是 AFTER 触发器(我假设你现在正在看)。这样你就可以用你自己编码和控制的两个独立的INSERTs“替换”一个INSERT

【讨论】:

  • 谢谢 - 没有遇到 INSTEAD OF 触发器,所以看起来它可以很好地解决问题!
【解决方案2】:

是的,你可以:

ALTER TABLE tablename DISABLE TRIGGER triggername
ALTER TABLE tablename ENABLE TRIGGER triggername

虽然,对于您的解决方案,我会创建一个在每一侧运行相同的触发器,并且足够聪明,不会搞砸自己。

即让触发器智能地区分用户/客户端 INSERT 和触发器“MOVE”。

【讨论】:

    【解决方案3】:

    或者您可以在更新之前检查触发器中的信息是否发生了变化,这样会结束循环?

    【讨论】:

      猜你喜欢
      • 2015-01-31
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多