문제

사용자가 PostgreSQL에서 특정 클래스 (예 : 테이블 또는 기능)에서 특정 권리 (예 : 선택 또는 실행)를 얻었는지 알아내는 권장 방법은 무엇입니까?

현재 나는 같은 것을 얻었습니다

aclcontains(
    someColumnWithAclitemArray,
    makeaclitem(userOid,grantorOid,someRight,false))

하지만 모든 것을 확인해야하기 때문에 끔찍합니다. grantorOid 그것은 가능합니다 userOid 사용자는 속성 할 수 있습니다.

관련 참고 사항 : 테스트 할 수있는 가능한 권리는 무엇입니까? 문서를 찾지 못했지만 소스 코드를 읽습니다.

INSERT
SELECT
UPDATE
DELETE
TRUNCATE
REFERENCES
TRIGGER
EXECUTE
USAGE
CREATE
CONNECT

또한있는 것 같습니다 CREATE TEMP 맞아요. makeaclitem-기능.

도움이 되었습니까?

해결책

나는 더 나은 접근법 (그리고 이것이 PSQL에 내장 된 일부 쿼리에서 가져온 것을 기억하는 것 같습니다. has_*_privilege 기능을하고 간단히 사용자와 객체의 가능한 모든 조합 세트에 적용하십시오. 이것은 일부 그룹 역할을 통해 객체에 액세스 할 수있는 것을 고려할 것입니다.

예를 들어, 이는 비 카탈로그 테이블 및 뷰에 액세스 할 수있는 사용자가 표시됩니다.

select usename, nspname || '.' || relname as relation,
       case relkind when 'r' then 'TABLE' when 'v' then 'VIEW' end as relation_type,
       priv
from pg_class join pg_namespace on pg_namespace.oid = pg_class.relnamespace,
     pg_user,
     (values('SELECT', 1),('INSERT', 2),('UPDATE', 3),('DELETE', 4)) privs(priv, privorder)
where relkind in ('r', 'v')
      and has_table_privilege(pg_user.usesysid, pg_class.oid, priv)
      and not (nspname ~ '^pg_' or nspname = 'information_schema')
order by 2, 1, 3, privorder;

가능한 특권은 설명에 자세히 설명되어 있습니다. has_*_privilege 기능 http://www.postgresql.org/docs/current/static/functions-info.html#functions-info-access-table.

'Temp 만들기'는 데이터베이스 레벨 권한입니다. 사용자가 pg_temp_* 개요. 테스트 할 수 있습니다 has_database_privilege(useroid, datoid, 'TEMP').

다른 팁

살펴보십시오 "액세스 권한 문의 기능" 그리고 또한 "승인하다" 참조 페이지.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top