PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment changer la propriété de tous les objets dans un schéma particulier dans PostgreSQL ?

Quelques suggestions ici (Merci), m'ont inspiré pour composer un script bash pour changer tous les objets (TABLES / SEQUENCES / VIEWS / FUNCTIONS / AGREGATES / TYPES) la propriété d'un schéma particulier en une seule fois. Aucun code spécial inclus dans un script, j'ai essentiellement choisi la technique suggérée et simplifié la méthode de mise en œuvre via un script. En fait, la commande REASSIGN OWNED BY effectue la majeure partie du travail en douceur, cependant, elle modifie la propriété des objets à l'échelle de la base de données, quel que soit le schéma. Deux éventualités, où vous ne pouvez pas utiliser REASSIGN OWNED BY :

1. Si l'utilisateur crée par erreur tous ses objets avec un super-utilisateur (postgres) et a ensuite l'intention de passer à un autre utilisateur, REASSIGN OWNED BY ne fonctionnera pas et il se contentera d'une erreur :

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 l'utilisateur souhaite modifier la propriété d'un seul objet de schéma.

Soit en cas de changement d'objets, d'un utilisateur "postgres" à un autre utilisateur ou simplement en changeant un seul objet de schéma, nous devons parcourir chaque objet en collectant les détails de l'objet à partir de pg_catalog's &information_schema et en appelant ALTER TABLE / FUNCTION / AGGREGATE / TYPE etc.

J'ai aimé la technique d'ajustement de la sortie de pg_dump à l'aide des commandes du système d'exploitation (sed/egrep), car il savait que, par nature, pg_dump écrit ALTER .. OWNER TO de chaque objet (TABLES / SEQUENCES / VIEWS / FUNCTIONS / AGGREGATES / TYPES ) dans sa sortie. Grep'ing ces instructions de pg_dump stdout en remplaçant new USER/SCHEMANAME par sed puis en renvoyant ces instructions au client psql corrigera les choses même si l'objet appartient à l'utilisateur Postgres. J'ai utilisé la même approche dans le script et autorisé l'utilisateur à transmettre le NOUVEAU NOM D'UTILISATEUR et le NOM DU SCHÉMA, afin de le remplacer dans l'instruction ALTER…OWNER TO..

Utilisation et sortie du 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

Vous pouvez télécharger le script à partir d'ici, et il y a aussi README pour vous aider sur l'utilisation.