2012-04-10 20 views
2

私はOracle Express 11gを使用しています。私は、このトリガーを作成しようとしています:トリガー行の削除を引き起こすUPDATEトリガーの作成

CREATE TRIGGER remove_useless_surveys 
    BEFORE UPDATE OF agent_id, agency_id, province_id ON surveys 
    FOR EACH ROW WHEN (
    new.agent_id IS NULL AND 
    new.agency_id IS NULL AND 
    new.province_id IS NULL) 
DELETE FROM surveys WHERE survey_code = :new.survey_code 

AGENT_ID、agency_idとprovince_idは外部キーが、ONでSET NULL句を削除します。

3つの外部キーがすべてNULLに設定されている場合(参照される行が削除されるため)、surveysテーブルの行を削除する必要があります。

トリガは問題なくコンパイルしますが、条件の火災は、その後、私はこのエラーを取得するとき:

SQL error: ORA-04091: table REALESTATE.SURVEYS is mutating,
trigger/function may not see it ORA-06512: at
"REALESTATE.REMOVE_USELESS_SURVEYS", line 1 ORA-04088: error during
execution of trigger 'REALESTATE.REMOVE_USELESS_SURVEYS'
04091. 00000 - "table %s.%s is mutating, trigger/function may not see it"
*Cause: A trigger (or a user defined plsql function that is referenced in
this statement) attempted to look at (or modify) a table that was
in the middle of being modified by the statement which fired it.
*Action: Rewrite the trigger (or function) so it does not read that table.

実は、私はトリガーを起動した同じテーブルを編集しています知っています。しかし、私は更新を取り消したい、または確定する、私は気にしない、そしてその行を削除する

私を助けることができますか?私は何をしようとしているのですか?

+0

文は、トリガーまたはPL/SQLファンクションを実行することもできます。そのトリガー/関数は、トリガー/ function.Plsを起動したステートメントによって現在変更されているテーブルを変更または照会しようとしました。http://www.techonthenet.com/oracle/errors/ora04091.phpを確認してください。 – user1127214

+0

@ user1127214:ええ、これはポイントです:) – gd1

答えて

3

あなたはこのように文レベルのトリガを使用することができます。

CREATE TRIGGER remove_useless_surveys 
AFTER UPDATE OF agent_id, agency_id, province_id ON surveys 
BEGIN 
    DELETE FROM surveys 
    WHERE agent_id IS NULL 
    AND agency_id IS NULL 
    AND province_id IS NULL; 
END; 
+0

ありがとう....... :) – gd1

+0

+1。しかし、テーブルが大規模であると、テーブル上のすべての更新に重大なパフォーマンス上の問題が発生する可能性があります。これは、適切な関数ベースのインデックスによって緩和される可能性があります。 –

関連する問題