Angenommen, ich habe zwei Postgresql-Datenbankgruppen, "Autoren" und "Redakteure", und zwei Benutzer, "Maxwell" und "Ernest".
create role authors;
create role editors;
create user maxwell;
create user ernest;
grant authors to editors; --editors can do what authors can do
grant editors to maxwell; --maxwell is an editor
grant authors to ernest; --ernest is an author
Ich möchte eine performante Funktion schreiben, die eine Liste der Rollen (vorzugsweise deren Oids) zurückgibt, zu denen Maxwell gehört.
create or replace function get_all_roles() returns oid[] ...
Es sollte die oids für Maxwell, Autoren und Herausgeber (aber nicht ernest) zurückgeben.
Aber ich bin nicht sicher, wie ich es tun soll, wenn es Vererbung gibt.
quelle
pg_has_role()
ist wohl etwas schneller als meine rekursive Abfrage, auch wenn das kaum eine Rolle spielt. Eine letzte Sache jedoch: Es gibt alle Rollen für Supernutzer zurück, was ein willkommener Nebeneffekt sein kann oder nicht. Hier unterscheidet sich das Ergebnis von meiner Anfrage.Dies ist eine vereinfachte Version der Antwort von Craig Ringer, die ein Nicht-Superuser direkt verwenden kann:
pg_roles
ist im Wesentlichen eine Sichtweise aufpg_authid
öffentlich zugängliche, da sie im Gegensatz zu Passwörtern nicht offenbartpg_authid
. Die Basisoid
wird sogar in die Ansicht exportiert. Wenn Sie keine Passwörter benötigen, macht es keinen Sinn, die dedizierte Superuser-eigene Funktion zu erstellen.quelle
Hier ist meine Meinung dazu. Es funktioniert für einen bestimmten Benutzer oder für alle Benutzer.
quelle
Ich glaube, das wird es schaffen
Wenn Sie die Rollennamen erhalten möchten, ersetzen Sie den ersten
oid
durchrolname
.quelle
Wenn Sie alle Rollen Ihrer derzeit aktiven Rolle kennen möchten:
quelle