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

Jak mohu zkontrolovat všechna přidělení databází a objektů pro roli?

Sloupec relacl systémového katalogu pg_class obsahuje všechny informace o oprávněních.

Příklad dat ve schématu public ve vlastnictví postgres s udělením oprávnění newuser :

create table test(id int);
create view test_view as select * from test;

grant select, insert, update on test to newuser;
grant select on test_view to newuser;

Dotaz na pg_class :

select 
    relname, 
    relkind, 
    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 like 'test%';

  relname  | relkind | grantee  | privileges 
-----------+---------+----------+------------
 test      | r       | postgres | arwdDxt      <- owner postgres has all privileges on the table
 test      | r       | newuser  | arw          <- newuser has append/read/write privileges
 test_view | v       | postgres | arwdDxt      <- owner postgres has all privileges on the view
 test_view | v       | newuser  | r            <- newuser has read privilege
(4 rows)

Komentáře:

  • coalesce(relacl::text[], format('{%s=arwdDxt/%s}', rolname, rolname)) - Null v relacl znamená, že vlastník má všechna oprávnění;
  • unnest(...) acl - relacl je pole aclitem , jeden prvek pole pro uživatele;
  • regexp_split_to_array(acl, '=|/') s - rozdělení aclitem do:s[1] uživatelské jméno, s[2] oprávnění;
  • coalesce(nullif(s[1], ''), 'public') as grantee - prázdné uživatelské jméno znamená public .

Upravte dotaz tak, abyste vybrali jednotlivého uživatele nebo konkrétní druh vztahu nebo jiná schémata atd...

Přečtěte si dokumentaci:

Podobným způsobem můžete získat informace o oprávněních udělených pro schémata (sloupec nspacl v pg_namespace ) a databáze (datacl v pg_database )



  1. UNION dotaz s aktivním záznamovým vzorem codeigniter

  2. SQL získá ROW_NUMBER a COUNT na každý požadavek SELECT

  3. Nejrychlejší kontrola, zda řádek existuje v PostgreSQL

  4. PDO::query() očekává, že parametr 1 bude řetězec, objekt dostane varování