De kolom relacl
van de systeemcatalogus pg_class
bevat alle informatie over privileges.
Voorbeeldgegevens in schema public
eigendom van postgres
met subsidies aan newuser
:
create table test(id int);
create view test_view as select * from test;
grant select, insert, update on test to newuser;
grant select on test_view to newuser;
Opvragen van de pg_class
:
select
relname,
relkind,
coalesce(nullif(s[1], ''), 'public') as grantee,
s[2] as privileges
from
pg_class c
join pg_namespace n on n.oid = relnamespace
join pg_roles r on r.oid = relowner,
unnest(coalesce(relacl::text[], format('{%s=arwdDxt/%s}', rolname, rolname)::text[])) acl,
regexp_split_to_array(acl, '=|/') s
where nspname = 'public'
and relname like 'test%';
relname | relkind | grantee | privileges
-----------+---------+----------+------------
test | r | postgres | arwdDxt <- owner postgres has all privileges on the table
test | r | newuser | arw <- newuser has append/read/write privileges
test_view | v | postgres | arwdDxt <- owner postgres has all privileges on the view
test_view | v | newuser | r <- newuser has read privilege
(4 rows)
Opmerkingen:
coalesce(relacl::text[], format('{%s=arwdDxt/%s}', rolname, rolname))
- Null inrelacl
betekent dat de eigenaar alle privileges heeft;unnest(...) acl
-relacl
is een array vanaclitem
, één array-element voor een gebruiker;regexp_split_to_array(acl, '=|/') s
- splitsenaclitem
in:s[1] gebruikersnaam, s[2] privileges;coalesce(nullif(s[1], ''), 'public') as grantee
- lege gebruikersnaam betekentpublic
.
Pas de zoekopdracht aan om een individuele gebruiker of een specifiek soort relatie of een ander schema, enz. te selecteren...
Lees in de documentatie:
- De catalogus
pg_class
, GRANT
met de beschrijving van het acl-systeem.
Op een vergelijkbare manier kunt u informatie krijgen over privileges die zijn verleend op schema's (de kolom nspacl
in pg_namespace
) en databases (datacl
in pg_database
)