2016-06-15 4 views
0

新しい行が追加されたときに、同じテーブルの別の1つ(notubesleft)に1つの列の値をコピーするトリガを作成しようとしています。 。正しくコンパイルされたが、私は新しい行を挿入するとき、それはエラーをスローSQLトリガは正しくコンパイルされますがエラーをスローします

私のトリガーは次のとおりです。

create or replace TRIGGER NOTUBESLEFT_INSERT_TRIGGER  
AFTER INSERT ON SAMPLES FOR EACH ROW BEGIN 
update samples 
set notubesleft = (select notubes from samples where sampleid = :new.sampleid); 
END; 

私は新しい行をコミットしようとすると、私はエラーを取得する:

One error saving changes to table "APEX_WS_PROMETHEUS"."SAMPLES":
Row 10: ORA-04091: table APEX_WS_PROMETHEUS.SAMPLES is mutating, trigger/function may not see it
ORA-06512: at "APEX_WS_PROMETHEUS.NOTUBESLEFT_INSERT_TRIGGER", line 2 ORA-04088: error during execution of trigger 'APEX_WS_PROMETHEUS.NOTUBESLEFT_INSERT_TRIGGER'
ORA-06512: at line 1

私は新しいqを求めていますなぜなら、トリガのPL/SQLコードをどのように構造化するかの解決策を見つけることができたからですが、なぜそれが機能しないのかわかりません。

ありがとうございました。

+0

なぜ後挿入トリガーでこれを実行しようとしていますか? –

+0

私は最初にテーブルに値を挿入してから別の列に値を設定する必要があると思ったので、それが私の最初の引き金です。 – Matte

答えて

1

に変異されたテーブルを照会することはできません制限がありますレベルトリガー。しかし、テーブルには何も照会しないでください。これを行うために挿入後トリガーを使用すべきではありません。代わりに挿入前のトリガーを使用してください。

CREATE OR REPLACE TRIGGER NOTUBESLEFT_INSERT_TRIGGER  
BEFORE INSERT ON SAMPLES FOR EACH ROW 
BEGIN 
    :new.notubesleft := :new.notubes; 
END; 
+0

それは魅力のように機能します!ありがとう – Matte

0

変異テーブルの問題が発生しました。あなたは(簡単に)あなたは行優先でに挿入しているテーブルを照会することはできませんEACH ROWトリガーFOR

Trigger Restrictions on Mutating Tables

If you must update a mutating table, you can bypass these restrictions by using a temporary table, a PL/SQL table, or a package variable. For example, in place of a single AFTER row trigger that updates the original table, resulting in a mutating table error, you might use two triggers—an AFTER row trigger that updates a temporary table, and an AFTER statement trigger that updates the original table with the values from the temporary table.

+0

ありがとうございました。 FOR EACH ROWが正しいかどうかも疑問です。私の目標は、挿入されている新しい行に対してトリガーを実行することだけです。私は一度に1行だけ挿入することを期待しています。 – Matte

関連する問題