Tôi nhận thấy rằng một cách tiếp cận tốt hơn (và dường như tôi nhớ điều này được lấy từ một số truy vấn được tích hợp trong psql hoặc có thể là các chế độ xem information_schema) là sử dụng đặc quyền has_*_privilege
và chỉ cần áp dụng chúng cho một tập hợp tất cả các kết hợp có thể có của người dùng và đối tượng. Điều này cũng sẽ tính đến việc có quyền truy cập vào một đối tượng thông qua một số vai trò nhóm.
Ví dụ:điều này sẽ hiển thị những người dùng nào có quyền truy cập vào các bảng và chế độ xem không phải danh mục:
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;
Các đặc quyền có thể có được nêu chi tiết trong mô tả của has_*_privilege
chức năng tại http:// www .postgresql.org / docs / current / static / functions-info.html # FUNCTIONS-INFO-ACCESS-TABLE
.
'CREATE TEMP' là một đặc quyền cấp cơ sở dữ liệu:nó cho phép người dùng sử dụng pg_temp_*
lược đồ. Nó có thể được kiểm tra bằng has_database_privilege(useroid, datoid, 'TEMP')
.