【问题标题】:How do you check for updates across many tables in Oracle?如何检查 Oracle 中多个表的更新?
【发布时间】:2010-11-23 06:40:50
【问题描述】:

我有一个触发器来检查表中的单个列,当该列中有更新(更新后)时,我的触发器被调用,然后我从触发器中调用存储过程以执行某些业务用 Java 编码的逻辑。

到目前为止,一切都很好。现在事情变得越来越复杂,有一个新要求意味着如果其他 4 个表中的列发生变化,也应该执行相同的逻辑(触发器执行的逻辑)。我认为在 5 个不同的表中使用相同的触发器来监听不同的列是不切实际的,我不确定是否应该考虑为这些列创建一个“视图”并在该视图中放置一个触发器(成本是多少按性能和/或资源付费?)

在您之前使用 Oracle 的经验中,您针对这种情况采取了哪些方法或解决方案?

【问题讨论】:

    标签: oracle view triggers


    【解决方案1】:

    多个表使用一个触发器的唯一方法是创建视图。

    如果我不想创建视图,我会创建一个脚本(或其他任何东西,使用您想要的语言)和一个要在其上创建此触发器的表列表(使触发器的创建动态化)。 .我明白你的意思是在这种情况下具有最佳的可维护性,我认为创建视图比为每个表动态创建触发器更清洁(并且易于维护)。

    【讨论】:

    • 我们最终决定使用一种将视图用于特定目的的方法,但我们必须在设计中为某些特定目的保留几个触发器。您的回答与我们决定做的最相似,但其他建议很棒,实际上也得到了考虑。谢谢 Svetlozar!
    【解决方案2】:
    1. 你真的可以创建一个视图来连接所有有问题的表吗?他们彼此有外键吗?
    2. 假设您可以创建一个视图,是否所有表都可以使用复杂视图进行更新?对此有严格的限制。
    3. 通常,我们只在视图上创建 INSTEAD OF 触发器。基于 UPDATE 操作的触发器也有限制。有关所涉及问题的完整列表,请参阅

    http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7004.htm#SQLRF01405

    注意:我假设 ORACLE 是数据库,因为您已使用 ORACLE 标记了您的问题

    【讨论】:

    • 是的,我正在使用 Oracle。我可以在一个视图中加入所有这些列,但我仍然不确定我是否能够更新这个复杂的视图,所以我认为 INSTEAD OF 方法对我有用。我会尝试这种方法,然后我会告诉你发生了什么。
    • 感谢 bkm,我们正要实施这种方法 (INSTEAD OF),但我们面临一些无法克服的技术限制和约束。
    【解决方案3】:

    为什么不在存储过程中包含您的逻辑,然后从触发器中调用它?

    我还建议你看看change notification,从它的声音来看,这可能是你想要的,而不仅仅是一个普通的旧触发器。

    调用外部资源时也要小心。您在触发器中调用的任何内容都应该是事务性的,因为 Oracle 可能会在您的 DML 实际完成之前多次运行触发器。

    【讨论】:

    • 特别感谢关于触发器中事务操作的提醒,这帮助我指出了候选解决方案的问题。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2022-01-27
    • 2017-05-17
    • 2011-05-04
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    相关资源
    最近更新 更多