【问题标题】:Alter trigger from another trigger从另一个触发器更改触发器
【发布时间】: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 无关.)

标签: oracle triggers alter


【解决方案1】:

这不是管理触发器激活的实用方法,出于同样的原因,我建议不要使用“自动”来解决它,因为想要为 all 个用户,因为这通常会破坏应用程序。

您更有可能希望禁用此当前会话的触发器,例如,执行某种维护活动等。对于此任务,您可以将触发器编码为具有标志为了让你控制它的执行。

因此,您的代码将类似于(伪代码):

trigger my_trigger
before insert ...
begin
  if i_am_meant_to_fire then
     ...
     ... my normal code
     ...
  end if;
end;

然后,您可以在会话级别控制触发器何时应采取任何行动。它始终处于启用状态,但可能不会根据标志执行任何操作。

这里有一些选项的完整演练

https://youtu.be/P1OFbNhgT1k

【讨论】:

    猜你喜欢
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多