关于复合触发器的使用,我有一个非常简短的问题。
我对数据库/sql/oracle 非常陌生,并且有一个 uni 任务,我必须为以下内容创建触发器:
- 销售人员创建订单时插入日志表
- 订单准备好发货时更新订单表(加上插入日志)
- 在星期五下午 5 点到星期一上午 9 点之后防止插入、更新、删除。
我已经成功实现了触发器,但刚刚意识到 11g 中的复合触发器。考虑将上述内容组合成一个复合触发器是否合适?这是他们的目的还是我错过了重点?
非常感谢您查看这个相当模糊的问题。
IMO 这不合适。复合触发器允许您为给定表上的给定操作捕获四个不同的触发点(语句前、操作前、操作后和语句后),但看起来像 A)您在多个表上触发,并且B)您不需要服务所有不同的触发点。(顺便说一句,我在这里使用的“动作”可能意味着不同的语句类型,例如,在插入之前,更新,删除......)。
复合触发器为解决不受欢迎的 ORA-04091 MUTATING TABLE 错误提供了一种很好、干净且紧凑的方法,但在大多数情况下,我认为它们作为通用的万能替代品没有必要或有用“正常”触发器。例如,请参阅我对这个问题的回答。
分享和享受。
哇 - 复合触发器 - 甚至不知道它们存在......
我迅速查阅了文档
使用复合触发器的主要原因解释如下:
复合触发器使您可以更轻松地对一种方法进行编程,在该方法中,您希望为各个时间点实施的操作以共享公共数据。要使用简单的触发器实现相同的效果,您必须使用辅助包对公共状态进行建模。当触发语句导致错误并且语句后触发器没有触发时,这种方法既编程繁琐,又容易发生内存泄漏。
因此,除非您需要包变量来实现您的功能,否则没有理由使用它们。而且您的代码将不再与 10g 兼容。