Oracle Apex:从表a中的触发器调用表B中的触发器

Oracle Apex:从表a中的触发器调用表B中的触发器,oracle,triggers,oracle-apex,Oracle,Triggers,Oracle Apex,我试图执行表A中的触发操作,导致表B中的触发操作,但我得到以下错误 ORA-04091: table IMIT.INFRA_ASSETS_MASTER is mutating, trigger/function may not see it ORA-06512: at "IMIT.SUBNET_LOOKUP_DELETE_TRIGGER", line 15 ORA-04088: error during execution of trigger 'IMIT.SUBNET_LOOKUP_DELET

我试图执行表A中的触发操作,导致表B中的触发操作,但我得到以下错误

ORA-04091: table IMIT.INFRA_ASSETS_MASTER is mutating, trigger/function may not see it
ORA-06512: at "IMIT.SUBNET_LOOKUP_DELETE_TRIGGER", line 15
ORA-04088: error during execution of trigger 'IMIT.SUBNET_LOOKUP_DELETE_TRIGGER'
ORA-06512: at "IMIT.INFRA_MASTER_DELETE_TRIGGER", line 2
ORA-04088: error during execution of trigger 'IMIT.INFRA_MASTER_DELETE_TRIGGER'
因此,当我从表中删除一项时,它将调用此触发器

CREATE OR REPLACE EDITIONABLE TRIGGER  "INFRA_MASTER_DELETE_TRIGGER" 
   before delete on infra_assets_master
   for each row
begin
   DELETE FROM SUBNET_LOOKUP WHERE LINK_ID = :old.ID AND DEF_ID = 3;
   INSERT INTO HISTORY (IT_TABLE,ITEM_ID,ACTION_TYPE,ACTION)VALUES('INFRA_ASSETS_MASTER',:old.ID,3,CONCAT(CONCAT('Infrastructure Asset  ', :old.ASSET_ID),' deleted'));
end;
它将删除另一个表中的另一条记录,并调用该表中的delete触发器

CREATE OR REPLACE EDITIONABLE TRIGGER  "SUBNET_LOOKUP_DELETE_TRIGGER" 
   before delete on subnet_lookup
   for each row
declare
  v_def varchar2(255);
  v_link varchar2(255);
  v_subnet varchar2(255);
  v_sen varchar2(255);
begin
   select NAME into v_def from subnet_lookup_definition where id = :old.DEF_ID;
   v_sen := 'Remove Link Between ';
   if :old.DEF_ID = 1 then
      select hostname into v_link from servers_master where id = :old.LINK_ID;
      v_sen := concat(v_sen,concat(concat('Server ''', v_link),''''));
   end if;

   if :old.DEF_ID = 3 then
      select asset_id into v_link from infra_assets_master where id = :old.LINK_ID;
      if v_link IS NULL then
        select hostname into v_link from infra_assets_master where id = :old.LINK_ID;
      end if;
      v_sen := concat(v_sen,concat(concat('Infrastructure Assets ''', v_link),''''));
   end if;

   if :old.DEF_ID = 4 then
      select asset_id into v_link from assets_master where id = :old.LINK_ID;
      v_sen := concat(v_sen,concat(concat('IT Assets ''', v_link),''''));
   end if;

   select address into v_subnet from subnet where id = :old.SUBNET_ID;

   v_sen := concat(concat(v_sen, concat(' to ', v_subnet)),' has been deleted');

   insert into HISTORY (IT_TABLE, ITEM_ID,ACTION_TYPE, ACTION) VALUES ('SUBNET_LOOKUP',:old.SUBNET_ID,3,v_sen);
end;
我不明白是什么问题

我如何解决这个问题

“问题是什么?”

当您删除
infra\u assets\u master
时,表上的触发器将在
子网\u查找中执行子记录的删除。但该表也有一个触发器,用于查找其父
infra\u assets\u master
记录。这是您要删除的记录。Oracle不知道如何解决这一困惑,因此抛出了变异表错误

“如何解决此问题?”

通过移除循环依赖关系。您需要更改您的业务逻辑,以避免查询
基础资产\u主数据
。具体如何做到这一点是您的问题,因为这是您的业务逻辑,而不是我们的业务逻辑,但本质上您需要找到一种方法,仅使用正在删除的表中的信息填充历史记录表。或者,将所有子网查找删除触发器逻辑放入一个从INFRA\u MASTER\u DELETE\u触发器调用的存储过程中