web-dev-qa-db-fra.com

Liste des privilèges de base de données à l'aide de psql

Je suis au milieu d'une migration de serveur de base de données et je n'arrive pas à comprendre (après avoir googlé et cherché ici) comment puis-je répertorier les privilèges de base de données (ou tous les privilèges sur le serveur) sur PostgreSQL en utilisant le psql outil de ligne de commande?

Je suis sur Ubuntu 11.04 et ma version PostgreSQL est 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

Les documents sur GRANT expliquent comment interpréter la sortie. Pour des privilèges spécifiques sur une table de la base de données actuelle, utilisez \z myTable.

134
DrColossos

peut-être que vous voulez dire la liste des utilisateurs et leurs privilèges pour une base de données - je ne peux pas tout à fait dire de la question:

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

Vous pouvez le faire en suivant:

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

Cela vous donne ce type de sortie:

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

Utilisation des méta-commandes psql:

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

Parcourir la page avec Ctrl + F donne:

\ddp [ pattern ] Répertorie les paramètres de privilège d'accès par défaut.

\dp [ pattern ] Répertorie les tables, les vues et les séquences avec leurs privilèges d'accès associés.

\l[+] [ pattern ] Lister les bases de données sur le serveur et afficher .... les privilèges d'accès.

Également mentionné ci-dessus, mais introuvable avec les "privilèges" Word sur la page de manuel:

\du+ pour les rôles avec connexion et \dg+ pour les rôles sans - aura un fichier "Member of" où vous trouvez les rôles accordés aux rôles.

Je saute délibérément les privilèges de fonction et de langage ici, trouvés dans le manuel psql comme à peine manipulés (et si vous utilisez ces privilèges, vous ne viendrez pas ici pour un conseil). idem pour les types définis par l'utilisateur, les domaines et ainsi de suite - l'utilisation de "+" après la méta-commande vous montrera les privilèges le cas échéant.


Une façon un peu extrême de vérifier les privilèges consiste à supprimer l'utilisateur en transaction, par exemple:

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

Lorsque la liste est plus longue que N, (au moins en 9.3), l'avertissement avec la liste des privilèges est réduit, mais vous pouvez toujours le trouver plein dans les journaux ...

18
Vao Tsun

Undercovers psql utilise la requête ci-dessous lorsque vous émettez \du commande.

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

Une étape supplémentaire (peut-être évidente) est de devenir l'utilisateur postgres, sinon vous pouvez obtenir des erreurs sur les rôles qui n'existent pas.

Sudo su - postgres
psql -l

ou

psql
postgres=> \l
10
Adam Shostack

Voici ma requête composée de plusieurs réponses à cette question:

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;

Cela se traduit par quelque chose comme ceci:

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