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 규칙이 될 수 있습니다.

또 다른 방법은 REVOKE 해당 테이블에 대한 권한을 삭제하고 삭제를위한 저장 프로 시저를 만들고 ... 업데이트 및 삽입하는 것입니다.

+0

고마워요! 이 * undelete * 디자인을 데이터 모델로 가져오고 싶습니다. 관리 (취소)가 아닙니다. 그래서 나는'INSTEAD' 규칙을 시도 할 것입니다. – miku

관련 문제