【发布时间】:2018-04-04 04:37:27
【问题描述】:
我需要一些帮助。 我正在尝试创建一个触发器,该触发器在对特定表执行插入、删除或更新操作时执行一个过程。 这是触发器
CREATE OR REPLACE NONEDITIONABLE TRIGGER NQDI.GAV_TRG
AFTER INSERT or UPDATE or DELETE ON D_GAV
FOR EACH ROW
BEGIN
PRC_FILL_D_GAV(:old.report_name);
END;
不幸的是,由于触发器在任何提交完成之前启动并且我需要从同一个表中读取,它给了我“D_GAV 表正在修改无法读取”错误。 此外, FOR EACH ROW 使触发器在每条记录发生变化时开始,而我希望触发器只在最后开始,当每次更新、插入或删除都已提交时,但我没有在执行此操作时找到一种方法来保留 :old.report_name。 我知道我可以通过“启动并运行的过程”来做我想做的事,但我想避免这种情况。还有其他我忽略的解决方案吗?
【问题讨论】:
-
只需删除
FOR EACH ROW子句,然后每条语句触发一次,而不是每条记录触发一次。但是,在这种情况下,您无法访问:old.report_name -
是的,我想过,但它给了我错误“表级触发器中不允许新或旧引用”,而我绝对需要那个变量
-
您不能将触发器与事务分开,即 COMMIT。将所有内容放在一个过程中,并在那里执行您需要的所有操作。
-
你到底想在
PRC_FILL_D_GAV(:old.report_name)做什么? -
@Wernfried Domscheit 我明白,但不能这样做。还有其他进程可以更改该表(不在我的控制之下),因此我需要触发器来执行该过程。否则,我必须不断检查它是否已更改。 @ Kaushik Nayak 该过程会修改与 D_GAV 相关的表上的一些记录,但有些字段是从 D_GAV 本身读取的。
标签: sql oracle triggers oracle12c