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