Допустим, у меня есть две группы баз данных 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()
как, вероятно, немного быстрее, чем мой рекурсивный запрос, даже если это вряд ли имеет значение. И последнее: хотя он возвращает все роли для суперпользователей, что может быть или не быть желанным побочным эффектом. Вот где результат отличается от моего запроса.Это упрощенная версия ответа Крейга Рингера, которую может использовать не суперпользователь:
pg_roles
Это, по сути, взгляд наpg_authid
доступность для общественности, поскольку он не раскрывает пароли, в отличие отpg_authid
. Базаoid
даже экспортируется в вид. Когда не нужны пароли, нет смысла создавать отдельную функцию, принадлежащую суперпользователю.источник
Вот мой взгляд на это. Это работает для одного конкретного пользователя или всех пользователей.
источник
Я верю, что это сделает
Если вы предпочитаете получать имена ролей, замените первое
oid
наrolname
.источник
если вы хотите знать все роли вашей текущей активной роли:
источник