sql >> Databáze >  >> RDS >> PostgreSQL

Vypsat granty a oprávnění pro materializovaný pohled v PostgreSQL

V systémových katalozích Postgres jsou základní sadou kompletních informací o instalaci a databázích. Systémové katalogy jsou nejspolehlivějším zdrojem informací.Informační schéma jako pomocná funkce je založena na systémových katalozích a je poskytována pro kompatibilitu s jinými RDBM:

Materializované pohledy nejsou objekty standardu SQL, proto o nich informační schéma neobsahuje informace.

Systémový katalog pg_class obsahuje všechny informace o oprávněních ve sloupci relacl .

Pokud je sloupec null pak má vlastník všechna oprávnění.

Prázdný řetězec jako uživatelské jméno v acl řetězec znamená 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)

K zobrazení oprávnění v čitelném potřebujete funkci formát:

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

Použijte:

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. Jaký je váš názor na používání textových identifikátorů ve sloupcích tabulky při přístupu k databázi s ohledem na normalizaci a škálovatelnost?

  2. Chyba serveru SQL 110:V příkazu INSERT je méně sloupců než hodnot zadaných v klauzuli VALUES.

  3. MariaDB USER() Vysvětleno

  4. jak zrušit databázi