2016-06-27 2 views
0

한 사용자, 즉 user1을 제외한 모든 사용자에 대해 테이블 ​​레코드 삭제를 비활성화해야한다는 요구 사항이 있습니다. 그래서 나는 다음과 같은 트리거를 사용했습니다.한 사용자의 테이블 레코드 삭제를 방지하고 postgresql의 다른 테이블 레코드 삭제 허용

CREATE OR REPLACE FUNCTION prevent_deletion() RETURNS trigger AS $$ 
declare 
cur_user varchar(30); 
BEGIN 
Select current_user into cur_user; 
IF cur_user != 'user1' THEN 
RAISE EXCEPTION 'You cannot delete records from this table!'; 
END IF; 
RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 

트리거가 user1 이외의 사용자에 대한 테이블 레코드를 삭제하지 못하도록합니다. 괜찮 았지만 사용자 user1에게는 작동하지 않습니다. user1에 대한 테이블 레코드를 삭제하지 않는다는 의미입니다.

어디에서 코드가 잘못 되었습니까?
미리 감사드립니다.

+0

postgres 버전이란 무엇입니까? –

+0

https://www.postgresql.org/docs/9.5/static/sql-createpolicy.html 행 수준 보안 감시 –

+0

@VaoTsun 9.5 – Suniel

답변

3

삭제하기 전에 실행되는 트리거는 old을 반환해야합니다.

CREATE OR REPLACE FUNCTION prevent_deletion() 
RETURNS trigger AS $$ 
BEGIN 
    IF current_user != 'user1' THEN 
     RAISE EXCEPTION 'You cannot delete records from this table!'; 
    END IF; 
    RETURN OLD; 
END; 
$$ LANGUAGE plpgsql; 
+0

내 어리석은 실수를 지적 해 주셔서 대단히 감사합니다. – Suniel