Roles y privilegios
¿Cómo funcionan los roles y privilegios en PostgreSQL?
En PostgreSQL, tanto los usuarios como los grupos son roles. GRANT otorga a un rol privilegios sobre objetos, y un rol que es miembro de otro rol puede usar los privilegios de ese rol.
PostgreSQL controla el acceso mediante roles. Un rol puede actuar como usuario (tiene el atributo LOGIN), como grupo o como ambos, y los roles son dueños de objetos de la base de datos. Los privilegios como SELECT, INSERT, UPDATE y USAGE se otorgan sobre objetos concretos con GRANT y se retiran con REVOKE.
Hacer que un rol sea miembro de otro le permite usar los privilegios de ese otro rol, así que un patrón común es otorgar privilegios a roles de grupo y agregar los roles de inicio de sesión a esos grupos. Los roles existen para todo el clúster de bases de datos, no por base de datos. El dueño de un objeto y los superusuarios pueden hacer cualquier cosa con él, así que mantén los roles de la aplicación separados de los dueños y de los superusuarios.
Ejemplo
El ejemplo crea un rol de grupo llamado reporting, un rol de inicio de sesión llamado analyst que pertenece a él, y otorga SELECT al grupo. has_table_privilege confirma que analyst puede leer la tabla pero no insertar en ella.
CREATE ROLE reporting NOLOGIN;
CREATE ROLE analyst LOGIN IN ROLE reporting;
CREATE TABLE revenue_daily (day date PRIMARY KEY, amount numeric);
GRANT SELECT ON revenue_daily TO reporting;
SELECT has_table_privilege('analyst', 'revenue_daily', 'SELECT') AS can_select,
has_table_privilege('analyst', 'revenue_daily', 'INSERT') AS can_insert;SQL simple para PostgreSQL 16 o 17 estándar, sin extensiones. Ejecútalo en una base de datos vacía que puedas descartar.
Fuentes
Documentación oficial de PostgreSQL (en inglés).