it-swarm-eu.dev

Listen Sie die Datenbankberechtigungen mit psql auf

Ich bin mitten in einer Datenbankservermigration und kann nicht herausfinden (nachdem ich hier gegoogelt und gesucht habe), wie ich die Datenbankberechtigungen (oder alle Berechtigungen auf dem Server) in PostgreSQL mit psql auflisten kann Kommandozeilen-Tool?

Ich bin auf Ubuntu 11.04 und meine PostgreSQL-Version ist 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

Das docs on GRANT gibt eine Erklärung zur Interpretation der Ausgabe. Verwenden Sie für bestimmte Berechtigungen für eine Tabelle der aktuellen Datenbank \z myTable.

134
DrColossos

vielleicht meinen Sie damit, Benutzer und ihre Berechtigungen für eine Datenbank aufzulisten - ich kann es der Frage nicht recht entnehmen:

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

Sie können dies tun, indem Sie Folgendes tun:

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

Dies gibt Ihnen diese Art von Ausgabe:

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

Verwenden von psql Meta-Befehlen:

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

Wenn Sie mit Strg + F über die Seite gehen, erhalten Sie:

\ddp [ pattern ] Listet die Standardeinstellungen für Zugriffsrechte auf.

\dp [ pattern ] Listet Tabellen, Ansichten und Sequenzen mit den zugehörigen Zugriffsrechten auf.

\l[+] [ pattern ] Listen Sie die Datenbanken auf dem Server auf und zeigen Sie .... Zugriffsrechte an.

Auch oben erwähnt, aber nicht mit Word "Berechtigungen" auf der Handbuchseite gefunden:

\du+ Für Rollen mit Login und \dg+ Für Rollen ohne - haben ein Feld "Member of", In dem Sie Rollen finden, die Rollen zugewiesen wurden.

Ich überspringe hier absichtlich Funktions- und Sprachberechtigungen, die im Handbuch psql als kaum manipuliert zu finden sind (und wenn Sie diese Berechtigungen verwenden, werden Sie nicht hierher kommen, um Ratschläge zu erhalten). Gleiches gilt für benutzerdefinierte Typen, Domänen usw. Wenn Sie nach dem Meta-Befehl "+" verwenden, werden Ihnen gegebenenfalls Berechtigungen angezeigt.


Eine kleine extreme Möglichkeit, die Berechtigungen zu überprüfen, besteht darin, den Benutzer in der Transaktion zu löschen, z.

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

Wenn die Liste länger als N ist (zumindest in 9.3), wird die Warnung mit der Liste der Berechtigungen reduziert, aber Sie können sie immer noch in den Protokollen finden ...

18
Vao Tsun

Undercovers psql verwendet die folgende Abfrage, wenn Sie \du Befehl.

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

Ein (möglicherweise offensichtlicher) zusätzlicher Schritt ist, der Postgres-Benutzer zu werden, andernfalls können Fehler über nicht vorhandene Rollen auftreten.

Sudo su - postgres
psql -l

oder

psql
postgres=> \l
10
Adam Shostack

Dies ist meine Anfrage, die sich aus mehreren Antworten auf diese Frage zusammensetzt:

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;

Dies führt zu ungefähr so:

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