मैंने पाया है कि एक बेहतर दृष्टिकोण (और मुझे याद है कि यह psql, या शायद info_schema विचारों में निर्मित कुछ प्रश्नों से लिया गया था) 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
।
'CREATE TEMP' एक डेटाबेस-स्तरीय विशेषाधिकार है:यह उपयोगकर्ता को pg_temp_*
का उपयोग करने की अनुमति देता है स्कीमा। इसका परीक्षण has_database_privilege(useroid, datoid, 'TEMP')
के साथ किया जा सकता है ।