OLD を一時テーブルに選択し、OLD の値を使用してアクションを実行する関数を呼び出すビューに ON DELETE ルールを作成しました。ルールは、SELECT dropTempTable() を実行することにより、セッション中にルールが複数回呼び出された場合に備えて、SELECT INTO TEMPORARY TABLE を実行する前に一時テーブルを削除します。削除するものが何もない場合を除いて、これはすべて正常に機能します。たとえば、「John Doe」という名前のレコードがない場合に次のクエリを実行します。
DELETE FROM myview WHERE name = 'John Doe';
この場合、一時テーブルは、使用されなくても使用される準備としてプランナーによって作成されますが、私の dropTempTable() ステートメントは決して呼び出されないため、ビューで 2 回目に DELETE を実行すると失敗します。一時テーブルは既に存在します。この問題を解決する方法についての提案は大歓迎です。この例はトリガーを使用して解決できることはわかっていますが、この投稿の目的のために単純化したため、トリガーは特定の問題には機能しません。
私の見解:
CREATE VIEW myview
AS SELECT * FROM mytable
私のルール:
CREATE RULE myview_delete
AS ON DELETE TO myview
DO INSTEAD (
SELECT dropTempTable();
SELECT OLD INTO TEMPORARY TABLE myTempTable;
SELECT myDeleteFunction();
);
マイ ドロップ テーブル機能:
CREATE FUNCTION dropTempTable()
RETURNS void AS $$
BEGIN
DROP TABLE IF EXISTS myTempTable;
END;
$$ LANGUAGE plpgsql;