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
) 을 사용하면 (정상 기능이 아닌 트리거 기능의 경우 ) 그렇게 작동하지 않는 것 같습니다.