---------- Mensaje reenviado ---------- De: Fernando Moreno <[EMAIL PROTECTED]> Fecha: 8 de agosto de 2008 22:10 Asunto: Re: [pgsql-es-ayuda] Respaldo de base de datos y usuarios únicos Para: Alvaro Herrera <[EMAIL PROTECTED]>
El 4 de agosto de 2008 14:15, Alvaro Herrera <[EMAIL PROTECTED]>escribió: > Fernando Moreno escribió: > > > Para poder mantener una especie de encapsulamiento entre los usuarios y > la > > única base de datos desde donde se podrá usar (sin interferir con las > > demás), estaba pensando en una solución a base de prefijos alfanuméricos. > > Ugh. Creo que te conviene mirar aca: > http://www.postgresql.org/docs/8.3/static/runtime-config-connection.html > > La última opción que aparece es "db_user_namespace". Hacerlo de esa > forma debe ser mucho más sencillo que lo que propones. > > -- > Alvaro Herrera Valdivia, Chile Geotag: -39,815 -73,257 > Syntax error: function hell() needs an argument. > Please choose what hell you want to involve. Qué tal, antes que nada gracias por la respuesta. He hecho algunas pruebas y con la opción que sugieres puedo evitar la aplicación de prefijos, pues aunque aparentemente dos usuarios tengan el mismo nombre, la base de datos a la que se conecten determinará su identidad real en el servidor. Lo que sí me parece inevitable es un procesamiento de los respaldos, de primera me imaginé un pg_dump normal, excluyendo privilegios (--no-acl), un dump más únicamente con privilegios, y un pg_dumpall para respaldar sólo los roles. El primer inconveniente es que pg_dump tiene parámetros para excluir grant/revoke, pero no para dejarlos de manera similar a la opción --data-only. Quizás sacando respaldos con y sin privilegios, y aplicando una "resta" entre ellos, pero creo que complica de más las cosas. Afortunadamente, todos los privilegios asignados a los usuarios se corresponden con las tablas que controlan sus permisos dentro de la aplicación (una especie de privilegios de alto nivel), así que es posible partir con usuarios sin ningún privilegio concedido/retirado, y reconstruirlos a partir de estas tablas. Con esa aproximación los pasos para respaldar serían: * pg_dump de la base de datos excluyendo privilegios. * pg_dumpall de los roles, considerando únicamente los que pertenezcan a la base respaldada, es decir, que tengan "@mibase" en su nombre. Para restaurar: * Crear la base de datos con el nombre deseado. * En el dump de roles, agregar el nombre de la nueva base después de "@". Ejecutar el script. * Con una función ya existente en la base, procesar los permisos almacenados en las tablas, para traducirlos a grant/revoke sobre todos los objetos (tablas, vistas, esquemas, secuencias y funciones). Bueno, de momento no parece mucho más sencillo que la opción anterior, pero definitivamente es más seguro y libre de chapuzas aleatorias. Saludos. Pd. Sólo espero que no eliminen esta característica, o que su reemplazo sea lo suficientemente parecido para no echar por tierra esta solución.
