Rufen Sie den Namen des DB-Besitzers in PostgreSql ab

73

Ich habe DB "Test" in PostgreSql. Ich möchte SQL schreiben, um Eigentümer meiner Datenbank zu bekommen.

Mindia
quelle

Antworten:

76

Sie finden solche Dinge im Systemkatalog

SELECT d.datname as "Name",
pg_catalog.pg_get_userbyid(d.datdba) as "Owner"
FROM pg_catalog.pg_database d
WHERE d.datname = 'database_name'
ORDER BY 1;
DrColossos
quelle
1
'dein Name'?? Was ist das? Ich muss etwas übergeben, das ich nicht weiß, um etwas zu wissen?
Daniel Möller
@ DanielMöller Du kennst den DB-Namen. Es ist nur der Eigentümer der angegebenen Datenbank, den Sie ermitteln möchten. Wenn Sie den DB-Namen nicht kennen, lassen Sie diese WHERE-Klausel einfach weg.
ManoDestra
Ich wollte oben "Name" der angegebenen Datenbank sagen.
ManoDestra
52

Wenn Sie das Befehlszeilentool psql verwenden, können Sie es einfach verwenden\l

Gilad Mayani
quelle
Dies gibt eine Liste der Datenbanken zurück, jedoch die Eigentümer der Datenbanken.
Flimm
2
@Flimm Ich habe Ihren Kommentar nicht verstanden - dies gibt eine Liste aller auf dem Server vorhandenen DBs (der aktuelle Benutzer hat die Berechtigung zum Anzeigen) mit dem Eigentümer jeder DB zurück.
Gilad Mayani
Du hast recht. Ich habe verwendet, pgcliwas aus irgendeinem Grund ein anderes Ergebnis ergibt.
Flimm
Dies sollte die akzeptierte Antwort sein
qichao_he
41

Sie können die Kombination aus verwenden pg_database, pg_usersSystemtabellen und current_database()Funktion auf diese Weise:

 SELECT u.usename 
 FROM pg_database d
  JOIN pg_user u ON (d.datdba = u.usesysid)
 WHERE d.datname = (SELECT current_database());
AndreaBoc
quelle
Dies funktioniert nicht, wenn die Datenbank einer Rolle (einer Gruppe von Benutzern) und nicht einem Benutzer gehört.
JC Boggio
2

Diese Arbeit mit Datenbanken, die der Gruppenrolle gehören:

SELECT
    U.rolname
   ,D.datname
FROM
    pg_roles AS U JOIN pg_database AS D ON (D.datdba = U.oid)
WHERE
    D.datname = current_database();

Die Verwendung von pg_authid(wie in meiner vorherigen Version) anstelle von pg_rolesist auf SuperUser beschränkt, da es ein Kennwort enthält (siehe Dokumentation ):

Da dieser Katalog Passwörter enthält, darf er nicht öffentlich lesbar sein. pg_rolesist eine öffentlich lesbare Ansicht pg_authid, die das Passwortfeld ausblendet.

jlandercy
quelle
Beim Ausführen wurde die Berechtigung für die Beziehung pg_authid verweigert. Was ist erforderlich?
Steven Yong
1
@StevenYong, vielen Dank für den Hinweis, ich habe meine Antwort aktualisiert. Das Lesen der doc, ist es ausreichend , zu ersetzen pg_authiddurch pg_roles. Einen schönen Tag noch.
Jlandercy
1

Sie können die Rollen-OID einfach mit magic :: rainole umwandeln, um den Rollennamen des Eigentümers anzugeben:

SELECT datdba::regrole FROM pg_database WHERE datname = 'test' ;
Sol
quelle
0

Die folgende Abfrage zeigt Informationen für alle Tabellen im öffentlichen Schema an:

 select t.table_name, t.table_type, c.relname, c.relowner, u.usename
 from information_schema.tables t
 join pg_catalog.pg_class c on (t.table_name = c.relname)
 join pg_catalog.pg_user u on (c.relowner = u.usesysid)
 where t.table_schema='public';

Quelle: http://cully.biz/2013/12/11/postgresql-getting-the-owner-of-tables/

Sushmitha Shenoy
quelle
0

Denken Sie in SQL, einschließlich Postgres, daran, dass Sie eine Hierarchie innerhalb einer bestimmten SQL Server-Instanz haben: catalog/db > schema > tables

Wenn für perms / Metadaten suchen sie in einem Katalog möchten Sie sehen ,information_schema

Beispiel: information_schema.role_table_grants für Dauerwellen

Beispiel: information_schema.role_usage_grants für SEQUENCE / Schema-Perms

https://www.postgresql.org/docs/current/information-schema.html

Für die Konfiguration / Meta auf Katalog- / DB-Ebene müssen Sie eine andere Ebene in suchen pg_catalog.

https://www.postgresql.org/docs/current/catalogs.html

Beispiel:

SELECT dbs.datname, roles.rolname
  FROM pg_catalog.pg_database dbs, pg_catalog.pg_roles roles
 WHERE dbs.datdba = roles.oid;

pg_catalog.pg_database.datdba hat die ID der Eigentümerrolle.

pg_catalog.pg_roles.oid hat ID der Eigentümerrolle (Join)

pg_catalog.pg_roles.rolname hat Name / Zeichenfolge der Eigentümerrolle

mattpr
quelle