应用Oracle 11g复合触发器

时间:2012-05-15 15:51:38

标签: sql oracle triggers oracle11g

我只是对复合触发器的使用提出了一个非常快速的问题。

我是数据库/ sql / oracle的新手,并且有一个uni任务,我必须为以下内容创建触发器:

  1. 销售人员创建订单时插入日志表
  2. 订单表更新时,订单已准备好发货(加上插入日志)
  3. 在星期一下午5点至星期一上午9点​​之前阻止INSERT,UPDATE,DELETE。
  4. 我已经成功实现了触发器,但刚刚意识到11g中的复合触发器。考虑将上述内容组合成一个复合触发器是否合适?这是他们的意思,还是我错过了这一点?

    非常感谢您查看这个相当含糊的问题。

2 个答案:

答案 0 :(得分:3)

IMO不合适。对于给定表上的给定操作,复合触发器允许您捕获四个不同的触发点(在语句之前,在操作之前,在操作之后和在语句之后),但它看起来像A)您在多个表上触发,并且B)您无需为所有不同的触发点提供服务。 (顺便说一句,我在这里使用它的“动作”可能意味着不同的语句类型,例如,BEFORE INSERT,UPDATE,DELETE ......)。

复合触发器使得一种漂亮,干净,紧凑的方法可以解决从未流行的ORA-04091 MUTATING TABLE错误,但在大多数情况下,我发现它们不是必需的或有用的通用的 - 所有替换“正常”触发器。有关示例,请参阅我对this question的回答。

分享并享受。

答案 1 :(得分:1)

哇 - 复合触发器 - 不知道它们甚至存在......

我很快抬起头来the documentation

使用复合触发器的主要原因解释如下:

  

复合触发器可以更轻松地为您编写方法   想要为各个时间点分享实施的行动   共同数据。要通过简单的触发器实现相同的效果,您就拥有了   用辅助包来模拟公共状态。这种方法是   编程既麻烦又容易出现内存泄漏   触发语句导致错误和后语句触发器   没发射。

因此,除非您需要包变量来实现您的功能,否则没有理由使用它们。而你的代码将不再兼容10g。