PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come modificare la proprietà di tutti gli oggetti in un particolare schema in PostgreSQL?

Ci sono pochi suggerimenti qui (Grazie), mi hanno ispirato a comporre uno script bash per cambiare tutti gli (TABELLE / SEQUENZE / VISUALIZZAZIONI / FUNZIONI / AGGREGATI / TIPI) di tutti gli oggetti. proprietà in un particolare schema in una volta sola. Nessun codice speciale incluso in uno script, in pratica ho scelto la tecnica suggerita e ho semplificato il metodo di implementazione tramite script. In realtà, il comando REASSIGN OWNED BY esegue la maggior parte del lavoro senza intoppi, tuttavia cambia la proprietà degli oggetti a livello di database indipendentemente da qualsiasi schema. Due eventualità, in cui non è possibile utilizzare REASSIGN OWNED BY:

1. Se l'utente per errore crea tutti i suoi oggetti con super-utente (postgres), e in seguito intende passare a un altro utente, allora REASSIGN OWNED BY non funzionerà e semplicemente comporterà un errore come:

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. Se l'utente desidera modificare solo una proprietà degli oggetti dello schema.

In entrambi i casi di modifica degli oggetti, dall'utente "postgres" ad un altro utente o semplicemente modificando un solo oggetto dello schema, è necessario scorrere ogni oggetto raccogliendo i dettagli dell'oggetto da pg_catalog's &information_schema e chiamando ALTER TABLE / FUNCTION / AGGREGATE / TYPE ecc.

Mi è piaciuta la tecnica di modificare l'output di pg_dump usando i comandi del sistema operativo (sed/egrep), perché sapeva che per natura il pg_dump scrive ALTER .. OWNER TO di ogni oggetto (TABLES / SEQUENCES / VIEWS / FUNCTIONS / AGGREGATES / TYPES ) nel suo output. Grep'ing quelle istruzioni da pg_dump stdout sostituendo new USER/SCHEMANAME con sed e quindi restituendo quelle istruzioni al client psql risolverà le cose anche se l'oggetto è di proprietà dell'utente Postgres. Ho utilizzato lo stesso approccio nello script e ho consentito all'utente di passare NEW USER NAME e SCHEMA NAME, in modo da sostituirlo nell'istruzione ALTER...OWNER TO..

Uso e output degli 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

Puoi scaricare lo script da qui e c'è anche README per aiutarti nell'utilizzo.