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.
źródło
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.To jest uproszczona wersja odpowiedzi Craiga Ringera, z której nieużytkownik może bezpośrednio korzystać:
pg_roles
jest zasadniczo poglądem na tematpg_authid
publicznie dostępnego, ponieważ nie ujawnia haseł, w przeciwieństwie dopg_authid
. Bazaoid
jest nawet eksportowana do widoku. Gdy nie potrzebujesz haseł, nie ma sensu tworzyć dedykowanej funkcji administratora.źródło
Oto moje zdanie na ten temat. Działa dla jednego określonego użytkownika lub wszystkich użytkowników.
źródło
Wierzę, że to zrobi
Jeśli wolisz, aby uzyskać nazwy ról następnie zastąpić pierwszy
oid
zrolname
.źródło
jeśli chcesz poznać wszystkie role swojej obecnie aktywnej roli:
źródło