sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo cambiar la propiedad de todos los objetos en un esquema particular en PostgreSQL?

Algunas sugerencias aquí (gracias), me inspiraron a componer un script bash para cambiar (TABLAS / SECUENCIAS / VISTAS / FUNCIONES / AGREGADOS / TIPOS) de todos los objetos propiedad en un esquema particular de una sola vez. No se incluye ningún código especial en un script, básicamente elegí la técnica sugerida y simplifiqué el método de implementación a través del script. En realidad, el comando REASIGNAR PROPIEDAD POR hace la mayor parte del trabajo sin problemas, sin embargo, cambia la propiedad de los objetos en toda la base de datos independientemente de cualquier esquema. Dos eventualidades, en las que no puede usar REASIGNAR PROPIEDAD DE:

1. Si el usuario por error crea todos sus objetos con superusuario (postgres), y luego tiene la intención de cambiar a otro usuario, entonces REASIGNAR PROPIEDAD DE no funcionará y simplemente saldrá como:

postgres=# reassign owned by postgres to user1;
ERROR: cannot reassign ownership of objects owned by role postgres because they are required by the database system

2. Si el usuario desea cambiar solo la propiedad de un objeto de esquema.

Ya sea en casos de cambio de objetos, de usuario "postgres" a otro usuario o simplemente cambiando solo un objeto de esquema, necesitamos recorrer cada objeto recopilando detalles del objeto de pg_catalog's &information_schema y llamando a ALTER TABLE / FUNCTION / AGGREGATE / TYPE etc.

Me gustó la técnica de ajustar la salida de pg_dump usando los comandos del sistema operativo (sed/egrep), porque sabía que, por naturaleza, pg_dump escribe ALTER .. OWNER TO de cada objeto (TABLES / SEQUENCES / VIEWS / FUNCTIONS / AGGREGATES / TYPES ) en su salida. Grep'ing esas declaraciones de pg_dump stdout reemplazando new USER/SCHEMANAME con sed y luego devolviendo esas declaraciones al cliente psql arreglará las cosas incluso si el objeto es propiedad del usuario de Postgres. Utilicé el mismo enfoque en la secuencia de comandos y permití que el usuario pasara NUEVO NOMBRE DE USUARIO y NOMBRE DE ESQUEMA, para reemplazarlo en ALTERAR... PROPIETARIO A... declaración.

Uso y salida del script:

sh change_owner.sh  -n new_rolename -S schema_name

-bash-4.1$ sh change_owner.sh -n user1 -S public

Summary:
Tables/Sequences/Views : 16
Functions : 43
Aggregates : 1
Type : 2

Puede descargar el script desde aquí, y también hay README para ayudarlo con el uso.