이 경우 문제는 권한 순서가 아니라 실행 순서입니다.
이력서에서 PostgreSQL의 경우 :
1- 테이블이 불필요한 뷰는 테이블 권한을 무시합니다.
2-보기 기능에 접근하기 전에 모든 기능을 평가해야합니다. 따라서보기에 선택 권한이없는 경우에도 기능을 실행해야합니다.
어떻게 증명할 수 있습니까?
postgresql에서 뷰는 사용자에게이 권한이 없더라도 테이블에서 선택을 수행 할 수있는 권한을 부여 할 수 있습니다.
예를 들면 다음과 같습니다.
create view view2 as select * from table1;
revoke all on table1 from user1;
grant select on view2 to user1;
사용자 1로 로그인하십시오.
select * from table1 (permission denied)
select * from view2 (sucess - the query executes)
이 경우 사용자는 테이블을 선택할 권한이 없어도 view2를 선택할 수 있습니다.
그러나 함수로 같은 일을하면 어떻게 될까요? 동작이 동일 하지 않습니다 . 1을 반환하기 전에 5 초 동안 대기하는 함수를 만들 수 있습니다 (따라서 뷰를 호출 할 때마다 postgresql이 함수를 실행중인 경우 디버깅 할 수 있음)
CREATE OR REPLACE FUNCTION something() RETURNS integer
AS 'select 1 from pg_sleep(5);'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT; --this function will delay 5 seconds
create view view1 as select * from something();
revoke all on function something() from user1;
grant select on view1 to user1;
사용자 1로 로그인하십시오.
select * from something(); (permission denied for something)
select * from view1 (permission denied for something )
뷰에서 선택할 수있는 권한은 함수 권한을 무시하지 않으며, 심지어 view1에서 권한을 취소하더라도 최악의 경우에도 뷰 권한에 관계없이 postgresql이 함수로 인해 쿼리를 중지했음을 나타냅니다. (이것은 정확히 질문에서 일어나는 것입니다)
그러나 기능이 실제로 먼저 점검되고 있습니까? 함수에 '모든'권한을 부여하지만보기 권한을 취소하면 ...
grant all on function something to user1;
revoke all on view1 from user1;
select * from view1;
Delayed 5 seconds... (the function executed!)
Permission denied for select on view1
postgresql WAITED 5 SECONDS에서 볼 수 있듯이 뷰를 출력 할 권한이 없으며 "something ()"함수가 실행되었음을 보여줍니다. 따라서 뷰를 확인하기 전에 함수 데이터 리턴이 존재해야합니다.
이제이 테스트를 통해 PostgreSQL은 쿼리를 계속하기 전에 모든 함수를 먼저 평가해야한다는 것을 알았습니다. 관련된 모든 함수가 완전히 완료 될 때까지 쿼리가 여전히 존재하지 않는 것처럼 postgresql에 대한 뷰를 해결할 수 없습니다. 선택 권한이 있는지 여부를 알고 있어야합니다.
나는 이것이 "permission order"의 관점에서 귀하의 질문에 대답한다고 생각하지만 postgresql이 계속하기 전에 모든 기능을 평가 해야하는 이유는 다른 질문입니다 ...