【发布时间】:2022-01-13 09:49:22
【问题描述】:
我希望在另一个触发器下拥有改变触发器。
CREATE TRIGGER izmeni_naziv_kupac
AFTER UPDATE OF naziv ON Kupac
FOR EACH ROW
DECLARE
novi_naziv varchar2(255);
pibK INT;
BEGIN
EXECUTE IMMEDIATE 'ALTER TRIGGER ZabranaPromeneNazivaKupaca DISABLE';
pibK := :new.pib;
novi_naziv := :new.naziv;
UPDATE Porudzbina
SET naziv_kupca = novi_naziv
WHERE kupac_PIB = pibK;
EXECUTE IMMEDIATE 'ALTER TRIGGER ZabranaPromeneNazivaKupaca ENABLE';
END;
问题是系统发送错误信息:
ORA-04092:无法在触发器中提交
ORA-06512:在“SYSTEM.IZMENI_NAZIV_KUPAC”,第 5 行
ORA-04088: 执行触发器 'SYSTEM.IZMENI_NAZIV_KUPAC' 期间出错
【问题讨论】:
-
陈述你要解决的真正问题会很有帮助;看起来您希望更新
Porudzina以不触发该表上的触发器,而该更新是更新Kupac的副作用?如果是这样,并且您可以修改另一个触发器,您可以添加一个when以根据上下文停止触发它,也许? (Something like this, perhaps.) -
真正的问题是我需要运行此触发器并在此触发器下禁用/启用前一个触发器而不是触发器。是教授的要求。没有意见。我已经通过 pragma automatic_transaction 解决了,但不确定是否可以。非常感谢。另一个触发者应该避免直接更改 porudzbina,而这应该允许基于表 Kupac 的更改。疯狂的非规范化?非常感谢修改我的代码,但我不明白你为什么更改标题(非常重要的是我们谈论 Oracle)以及标记 sql-developer。在其他一些 Oracle 环境中我没有问题
-
如果你必须这样做,那么据我所知,自主事务是唯一的方法。
-
非常感谢。好的,将使用自治
-
在禁用触发器期间,什么会阻止其他人更新
Porudzina中的行?并且 - 如果整个第二个触发器是自主的 - 其中的更新独立于Kupac上的触发更新,它仍然可以回滚。我真的希望这不是你的教授认为的好主意;看看实际的需求会很有趣。 (至于标题...我为 Oracle 添加了一个 tag 以便不需要在标题中;这与 SQL Developer client 无关.)