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.
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
.
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=#
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 ...
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;
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
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 |
+------+--------------+----------------+