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.
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.