sql >> Database teknologi >  >> RDS >> PostgreSQL

Liste bevillinger og privilegier til en materialiseret visning i PostgreSQL

I Postgres systemkataloger er det grundlæggende sæt af komplette oplysninger om installationen og databaser. Systemkataloger er den mest pålidelige kilde til information.Informationsskema som en hjælpefunktion er baseret på systemkataloger og leveres for kompatibilitet med andre RDBM'er:

Materialiserede visninger er ikke SQL-standardobjekter, hvorfor informationsskemaet ikke indeholder information om dem.

Systemkataloget pg_class indeholder alle oplysninger om privilegier i kolonnen relacl .

Hvis kolonnen er null så har ejeren alle privilegier.

En tom streng som brugernavn i acl streng betyder 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)

Du skal bruge en funktion for at vise privilegier i læsbar format:

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 
$$;

Brug:

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. Brug variabel med TOP i select-sætning i SQL Server uden at gøre den dynamisk

  2. T-sql, ticks, tidsstempel

  3. JPA formørker to fremmednøgler @IdClass implementeringsfejl

  4. MySQL boolean - spejlvende værdien?