如何检查Oracle中许多表的更新?

时间:2009-08-27 06:36:57

标签: oracle view triggers

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

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

在您之前使用Oracle的经历中,您的方法或解决方案适用于此方案?

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

  1. 你真的可以创建一个加入所有相关表格的视图吗?他们互相拥有外键吗?
  2. 假设您可以创建视图,是否可以使用复杂视图更新所有表?这有严重的限制。
  3. 通常,我们只在视图上创建INSTEAD OF触发器。基于UPDATE操作的触发器也有限制。有关所涉及问题的完整列表,请参阅
  4. http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7004.htm#SQLRF01405

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

答案 2 :(得分:2)

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

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

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