Lister les privilèges de base de données en utilisant psql

144

Je suis au milieu d'une migration de serveur de base de données et je ne peux pas comprendre (après avoir googlé et recherché ici) comment répertorier les privilèges de la base de données (ou tous les privilèges sur le serveur) sur PostgreSQL à l'aide de l' psqloutil de ligne de commande?

Je suis sur Ubuntu 11.04 et ma version de PostgreSQL est 8.2.x.

Pedrosanta
la source

Réponses:

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

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

Dr Colossos
la source
5
\z myTableest parfait pour vous assurer que vous avez accordé l'accès à quelqu'un et que vous évitez de ressembler à un idiot lorsque vous dites "d'accord, est-ce que ça marche maintenant? ça ne
marche
109

peut-être que vous voulez dire par la liste des utilisateurs et de leurs privilèges pour une base de données - je ne peux pas dire très bien 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
Jack Douglas
la source
Non, je voulais un moyen de lister les privilèges d'une base de données spécifique, mais je l'avais déjà compris. Le propriétaire de la base de données a toujours tous les privilèges, non? Et ensuite, nous pouvons ajouter plus de privilèges sur la base de données à d'autres utilisateurs / groupes. Ceux-ci sont listés avec la commande \ l. Mais merci quand même.
Pedrosanta
80

Vous pouvez le faire en suivant:

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

Cela vous donne ce genre 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=#
Himanshu Chauhan
la source
10
Bienvenue sur le site! Une petite question: pourquoi avez-vous inséré la sortie en tant que capture d'écran? Veuillez utiliser du texte normal aussi souvent que possible.
dezso
1
Existe-t-il un moyen de voir les autorisations pour les séquences? Cela ne donne que des informations sur les tables
curieux
Notez que (au moins sous Postgres 9.4), ce qui précède ne fonctionnera pas pour les vues matérialisées.
SeldomNeedy
@HimanshuChauhan, si j'ajoute un nouveau rôle 'new_role' à l'aide du rôle 'mailreader', la liste information_schema.role_table_grants sera-t-elle également gérée?
Anand
15

Utiliser les psqlméta-commandes:

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

Passer en revue 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 ] Répertoriez les bases de données sur le serveur et montrez .... les privilèges d'accès.

Également mentionné ci-dessus, mais ne se trouve pas avec le mot "privilèges" dans la page de manuel:

\du+pour les rôles avec connexion et \dg+pour les rôles sans - aura un fichier dans "Member of"lequel vous trouverez les rôles attribués aux rôles.

Je saute délibérément des privilèges de fonction et de langage ici, trouvés dans le psqlmanuel comme étant à 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, etc. - l'utilisation de "+" après la méta-commande vous indiquera les privilèges, le cas échéant.


Un moyen un peu extrême de vérifier les privilèges consiste à laisser 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 complet dans les journaux ...

Vao Tsun
la source
12

Undercovers psql utilise la requête ci-dessous lorsque vous exécutez une \ducommande.

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;
Dennis
la source
est-ce la norme SQL?
Ribamar
`" ERREUR: la colonne r.rolbypassrls n’existe pas \ n \ nLINE 9:, r.rolbypassrls \ n \ n \ \ n ",` ne fonctionne malheureusement pas
ribamar
10

Une étape supplémentaire (éventuellement évidente) consiste à devenir l'utilisateur postgres, sinon vous risquez de recevoir des erreurs concernant des rôles inexistants.

sudo su - postgres
psql -l

ou

psql
postgres=> \l
Adam Shostack
la source
2
Meta: J'ajoute ceci parce que cette question est très cotée sur la requête Google "postgres list roles" et que j'ai passé un peu de temps sur des résultats beaucoup moins bien classés avant de trouver ce que je cherchais, je me souviens donc des informations supplémentaires.
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

sortie

usrqtoapp | readme_doc | INSERT
usrqtoapp | readme_doc | SELECT
usrqtoapp | readme_doc | UPDATE
usrqtoapp | readme_doc | DELETE
Yordan Georgiev
la source