2017-06-28 1 views
0

テーブルAのトリガアクションを実行しようとしていますが、テーブルBのトリガアクションが発生していますが、次のエラーが発生しています。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_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 "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; 
その表に削除トリガーを呼び出して、別のテーブルに別のレコードを削除することになります

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; 

このトリガーを呼び出します

問題は何か分かりません。

この問題を解決するにはどうすればよいですか?

答えて

0

「何の問題である」あなたがテーブルの上にinfra_assets_masterあなたのトリガーを削除すると

subnet_lookupに子レコードの削除を実行します。しかし、そのテーブルには親のinfra_assets_masterレコードを検索するトリガーもあります。あなたが削除しようとしているレコードです。 Oracleは、この混乱を解決する方法を理解していないため、変換表エラーが発生します。

「どうすればこの問題を解決できますか?」

循環依存性を削除します。 infra_assets_masterの照会を避けるには、ビジネスロジックを変更する必要があります。あなたのビジネスロジックは私たちのものではありませんが、本質的には、削除されているテーブルの情報だけで履歴テーブルを作成する方法を見つける必要があります。代わりに、INFRA_MASTER_DELETE_TRIGGERから呼び出されるストアド・プロシージャに、すべてのSUBNET_LOOKUP_DELETE_TRIGGERロジックを配置します。

関連する問題