Elencare i privilegi del database usando psql


144

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 lo psqlstrumento da riga di comando?

Sono su Ubuntu 11.04 e la mia versione PostgreSQL è 8.2.x.

Risposte:


117
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

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


5
\z myTableè perfetto per assicurarti di aver concesso con successo l'accesso a qualcuno ed evitare di sembrare un idiota quando dici "va bene ora funziona? Non funziona ??? "
ijoseph

109

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

No, volevo un modo per elencare i privilegi di un database specifico, ma l'ho già capito. Il proprietario del database ha sempre tutti i privilegi, giusto? E in seguito possiamo aggiungere altri privilegi sul database ad altri utenti / gruppi. Quelli sono elencati con il comando \ l. Ma grazie comunque.
pedrosanta,

80

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=#

10
Benvenuti nel sito! Una piccola domanda: perché hai inserito l'output come screenshot? Si prega di utilizzare il testo normale il più spesso possibile.
dezso,


1
C'è un modo in cui posso vedere l'autorizzazione per le sequenze? Questo fornisce solo informazioni sulla tabella
curioso il

Si noti che (almeno in Postgres 9.4) quanto sopra non funzionerà per le viste materializzate.
SeldomNeedy,

@HimanshuChauhan se aggiungo un nuovo ruolo 'new_role' usando il ruolo 'mailreader', l'informazione_schema.role_table_grants elencherà anche new_role?
Anand,

15

Utilizzando i psqlmeta-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 loro privilegi di accesso associati.

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

Anche menzionato sopra, ma non trovato con la parola "privilegi" nella pagina del manuale:

\du+per i ruoli con login e \dg+per i ruoli senza - sarà archiviato un file in "Member of"cui si trovano ruoli assegnati ai ruoli.

Salto deliberatamente i privilegi di funzione e lingua qui, trovati nel psqlmanuale 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 esempio:

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 ...


12

Undercovers psql utilizza la seguente query quando si immette il \ducomando.

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;

è questo standard sql?
Ribamar,

`` ERRORE: la colonna r.rolbypassrls non esiste \ n \ nLINE 9:, r.rolbypassrls \ n \ n ^ \ n ",` sfortunatamente non funziona
ribamar

10

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

2
Meta: sto aggiungendo questo perché questa domanda è molto apprezzata nella query google "ruoli elenco postgres" e ho trascorso un po 'di tempo in risultati molto più bassi prima di trovare quello che volevo, quindi sto memorizzando le informazioni extra.
Adam Shostack,

-1
-- file: src/sql/pgsql/list-table-priviledges.sql
-- usage:
-- alias psql="PGPASSWORD=${postgres_db_useradmin_pw:-} psql -v -q -t -X -w -U ${postgres_db_useradmin:-}"
-- psql -d dev_qto < src/sql/pgsql/list-table-priviledges.sql | less
SELECT grantee, table_name , privilege_type
FROM information_schema.role_table_grants
WHERE 1=1
AND grantee = 'usrqtoapp'
AND table_name='readme_doc'
;

-- purpose:
-- list the priveledges per user or for user in a database
-- eof file: src/sql/pgsql/list-table-priviledges.sql

produzione

usrqtoapp | readme_doc | INSERT
usrqtoapp | readme_doc | SELECT
usrqtoapp | readme_doc | UPDATE
usrqtoapp | readme_doc | DELETE
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.