2012-07-02 4 views
12

セキュリティに敏感なデザインのために、特定のテーブルでDELETEsを無効にしたいと思います。PostgreSQLのテーブルでDELETEを無効にしますか?

DELETEは、行にdeletedフラグを設定するだけです(アプリケーションレイヤーで使用されるビューで表示されます)。

私が理解しているように、ruleは追加のクエリを生成するため、ルールは元のクエリを抑制できませんでした。実例として

トリガ(まだテストしていない)とのおもちゃの例:

-- data in this table should be 'undeletable' 
CREATE table article (
    id serial, 
    content text not null, 
    deleted boolean default false 
) 

-- some view that would only show articles, that are NOT deleted 
... 

-- toy trigger (not tested) 
CREATE OR REPLACE FUNCTION suppress_article_delete() 
RETURNS TRIGGER AS $sad$ 
BEGIN 
    IF (TG_OP = 'DELETE') THEN 
     UPDATE article SELECT id, content, TRUE; 
     -- NEW or NULL?? 
     RETURN NEW; 
    END IF; 
    RETURN NULL; 
END; 
$sad$ LANGUAGE plpgsql; 

DELETEを抑制するための良い方法だろうか?

答えて

15

ルールが追加のクエリを生成することを理解しているので、ルールは元のクエリを抑制できませんでした。

CREATE RULE shoe_del_protect AS ON DELETE TO shoe DO INSTEAD NOTHING; 

(手動の同じページの例): -

本当にない、それはINSTEADルールである可能性があります。

もう1つの方法は、問題のテーブルに対する特権を削除し、削除のためのストアドプロシージャを作成し、おそらく更新および挿入することです。

+0

ありがとうございます!私はこの* undelete *デザインを管理(リボーク)ではなくデータモデルに入れたいと思うので、私は 'INSTEAD'ルールを試してみようと思います。 – miku

関連する問題