Digamos que tengo dos grupos de bases de datos Postgresql, "autores" y "editores", y dos usuarios, "maxwell" y "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
Me gustaría escribir una función performante que devuelva una lista de los roles (preferiblemente sus oid) a los que pertenece maxwell, algo como esto:
create or replace function get_all_roles() returns oid[] ...
Debería devolver los oids para maxwell, autores y editores (pero no ernest).
Pero no estoy seguro de cómo hacerlo cuando hay herencia.
fuente
pg_has_role()
es probablemente un poco más rápido que mi consulta recursiva, incluso si eso apenas importa. Sin embargo, una última cosa: devuelve todos los roles para los superusuarios, lo que puede o no ser un efecto secundario bienvenido. Ahí es donde el resultado difiere de mi consulta.Esta es una versión simplificada de la respuesta de Craig Ringer que un no superusuario puede usar directamente:
pg_roles
es esencialmente una vistapg_authid
accesible al público, ya que no revela contraseñas, al contrario depg_authid
. La baseoid
incluso se exporta a la vista. Cuando no se necesitan contraseñas, no tiene sentido crear la función dedicada propiedad del superusuario.fuente
Aquí está mi opinión al respecto. Funciona para un usuario específico o para todos los usuarios.
fuente
Creo que esto lo hará
Si prefiere obtener los nombres de los roles, reemplace el primero
oid
conrolname
.fuente
si desea conocer todos los roles de su rol actualmente activo:
fuente