it-swarm.it

Elencare i privilegi del database usando psql

Sono nel mezzo di una migrazione del server di database e non riesco a capire (dopo aver cercato su Google e cercato qui) come posso elencare i privilegi di database (o tutti i privilegi su tutto il server) su PostgreSQL usando psql strumento da riga di comando?

Sono su Ubuntu 11.04 e la mia versione PostgreSQL è 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

documenti su GRANT forniscono una spiegazione su come interpretare l'output. Per privilegi specifici su una tabella del database corrente, utilizzare \z myTable.

134
DrColossos

forse intendi elencare gli utenti e i loro privilegi per un database - non riesco proprio a capire dalla domanda:

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

Puoi farlo seguendo:

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

Questo ti dà questo tipo di output:

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

Utilizzando psql meta-comandi:

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

Passando sulla pagina con Ctrl + F si ottiene:

\ddp [ pattern ] Elenca le impostazioni predefinite dei privilegi di accesso.

\dp [ pattern ] Elenca tabelle, viste e sequenze con i relativi privilegi di accesso.

\l[+] [ pattern ] Elenca i database nel server e mostra .... i privilegi di accesso.

Anche menzionato sopra, ma non trovato con i "privilegi" di Word nella pagina del manuale:

\du+ per ruoli con login e \dg+ per i ruoli senza - sarà archiviato "Member of" dove trovi i ruoli assegnati ai ruoli.

Salto deliberatamente i privilegi di funzione e lingua qui, trovati nel manuale psql come appena manipolati (e se usi quei privilegi non verrai qui per un consiglio). lo stesso vale per i tipi, i domini definiti dall'utente e così via: l'utilizzo di "+" dopo il meta-comando ti mostrerà i privilegi, se applicabile.


Un modo un po 'estremo per verificare i privilegi è far cadere l'utente in una transazione, ad es .:

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

Quando l'elenco è più lungo di N, (almeno in 9.3), l'avviso con l'elenco di privilegi viene compresso, ma è ancora possibile trovarlo pieno nei registri ...

18
Vao Tsun

Undercovers psql utilizza la seguente query quando si emette \du comando.

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

Un ulteriore passaggio (forse ovvio) è diventato l'utente postgres, altrimenti potresti ricevere errori su ruoli inesistenti.

Sudo su - postgres
psql -l

o

psql
postgres=> \l
10
Adam Shostack

Questa è la mia query composta da più risposte su questa domanda:

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;

Ciò si traduce in qualcosa del genere:

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