【问题标题】:Is it better to have single trigger for Insert/Update/Delete, or multiple?插入/更新/删除的单个触发器还是多个更好?
【发布时间】:2012-03-27 05:03:23
【问题描述】:

我需要将插入/更新/删除操作从一个表镜像到另一个表。 例如,必须将 tableA 上的 insert 复制到 tableB 中,将 tableA 更新应用于 tableB,并将 tableA 中的删除应用于 tableB。 就这么简单,除了 tableB 有 1 个额外的列用于常量值,所以需要非常简单的触发器。

我不确定是编写 3 个单独的触发器更好,还是让一个触发器完成所有操作。

这适用于 3 个数据库:Sybase ASE、MSSQL 和 Oracle,我想让它保持相似的解决方案(因此所有数据库使用 3 个或所有数据库使用 1 个)。

3 个触发器与 1 个触发器只是偏好问题,还是这两种解决方案都有实际好处?

【问题讨论】:

  • 您能否更新 tableB 的结构,使其仅引用 tableA 和附加列 - 这样您只存储一次数据。
  • 你考虑过复制吗?
  • 其实还有tableC,它的操作也镜像到了TableB中。附加字段包含有关从哪个表复制此行的信息。不过,我将不得不研究您发布的建议,但从技术上讲,我不确定如何执行其中任何一个建议。我希望只有一个表 (tableB),并且没有 tableA 或 tableC,但是目前这不是一个选项,我们有旧代码更新 tableA 和 tableC。
  • @Alex - 应该很可能有一个表并创建名为 tableAtableC 的视图,您的旧代码可以在其上执行 DML。那么您将只有一份数据副本。您可能需要在视图上设置触发器以使其可更新,但如果这些视图只是选择基表中的列子集并且基表具有主键,则这种情况不太可能发生。

标签: sql-server database oracle triggers sap-ase


【解决方案1】:

在尝试确定表 A 上的操作是什么时,除了触发器执行本身的效率损失之外,分离触发器不会获得任何效率。

IE 3 单独的触发器可以不使用验证逻辑来​​确定刚刚在表 A 上发生的事情,因为被触发的触发器本身可以在气泡中运行,因为它知道自从它被触发以来,它是由单个操作引起的。

而 3 合 1 触发器,您必须检查虚拟删除和插入表的状态,并在每次触发时派生操作。

如果您不担心派生“动作”对性能的影响(当然很小),或者甚至不需要在表 B 中知道刚刚发生在 Aable A 上的“动作”......那么我认为 1 完全没问题。

【讨论】:

    【解决方案2】:

    假设您实际上需要一个触发器,并且表 B 不能简单地定义为表 A 之上的视图,或者表 B 不能仅使用引用 A 中的行以及常量的外键来定义,那么A 不能被重新定义以添加额外的列(可能具有常量的默认值),一个触发器至少可以让您将所有相关逻辑保存在一个地方,而不是在执行诸如添加之类的操作时需要更新多个地方A 的新专栏。但我会非常警惕任何涉及使用两个不同的表来反映两者中基本相同的数据的架构。这违反了规范化,增加了系统的 I/O 工作负载,并使整个系统更加复杂。

    【讨论】:

    • 同意所有观点,但目前我能做的不多。希望这张新桌子将成为未来的“桌子”。谢谢你的回答。
    猜你喜欢
    • 2015-04-26
    • 2014-02-16
    • 2011-05-05
    • 2010-10-18
    • 2011-02-27
    • 2011-11-25
    • 2020-02-02
    • 2012-09-19
    • 2011-04-22
    相关资源
    最近更新 更多