在Oracle中的触发器中如何更新同一行?

3
短问题,因为我不知道如何搜索。我可以“重新更新”同一行吗?例如,我有一个字段存储付款的小计,根据我的业务约束,我可以更新该值。我能否仅使用触发器更新同一行的总计?谢谢!
顺便说一下,我正在使用Oracle和PL/SQL。
业务规则:我有以下内容。有一个存储将支付数据的表,另一个存储要支付的月费用的表,还有一个存储可能的折扣的表。一个将支付只能打一次折扣,而将支付存储小计和总计。所以,我正在做的是...“当折扣信息被更新并提交后,更新总价值和费用的值”。
2个回答

4
您不能更新触发器正在触发的表,否则会出现ORA-04091变异表错误。您可以使用:NEW语法在行本身中更新值,只要它是“before”触发器即可。
不过我不清楚您所说的小计是什么意思;如果它是基于同一表中的其他记录(例如,您有多个相同订单的记录,并且您希望插入的记录具有所有先前记录的总和),那么您也无法这样做,因为您将遇到相同的ORA-04901错误。
如果您正在更新一行,则可以通过设置例如: NEW.subtotal:=:OLD.subtotal - :OLD.value + :NEW.value 来调整字段,但是不确定该字段的好处是什么。
看到您的业务逻辑以及它如何与插入/更新配合使用以及您希望触发器执行什么非常有帮助。通常,在这种情况下,您真正想要使用包装程序来包装插入/更新,而不是触发器,但目前还有点模糊。
为了使小计保持准确,我可能会避免尝试全面维护它,而是使用一个视图,其中有一个分析函数为您计算它。根据我的经验,这会少很多麻烦。

@user1231958 - 我肯定会考虑使用存储过程来完成这个任务。最好在提交之前进行更新,以避免同时更新导致的问题。 - Alex Poole
如果出现某种情况,有人进入了SQL*Plus控制台或类似的工具,并以错误的方式插入/更新数据,导致一切混乱,那该怎么办? - Carlos Vergara
@user1231958 - 这听起来可能有点轻率,但如果它是那么脆弱的话……不要让他们这样做。没有人应该作为表的所有者连接,他们可以使用其他 ID,并通过角色和授权进行访问控制。然后,根本不要给任何人在表上插入/更新权限,只给他们执行存储过程(或更可能是一组存储过程)的权限。如果由于某些原因不可能实现这一点,那么计算数字的视图仍然可以运行。 - Alex Poole
这是不可能的,因为很有可能我的教授会检查表格,所以他会拥有这个访问权限。 - Carlos Vergara
@user1231958 - 我完全忽略了作业标签。我不确定它如何执行一次折扣规则,但也许你只需要使用一个before-insert触发器将subtotal设置为total - discount。真的不确定你的教授在这里寻找什么,或者你学到了什么 - 解决方案应该与你已经知道的东西有些相似,我猜测。 - Alex Poole
啊!我必须添加那个标签吗?抱歉。无论如何,所以,我被迫使用一个before insert触发器,对吧?显然这是我的最佳解决方案,谢谢。 - Carlos Vergara

1

可以 - BEFORE INSERT for each row 触发器可以修改正在插入的值。


这是在INSERT完成之后 - 一旦插入了行,就无法更改它们。 - Adam Musch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接