PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Избройте безвъзмездни средства и привилегии за материализиран изглед в PostgreSQL

В системни каталози на Postgres са основният набор от пълна информация за инсталацията и базите данни. Системните каталози са най-надеждният източник на информация.Информационна схема като спомагателна функция е базирана на системни каталози и е предоставена за съвместимост с други RDBM:

Материализираните изгледи не са стандартни SQL обекти, следователно информационната схема не съдържа информация за тях.

Системният каталог pg_class съдържа цялата информация за привилегиите в колоната relacl .

Ако колоната е null тогава собственикът има всички привилегии.

Празен низ като потребителско име в acl низ означава 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)

Имате нужда от функция за показване на привилегии в четлив формат:

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

Използвайте:

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. Ограничение на PostgreSQL - само един ред може да има зададен флаг

  2. Предотвратява ли pg_prepare() подготвен оператор (не PDO) SQL-инжектиране?

  3. Как да опростите заявка за избор, която съдържа много вътрешни селекти и да увеличите производителността в PostgreSQL

  4. postgresql тригер на tvector колона получава ГРЕШКА:колоната не съществува

  5. Опции за аварийно възстановяване за PostgreSQL, разгърнат в хибриден облак