sql >> Database >  >> RDS >> PostgreSQL

Lijst van toekenningen en privileges voor een gerealiseerde weergave in PostgreSQL

In Postgres systeemcatalogi zijn de basisset van volledige informatie over de installatie en databases. Systeemcatalogi zijn de meest betrouwbare bron van informatie.Informatieschema als extra functie is gebaseerd op systeemcatalogi en wordt geleverd voor compatibiliteit met andere RDBM's:

Gematerialiseerde weergaven zijn geen SQL-standaardobjecten en daarom bevat het informatieschema er geen informatie over.

De systeemcatalogus pg_class bevat alle informatie over privileges in de kolom relacl .

Als de kolom null is dan heeft de eigenaar alle privileges.

Een lege string als gebruikersnaam in acl string betekent public .

create materialized view test_view as select 1;
grant select on test_view to public;
grant delete on test_view to a_user;

select 
    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 = 'test_view';

 grantee  | privileges 
----------+------------
 postgres | arwdDxt
 public   | r
 a_user   | d
(3 rows)

Je hebt een functie nodig om privileges te tonen in leesbaar formaat:

create or replace function priviliges_from_acl(text)
returns text language sql as $$
    select string_agg(privilege, ', ')
    from (
        select 
            case ch
                when 'r' then 'SELECT'
                when 'w' then 'UPDATE'
                when 'a' then 'INSERT'
                when 'd' then 'DELETE'
                when 'D' then 'TRUNCATE'
                when 'x' then 'REFERENCES'
                when 't' then 'TRIGGER'
            end privilege
        from
            regexp_split_to_table($1, '') ch
    ) s 
$$;

Gebruik:

select 
    coalesce(nullif(s[1], ''), 'public') as grantee, 
    priviliges_from_acl(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 = 'test_view';

 grantee  |                          privileges                           
----------+---------------------------------------------------------------
 postgres | INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER
 public   | SELECT
 a_user   | DELETE
(3 rows)


  1. CHECK-beperkingen in-/uitschakelen in SQLite

  2. Knee-Jerk Performance Tuning:onjuist gebruik van tijdelijke tabellen

  3. De beste manier om opgeslagen PostgreSQL-procedures te leren?

  4. jboss database verbinding time-out bij inactiviteit in oracle