PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wyświetlanie listy uprawnień i uprawnień do zmaterializowanego widoku w PostgreSQL

W katalogach systemowych Postgresa to podstawowy zestaw kompletnych informacji o instalacji i bazach danych. Katalogi systemowe to najbardziej wiarygodne źródło informacji.Schemat informacji jako funkcja pomocnicza jest oparta na katalogach systemowych i zapewnia kompatybilność z innymi RDBM:

Widoki zmaterializowane nie są obiektami w standardzie SQL, dlatego schemat informacyjny nie zawiera informacji na ich temat.

Katalog systemowy pg_class zawiera wszystkie informacje o uprawnieniach w kolumnie relacl .

Jeśli kolumna ma wartość null wtedy właściciel ma wszystkie uprawnienia.

Pusty ciąg jako nazwa użytkownika w acl ciąg oznacza 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)

Potrzebujesz funkcji do pokazywania uprawnień w czytelnym 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 
$$;

Użyj:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Adapter Postgresql (pg):nie można połączyć się z serwerem

  2. Jak używać dynamicznych nazw kolumn w instrukcji UPDATE lub SELECT w funkcji?

  3. psycopg2 COPY przy użyciu cursor.copy_from() zawiesza się przy dużych wejściach

  4. Jak filtrować tablicę json na każdy zwrócony wiersz?

  5. Wstawianie ciągu tekstowego z szesnastką do PostgreSQL jako bajt