Digamos que eu tenha dois grupos de banco de dados do Postgresql, "autores" e "editores", e dois usuários, "maxwell" e "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
Eu gostaria de escrever uma função de desempenho que retorne uma lista dos papéis (de preferência de seus oids) aos quais o maxwell pertence, algo como isto:
create or replace function get_all_roles() returns oid[] ...
Ele deve retornar os oids para maxwell, autores e editores (mas não para ernest).
Mas não sei como fazê-lo quando houver herança.
fonte
pg_has_role()
provavelmente é um pouco mais rápido que minha consulta recursiva, mesmo que isso dificilmente importe. Uma última coisa, porém: ele retorna todas as funções para os superusuários, o que pode ou não ser um efeito colateral bem-vindo. É aí que o resultado difere da minha consulta.Esta é uma versão simplificada da resposta de Craig Ringer que um não superusuário pode usar diretamente:
pg_roles
é essencialmente uma visãopg_authid
acessível ao público, pois não revela senhas, ao contrário depg_authid
. A baseoid
é exportada até para a exibição. Quando não precisar de senhas, não há sentido em criar a função dedicada ao superusuário.fonte
Aqui está a minha opinião. Funciona para um usuário específico ou para todos os usuários.
fonte
Eu acredito que isso fará isso
Se você preferir obter os nomes das funções, substitua a primeira
oid
porrolname
.fonte
se você quiser conhecer todas as funções da sua função ativa no momento:
fonte