사용자가 PostgreSQL에서 선택/업데이트/… 테이블/기능/…
-
09-09-2019 - |
문제
사용자가 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')
.
다른 팁
살펴보십시오 "액세스 권한 문의 기능" 그리고 또한 "승인하다" 참조 페이지.