oracle sql触发器循环更新和删除

oracle sql触发器循环更新和删除,sql,oracle,Sql,Oracle,我在oracle上的触发器有问题 我有这样的想法: Project ------- currentProgress plannedLoads currentLoads Step ---- currentProgress plannedLoads currentLoads Task ---- currentProgress plannedLoads currentLoads 项目由步骤组成,步骤由任务组成 currentProgress始终=currentLoads/plann

我在oracle上的触发器有问题

我有这样的想法:

 Project
 -------
 currentProgress
 plannedLoads
 currentLoads


Step
----
currentProgress
plannedLoads
currentLoads


Task
----
currentProgress
plannedLoads
currentLoads
项目由步骤组成,步骤由任务组成

currentProgress始终=currentLoads/plannedLoads

我在任务中插入之前有一个触发器,用于在插入、更新或删除时改进Step currentLoads,在Step currentLoads上有一个触发器用于改进项目currentLoads

所以,若我更新任务,将调用两个触发器,一个用于更新步骤,然后一个用于项目

例如,当我更新步骤时,我会更新它的当前负载

问题是当我删除一个项目时。我还必须删除与关联的步骤和任务。因此,调用Task上的触发器和delete上的Step,调用Project上的触发器

我不太清楚。如果没有,请询问我详细情况


感谢您的帮助。

这听起来不像是触发器的理想方案-最好将触发器用于附加验证(即无法通过约束而不是约束来完成的事情)/日志记录/健全性检查等,而不是应用程序逻辑

此外,我只会谨慎地使用触发器进行验证,并将其作为约束和应用程序验证的补充


我强烈建议将维护这些记录的功能转移到PL/SQL过程中,并调用该过程,而不是直接对表发出DML语句。这样,您就可以保持控制。

为什么触发器最好用于验证?这就是约束的作用。触发器最好用于在表上执行DML时更改数据或在第一个表更新后保持其他表的更新。具有应用程序逻辑的触发器基本上是隐藏行为。您必须付出额外的努力,以确保它们以理想的顺序启动,并且每行触发器会产生额外的上下文切换成本。约束是确保数据完整性的保障,触发器可以为您提供额外的能力。如果您只想在对另一个表进行更新时从一个表中删除行,那么过程无疑是最干净、最可维护的方法。我不会反驳您关于过程的建议!只是你第一句话的措辞。触发器会掩饰您没有正确执行DML,因为它们不会验证数据,这就是使用约束的原因。如果你在一个触发器中验证了某些东西在某个点上肯定会出错。注意了,我会澄清的。这是本斯之战!