Допустим, у меня есть две группы баз данных Postgresql, «авторы» и «редакторы», и два пользователя, «maxwell» и «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
Я хотел бы написать функцию-исполнитель, которая возвращает список ролей (предпочтительно их oid), к которым принадлежит maxwell, что-то вроде этого:
create or replace function get_all_roles() returns oid[] ...
Он должен возвращать oids для maxwell, авторов и редакторов (но не ernest).
Но я не уверен, как это сделать, когда есть наследство.
pg_has_role()
как, вероятно, немного быстрее, чем мой рекурсивный запрос, даже если это вряд ли имеет значение. И последнее: хотя он возвращает все роли для суперпользователей, что может быть или не быть желанным побочным эффектом. Вот где результат отличается от моего запроса.