2013-05-20 3 views
0

현재 Postgresql을 사용하여 DB를 만들고 있습니다. 처음으로, 친절하게. ;)postgresql의 특정 날짜에 사용자 그룹 권한을 취소하는 방법은 무엇입니까?

나는 제출 날짜가 다른 것들 중에서 저장되는 테이블 project을 가지고 있습니다.

사용자가 2 명 있습니다. 하나는 데이터베이스 만 참조 할 수 있고 업데이트/삽입/삭제 권한은 없으므로 매우 쉽습니다.

다른 그룹은 프로젝트에서 원하는 모든 작업을 수행 할 권한이 있지만 제출일까지만 수행 할 수 있습니다.

나는 좋은 방법을 찾고 있습니다.

나는 DB에 저장된 current_date과 날짜를 검사하는 트리거 기능에 대해 생각하고 전달 된 권한을 취소 한 다음 '이 프로젝트를 수정하기 위해 더 이상 권한이 없습니다. 모든 테이블에서 같은 트리거를 사용할 수 있습니다. 나는 그것이 잘될 수 있다고 생각하지만, 그럴 권리/좋은 방법인지 모르겠다.

PS : 사람 또한 일부 선단을 갖는 경우 약 1 .. * 0 .. * 관계보기

+0

어떤 관계가 있습니까? 당신은 하나의 테이블'프로젝트'를 언급했습니다 ... –

답변

1

권한 객체마다 부여된다. GRANT/REVOKE을 사용하여 행당 권한을 직접 부여 할 수 없습니다.

한 가지 방법은 아직 제출되지 않은 프로젝트 만 표시하는 VIEW입니다. SELECT 권한의 경우 간단하고 UPDATE/DELETE의 경우 더 복잡합니다. 보기에 특히 INSTEAD rules이 필요합니다. 특히 초보자에게는 까다 롭습니다.

다른 명백한 옵션은 이미 염두에 두었던 것입니다. 간단합니다. 실제로 권한을 취소 할 필요는 없습니다. 그냥 제출 된 프로젝트에 대한 예외를 발생 :

CREATE OR REPLACE FUNCTION trg_p_updelno() 
    RETURNS trigger AS 
$func$ 
BEGIN 
IF pg_has_role('other_group', 'member') 
    AND OLD.submission_date < now()::date THEN 
    RAISE EXCEPTION 'Too late, Kate! Project already submitted.'; 
END IF; 

RETURN NULL; 

END 
$func$ 
    LANGUAGE plpgsql; 

CREATE TRIGGER updelno 
BEFORE UPDATE OR DELETE ON project 
FOR EACH ROW 
EXECUTE PROCEDURE trg_p_updelno(); 

pg_has_role()이 편리해야 Access Privilege Inquiry Functions 중 하나입니다.

물론 사용자가 제출 날짜를 편집하지 못하도록하고 싶습니다. 방아쇠를 당길 수도 있습니다.
NEW을 , 즉 NEW이없는 트리거 기능에서 참조 할 때주의하십시오. examples in the manual using TG_OP here을 살펴보십시오.

0

고려할 수있는 한 가지 점은 그룹 2가 특정 날짜 이후에 db에 액세스 할 수없는 경우 해당 시점에서 로그인 권한을 취소 할 수 있다는 것입니다. 참고 사항은 인증 세부 사항에 따라 다르지만 암호 로그인 인 경우에는

ALTER USER foo VALID UNTIL '2013-07-01'; 

참고 만 암호가 만료됩니다. 그런 다음 주기적으로 진행되는 만료 된 사용자를 정리하는 cron 작업을 수행 할 수 있습니다 (정보는 pg_authid 시스템 테이블에 있습니다).

사용자가 여전히 PostgreSQL 인스턴스에 액세스 할 수 있으면 Erwin의 제안과 함께해야합니다.

관련 문제