sql >> Databasteknik >  >> RDS >> PostgreSQL

Lista tillstånd och privilegier för en materialiserad vy i PostgreSQL

I Postgres systemkataloger är den grundläggande uppsättningen av fullständig information om installationen och databaser. Systemkataloger är den mest tillförlitliga informationskällan.Informationsschema som en extra funktion är baserad på systemkataloger och tillhandahålls för kompatibilitet med andra RDBM:er:

Materialiserade vyer är inte SQL-standardobjekt, varför informationsschemat inte innehåller information om dem.

Systemkatalogen pg_class innehåller all information om privilegier i kolumnen relacl .

Om kolumnen är null då har ägaren alla privilegier.

En tom sträng som användarnamn i acl sträng 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 behöver en funktion för att visa 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 
$$;

Använd:

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. SQLite - Infoga data

  2. Använd TYPE_ID() för att få ID för en datatyp i SQL Server

  3. Sök postarray i kommaseparerat kolumnvärde

  4. Ogiltigt nummer i Oracle SQL Case