jueves, julio 03, 2014

PostgreSQL y trabajo en equipo

Quiero que las tablas que crea un usuario puedan ser manipuladas por un grupo de usuarios. Pensé que todo sería tan sencillo como definir un grupo de usuarios y registrar a los usuarios en él, pero nada más lejos de la verdad.

PostgreSQL 9.2


Primero pensé que GRANT <privileges> ON ALL TABLES ON SCHEMA <schema> TO <ROLE> haría la magia si <ROLE> es el grupo.

En cierta manera sí lo hace, pero sólo modifica las tablas existentes. Para las tablas que se crearán a futuro, habría que repetir estos pasos nuevamente.

Una solución permanente es definir los privilegios por defecto de la base de datos. Esto se logra con: ALTER DEFAULT PRIVILEGES GRANT <privileges> ON TABLES TO <ROLE>. Si <ROLE> es el grupo, funciona. Pero, hay un detalle: sólo tiene efecto para el usuario que ejecuta el comando. Es decir, sólo las tablas que él crea obtendrán cederán los privilegios al grupo.

ALTER DEFAULT PRIVILEGES permite definir un rol al que pertenezca quien ejecute el comando, para que se modifiquen las tablas que ese rol cree con los privilegios por defecto. Para definir ese rol se indica después de ALTER DEFAULT PRIVILEGES la frase FOR ROLE <ROLE>.

Así que la solución podría haber sido:

ALTER DEFAULT PRIVILEGES FOR ROLE <ROLE> GRANT <privileges> ON TABLES TO <ROLE>;

Haciendo que ROLE sea el grupo. De esta manera, cuando un miembro del grupo cree una tabla, concederá los privilegios definidos.

Pero no. No funciona, ya lo probé. Lamentablemente habrá que repetir el ALTER DEFAULT PRIVILEGES por cada rol del grupo; y estar pendiente de ejecutar este comando cada vez que se registre un nuevo usuario al grupo y revocar los privilegios por defecto cuando el usuario deje de pertenecer al grupo.