0

次のシナリオ(簡略化)でOracleデータベースを使用しています:

Projects                      Params
-------------                 -----------
PROJ_ID     SCODE             PARAM_ID PARAM_TYPE PROJ_ID PARAM_VALUE
1000        123               5000       4614     1000    '00'
1001        124               5001       4610     1000    'Micro'
1002        123               5002       4614     1001    '02'
                              5003       4614     1002    '01'

つまり、3 つのプロジェクト - プロジェクト 1000 には 2 つの異なるパラメーターがあり、2 番目と 3 番目のプロジェクトにはそれぞれ 1 つのパラメーターがあります。

ここで、projects テーブルに Trigger を書き込む必要があります。このトリガーは、指定された SCODE を持つタイプ「4614」のパラメーターの最大値 +1 を持つ新しい行を params テーブルに自動的に挿入します。

INSERT INTO Projects VALUES (1003,123) 

...イベントをトリガーする必要があります

INSERT INTO Parameters VALUES (5004,4614,1003,'02')

今、私には2つの可能性があり、両方とも機能しません:

トリガーが「BEFORE」として宣言されている場合、外部キー制約によってプロジェクト 1003 がまだ作成されていないというエラーが表示されるため、パラメーター テーブルに挿入できません。トリガー内でコミットを行うことはできません。

トリガーが「AFTER」として宣言されている場合、エラーが発生します

ORA-04091: table name is mutating, trigger/function may not see it

現在トリガーされているテーブルにアクセスしているためです。

この問題には何らかの解決策があるはずです。どんな助けでも大歓迎です!

//編集

私のトリガー:

CREATE OR REPLACE TRIGGER PROJ_ARI_TRIGGER
AFTER INSERT
ON PROJECTS
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
v_param VARCHAR2(10);
BEGIN
      v_param := get_next_param_val(:new.SCODE);
      INSERT INTO Parameters(<<sequence>>,4614,:new.PROJ_ID,v_param);
END PROJ_ARI_TRIGGER;

関数 get_next_param_val は、プロジェクト テーブルの選択を行い、正しいパラメーター値を返します。

4

2 に答える 2