0

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;
4

1 に答える 1

0

私は dropTempTable 関数への呼び出しを DELETE ルールから SELECT ルールに移動し、EXCEPTION ステートメントを追加して、次のようにしました。

マイ ドロップ テーブル機能:

CREATE FUNCTION dropTempTable()
RETURNS void AS $$
BEGIN
     DROP TABLE IF EXISTS myTempTable;
EXCEPTION
     WHEN OTHERS THEN
END;
$$ LANGUAGE plpgsql;

ちょっとしたハックですが、うまくいきます。

于 2012-08-06T10:01:29.797 に答える