PostgreSQL 8.4에서 트리거 기능을 실행하는 데 필요한 권한은 무엇입니까?
역할로 설정된 권한은 트리거 기능을 실행하는 데 중요하지 않은 것 같습니다. 나는 언젠가 트리거 함수를 실행하는 데 필요한 권한이 EXECUTE 권한이지만 테이블 소유자에게는 트리거 기능을 호출하는 트리거를 발생시키는 작업을 수행하는 실제 역할이 아니라는 것을 알았습니다.
그 요점을 설명하는 문서 부분을 찾을 수 없습니다.
PostgreSQL 8.4에서 트리거 기능을 실행하는 데 필요한 권한은 무엇입니까?
역할로 설정된 권한은 트리거 기능을 실행하는 데 중요하지 않은 것 같습니다. 나는 언젠가 트리거 함수를 실행하는 데 필요한 권한이 EXECUTE 권한이지만 테이블 소유자에게는 트리거 기능을 호출하는 트리거를 발생시키는 작업을 수행하는 실제 역할이 아니라는 것을 알았습니다.
그 요점을 설명하는 문서 부분을 찾을 수 없습니다.
답변:
트리거 기능은 특권에 관한 한 다른 기능과 동일하게 작동합니다. 사소한 예외가 있습니다 :
테이블에서 트리거를 작성하려면 사용자에게 테이블에 대한
TRIGGER권한이 있어야합니다. 또한 사용자는EXECUTE트리거 기능에 대한 권한이 있어야합니다 .
업데이트 의견에 대한 피드백을 얻은 후 조사했습니다. Postgres Wiki 에는 오픈 TODO 아이템 이 있습니다 :
트리거 권한 검사 강화
Postgres 해커의이 스레드에 연결되었습니다 . 현재 EXECUTE트리거 기능에 대한 권한은 트리거 생성 시 에만 확인 되지만 런타임에는 확인되지 않습니다. 따라서 트리거 기능에서 EXECUTE를 취소해도 한 번 생성 된 트리거에는 영향을 미치지 않습니다. 당신의 관찰은 올바른 것 같습니다.
이것은 객체를 조작 할 수있는 추가 권한을 부여하지 않습니다. 호출 역할에 기능 본문 (일부)을 실행하는 데 필요한 권한이 없으면 일반적인 예외가 발생합니다. 길을 개척하기 위해 권한을 가진 사용자 OWNER를 만들고 기능을 사용할 수 있습니다.
SECURITY DEFINER
절로서 여기 매뉴얼에 문서화 . 호출자 대신 소유자 의 권한으로 함수가 실행되도록합니다 (기본값).
소유자가 수퍼 유저 인 경우 EXECUTE권한 을 부여한 사람 과 남용을 피하기 위해 기능이 수행 할 수있는 작업에 대해 특히 주의해야합니다 . 당신은 할 수 있습니다
REVOKE ALL ON FUNCTION foo() FROM public;
기능을 시작하고 사용 SET search_path합니다. 안전하게 함수 작성에
관한 장을 읽으십시오 .SECURITY DEFINER
SO 관련 답변에서 코드 예제를 찾으십시오 .
NOTICE. 함수 소유자와 ALL권한을 제거했습니다 PUBLIC. 그런 다음 소유자 또는 해당 기능에 대한 권한이없는 다른 역할을 사용하는 경우 권한 부족으로 인해 오류가 발생하지만 모든 것이 성공적으로 실행됩니다.
SECURITY DEFINER내가 원하는,SECURITY INVOKER. 그러나 기본 옵션 (SECURITY INVOKER) 을 사용하면 (정상 기능이 아닌 트리거 기능의 경우 ) 그렇게 작동하지 않는 것 같습니다.