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.

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;

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


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());

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.


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' ;


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

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.