Załóżmy, że mam dwie grupy baz danych Postgresql, „autorów” i „redaktorów” oraz dwóch użytkowników, „maxwell” i „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
Chciałbym napisać funkcję wykonawczą, która zwraca listę ról (najlepiej ich identyfikatorów), do których należy maxwell, mniej więcej tak:
create or replace function get_all_roles() returns oid[] ...
Powinien zwrócić Oids dla Maxwella, autorów i redaktorów (ale nie Ernest).
Ale nie jestem pewien, jak to zrobić, gdy istnieje dziedzictwo.
pg_has_role()
jest to prawdopodobnie nieco szybsze niż moje zapytanie rekurencyjne, nawet jeśli nie ma to większego znaczenia. I ostatnia rzecz: zwraca wszystkie role dla superużytkowników, co może, ale nie musi, być pożądanym efektem ubocznym. Właśnie tam wynik różni się od mojego zapytania.