Listen Sie die Datenbankberechtigungen mit psql auf


142

Ich befinde mich 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) unter PostgreSQL mithilfe des psqlBefehlszeilentools auflisten kann.

Ich bin auf Ubuntu 11.04 und meine PostgreSQL-Version ist 8.2.x.

Antworten:


116
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

In den Dokumenten wirdGRANT erläutert, wie die Ausgabe interpretiert wird. Verwenden Sie für bestimmte Berechtigungen für eine Tabelle der aktuellen Datenbank \z myTable.


5
\z myTableist perfekt, um sicherzustellen, dass Sie erfolgreich Zugriff auf jemanden gewährt haben und zu vermeiden, wie ein Idiot
auszusehen,

107

Vielleicht meinst du das Auflisten von Benutzern und deren Berechtigungen für eine Datenbank - ich kann es anhand der Frage nicht ganz sagen:

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

Nein, ich wollte eine Möglichkeit finden, die Berechtigungen einer bestimmten Datenbank aufzulisten, aber ich habe es bereits herausgefunden. Der Besitzer der Datenbank hat immer alle Rechte, oder? Anschließend können wir anderen Benutzern / Gruppen weitere Berechtigungen für die Datenbank hinzufügen. Diese werden mit dem Befehl \ l aufgelistet. Aber trotzdem vielen Dank.
pedrosanta

80

Sie können dies folgendermaßen 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=#

10
Willkommen auf der Seite! Eine kleine Frage: Warum haben Sie die Ausgabe als Screenshot eingefügt? Bitte verwenden Sie so oft wie möglich normalen Text.
Dezso


1
Gibt es eine Möglichkeit, die Berechtigung für Sequenzen anzuzeigen? Dies gibt nur Tabelleninformationen
neugierig

Beachten Sie, dass (zumindest unter Postgres 9.4) die obigen Einstellungen für materialisierte Ansichten nicht funktionieren.
SeldomNeedy

@HimanshuChauhan Wenn ich eine neue Rolle 'new_role' mit der Rolle 'mailreader' hinzufüge, listet das information_schema.role_table_grants dann auch die neue Rolle auf?
Anand

15

Verwenden von psqlMetabefehlen:

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 dem Wort "Privilegien" auf der Handbuchseite gefunden:

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

Ich überspringe hier absichtlich Funktionen und Sprachrechte, die im psqlHandbuch als kaum manipuliert befunden werden (und wenn Sie diese Rechte 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 ggf. Berechtigungen angezeigt.


Ein etwas extremer Weg, um die Privilegien zu überprüfen, ist das Löschen des Benutzers in einer Transaktion, zB:

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 (mindestens in 9.3), wird die Warnung mit der Liste der Berechtigungen ausgeblendet, Sie finden sie jedoch weiterhin in den Protokollen ...


12

Undercovers psql verwendet die folgende Abfrage, wenn Sie einen \duBefehl absetzen .

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;

Ist das SQL-Standard?
Ribamar

"FEHLER: Spalte r.rolbypassrls existiert nicht \ n \ nLINE 9:, r.rolbypassrls \ n \ n ^ \ n", "funktioniert leider nicht
ribamar 31.12.18

10

Ein (möglicherweise offensichtlicher) zusätzlicher Schritt besteht darin, dass der Benutzer postgres wird. Andernfalls erhalten Sie möglicherweise Fehler zu Rollen, die nicht vorhanden sind.

sudo su - postgres
psql -l

oder

psql
postgres=> \l

2
Meta: Ich füge dies hinzu, weil diese Frage bei der Google-Abfrage "Postgres-Listenrollen" hoch bewertet wird und ich einige Zeit in Ergebnissen mit viel niedrigerem Rang verbracht habe, bevor ich das Gewünschte gefunden habe.
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

Ausgabe

usrqtoapp | readme_doc | INSERT
usrqtoapp | readme_doc | SELECT
usrqtoapp | readme_doc | UPDATE
usrqtoapp | readme_doc | DELETE
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.