it-swarm.dev

Wymień uprawnienia do bazy danych przy użyciu psql

Jestem w trakcie migracji serwera bazy danych i nie mogę zrozumieć (po przejrzeniu i przejrzeniu tutaj), jak mogę wyświetlić listę uprawnień do bazy danych (lub wszystkich uprawnień na serwerze) na PostgreSQL przy użyciu psql narzędzie wiersza poleceń?

Używam Ubuntu 11.04, a moja wersja PostgreSQL to 8.2.x.

163
pedrosanta
postgres=> \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres

dokumenty dotyczące GRANT zawierają wyjaśnienie, jak interpretować dane wyjściowe. Aby uzyskać określone uprawnienia w tabeli bieżącej bazy danych, użyj \z myTable.

134
DrColossos

może masz na myśli listę użytkowników i ich uprawnienia do bazy danych - nie mogę do końca powiedzieć na podstawie pytania:

postgres=> \du
                             List of roles
    Role name    |  Attributes  |                    Member of
-----------------+--------------+------------------------------------------------
 dba             | Create role  | {util_user,helpdesk_user,helpdesk_admin}
 helpdesk_admin  | Cannot login | {helpdesk_user}
 helpdesk_user   | Cannot login | {helpdesk_reader}
 jack            |              | {helpdesk_admin}
 postgres        | Superuser    | {}
                 : Create role
                 : Create DB

Możesz to zrobić, wykonując następujące czynności:

SELECT grantee, privilege_type 
FROM information_schema.role_table_grants 
WHERE table_name='mytable'

Daje to taki efekt:

mail=# select grantee, privilege_type from information_schema.role_table_grants where table_name='aliases';
   grantee    |  privilege_type
--------------+-----------------
 mailreader   |  INSERT
 mailreader   |  SELECT
 mailreader   |  UPDATE
 mailreader   |  DELETE
 mailreader   |  TRUNCATE
 mailreader   |  REFERENCES
 mailreader   |  TRIGGER
(7 rows)

mail=#
94
Himanshu Chauhan

Używanie psql meta-poleceń:

https://www.postgresql.org/docs/current/static/app-psql.html

Przejście po stronie za pomocą Ctrl + F daje:

\ddp [ pattern ] Wyświetla listę domyślnych ustawień uprawnień dostępu.

\dp [ pattern ] Wyświetla tabele, widoki i sekwencje wraz z powiązanymi z nimi uprawnieniami dostępu.

\l[+] [ pattern ] Wyświetl listę baz danych na serwerze i pokaż .... uprawnienia dostępu.

Wspomniano również powyżej, ale nie znaleziono go z „uprawnieniami” programu Word na stronie podręcznika:

\du+ dla ról z loginem i \dg+ dla ról bez - będzie miał pole "Member of" gdzie znajdziesz role przypisane do ról.

Celowo pomijam tutaj przywilej funkcji i języka, znajdujący się w podręczniku psql jako ledwie zmanipulowany (a jeśli użyjesz tych przywilejów, nie przyjdziesz tu po poradę). to samo dla typów zdefiniowanych przez użytkownika, domen itd. - użycie „+” po meta-poleceniu pokaże uprawnienia, jeśli dotyczy.


Trochę ekstremalnym sposobem sprawdzenia uprawnień jest upuszczenie użytkownika w transakcji, np .:

s=# begin; drop user x;
BEGIN
Time: 0.124 ms
ERROR:  role "x" cannot be dropped because some objects depend on it
DETAIL:  privileges for type "SO dT"
privileges for sequence so
privileges for schema bin
privileges for table xx
privileges for table "csTest"
privileges for table tmp_x
privileges for table s1
privileges for table test
Time: 0.211 ms
s=# rollback;
ROLLBACK
Time: 0.150 ms

Gdy lista jest dłuższa niż N (przynajmniej w 9.3), ostrzeżenie z listą uprawnień jest zwinięte, ale nadal możesz znaleźć ją pełną w logach ...

18
Vao Tsun

Undercovers psql używa poniższego zapytania podczas wydawania \du Komenda.

SELECT r.rolname, r.rolsuper, r.rolinherit,
  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,
  r.rolconnlimit, r.rolvaliduntil,
  ARRAY(SELECT b.rolname
        FROM pg_catalog.pg_auth_members m
        JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
        WHERE m.member = r.oid) as memberof
, r.rolreplication
, r.rolbypassrls
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;
13
Dennis

(Być może oczywistym) dodatkowym krokiem staje się użytkownik postgres, w przeciwnym razie mogą pojawić się błędy związane z nieistniejącymi rolami.

Sudo su - postgres
psql -l

lub

psql
postgres=> \l
10
Adam Shostack

To jest moje zapytanie złożone z wielu odpowiedzi na to pytanie:

SELECT grantee AS user, CONCAT(table_schema, '.', table_name) AS table, 
    CASE 
        WHEN COUNT(privilege_type) = 7 THEN 'ALL'
        ELSE ARRAY_TO_STRING(ARRAY_AGG(privilege_type), ', ')
    END AS grants
FROM information_schema.role_table_grants
GROUP BY table_name, table_schema, grantee;

Powoduje to coś takiego:

+------+--------------+----------------+
| user |    table     |     grants     |
+------+--------------+----------------+
| foo  | schema.table | ALL            |
| bar  | schema.table | SELECT, INSERT |
+------+--------------+----------------+
0
stefannienhuis