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.