我应该创建一个公共触发器还是几个小触发器?

时间:2015-05-07 11:55:34

标签: database oracle triggers

什么是更好的编程实践:

编写一个处理多个方面/规则的常用触发器?

为每条规则编写一个触发器?

例如,我有一个数据库' Library'有4个表:

期刊,客户,书籍和Books_types。

关于INSERT到表日记的规则:

  1. 字段DATE_END应自动生成;
  2. 书籍中的字段COUNT应减少;
  3. 应减少Book_types中的字段COUNT。
  4. 什么是更好的选择:3个小触发器或1个常见触发器?

6 个答案:

答案 0 :(得分:1)

这在某种程度上取决于确切的要求(一如既往),但只有一个触发器有一些优点:

  1. 根据documentation,触发器的执行顺序是未定义的,我不希望在我的应用程序中出现任何类型的不确定行为。
  2.   

    Oracle以未指定的随机顺序触发多个触发器,如果   对于给定的语句,存在多个相同类型的触发器;   也就是说,同一语句的相同类型的触发器不是   保证以任何特定顺序开火。

    1. 根据规则“将一个信息保存在一个地方”我宁愿在一个触发器中添加所有逻辑。您可以在该触发器中进行多个过程或函数调用,以便遵循“分而治之”模式。

    2. 很可能一个触发器在执行时间方面更快,并且不会增加三个触发器的复杂性。试想一下,如果你有100个触发器而不是100个触发器......

    3. 根据您是否遇到ORA-04091: table Journal is mutating错误,您甚至可能需要将逻辑拆分为多个触发器。请在此网站上查看avoiding mutation tables

答案 1 :(得分:1)

这里真的不是最好的做法;这完全取决于你正在做什么以及它有多复杂。

我会将字段的默认值放在BEFORE行触发器的Library表中。因此DATE_END的默认值(假设我无法使用DEFAULT SYSDATEDEFAULT CURRENT_TIMESTAMP作为字段约束)。那样我一次写到桌子上。如果我对该字段有NOT NULL DEFAULT NULL个约束,我认为BEFORE触发器是唯一的方法。

然后我对其他表中的字段使用AFTER语句或AFTER行触发器,主要是因为可能存在外键或其他类似要求,这些要求需要我当前插入的数据实际上在表(如序列生成的ID)。它似乎在哲学上更正确,但我对Oracle约定的熟悉程度要低于其他人。

答案 2 :(得分:0)

个人而言,我会用一个触发器做到这一点,让维护它的人更容易看到发生了什么

答案 3 :(得分:0)

我认为它会给出变异错误。因为小触发器可能包含一些会产生变异错误的动作。

例如 - 您无法为AFTER INSERT事件编写更新触发器。

答案 4 :(得分:0)

最好使用您要生成插入的方法实现规则。因为修改规则可以在进一步增长,这将影响dml性能

答案 5 :(得分:0)

我建议使用几个有针对性的触发器 - 每个操作一个。

这样,您不需要花费任何时间在触发器本身中编写任何代码来弄清楚您正面临的操作 - 从触发器FOR UPDATE或{{1 }}。这使得触发器代码更简单,更不容易出错,并且将来更容易维护。