2

私はOracle Express 11gを使用しています。このトリガーを作成しようとしています:

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 DELETE SET NULL 句があります。

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

トリガーは問題なくコンパイルされますが、条件が発生すると、次のエラーが発生します。

SQL エラー: ORA- 04091 : テーブル REALESTATE.SURVEYS が変化しています。 トリガー
/関数はそれを認識しない可能性があり ます00000 - 「テーブル %s.%s は変更されています。トリガー/関数はそれを認識しない可能性があります」 *原因: トリガー (または このステートメントで参照されているユーザー定義の plsql 関数) が、 それを起動したステートメントによって変更されている途中でした。 *処置: その表を読み取らないようにトリガー(または関数)を書き直してください。






実際、トリガーを起動したのと同じテーブルを編集していることはわかっています。しかし、更新をキャンセルしたい、またはファイナライズしたいのですが、気にせず、その行を削除します。

手伝って頂けますか?どうすればやろうとしていることを達成できますか?

4

1 に答える 1

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;
于 2012-04-10T13:09:19.267 に答える