次のシナリオ(簡略化)で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 は、プロジェクト テーブルの選択を行い、正しいパラメーター値を返します。