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

Jak mogę przejrzeć wszystkie dotacje do bazy danych i obiektów dla roli?

Kolumna relacl katalogu systemowego pg_class zawiera wszystkie informacje o uprawnieniach.

Przykładowe dane w schemacie public należący do postgres z grantami dla 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;

Zapytanie 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)

Komentarze:

  • coalesce(relacl::text[], format('{%s=arwdDxt/%s}', rolname, rolname)) - Null w relacl oznacza, że ​​właściciel ma wszystkie uprawnienia;
  • unnest(...) acl - relacl jest tablicą aclitem , jeden element tablicy dla użytkownika;
  • regexp_split_to_array(acl, '=|/') s - podziel aclitem na:s[1] nazwa użytkownika, s[2] uprawnienia;
  • coalesce(nullif(s[1], ''), 'public') as grantee - pusta nazwa użytkownika oznacza public .

Zmodyfikuj zapytanie, aby wybrać pojedynczego użytkownika lub określony rodzaj relacji lub inne schematy itp.

Przeczytaj w dokumentacji:

W podobny sposób możesz uzyskać informacje o uprawnieniach nadanych schematom (kolumna nspacl w pg_namespace ) i baz danych (datacl w pg_database )



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ciągi wyjściowe Postgres psql bez znaków ucieczki

  2. Jak skopiować z pliku CSV do tabeli PostgreSQL z nagłówkami w pliku CSV?

  3. Jak znaleźć pofragmentowane indeksy i zdefragmentować je w PostgreSQL?

  4. Czy PostgreSQL ma pseudokolumnę jak LEVEL w Oracle?

  5. Jak porównać 2 kolejne wartości wierszy w obiekcie wyniku za pomocą Pythona?