1. Wenn der Benutzer versehentlich alle seine Objekte mit super-user (postgres) erstellt und später beabsichtigt, zu einem anderen Benutzer zu wechseln, funktioniert REASSIGN OWNED BY nicht und es wird lediglich die Fehlermeldung ausgegeben:
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. Wenn der Benutzer nur den Besitz eines Schemaobjekts ändern möchte.
In Fällen, in denen Objekte geändert werden, von einem „postgres“-Benutzer zu einem anderen Benutzer, oder wenn nur ein Schemaobjekt geändert wird, müssen wir jedes Objekt durchlaufen, indem wir Objektdetails aus pg_catalogs &information_schema sammeln und ALTER TABLE / FUNCTION / AGGREGATE / TYPE aufrufen usw.
Mir gefiel die Technik, die pg_dump-Ausgabe mit Betriebssystembefehlen (sed/egrep) zu optimieren, weil bekannt ist, dass pg_dump von Natur aus ALTER .. OWNER TO für jedes Objekt schreibt (TABLES / SEQUENCES / VIEWS / FUNCTIONS / AGGREGATES / TYPES ) in seiner Ausgabe. Wenn Sie diese Anweisungen von pg_dump stdout eingeben, indem Sie new USER/SCHEMANAME durch sed ersetzen und diese Anweisungen dann an den psql-Client zurückgeben, werden die Probleme behoben, selbst wenn das Objekt dem Postgres-Benutzer gehört. Ich habe den gleichen Ansatz im Skript verwendet und dem Benutzer erlaubt, NEW USER NAME und SCHEMA NAME zu übergeben, um sie in der ALTER…OWNER TO..-Anweisung zu ersetzen.
Skriptverwendung und -ausgabe:
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
Sie können das Skript hier herunterladen, und es gibt auch eine README-Datei, die Ihnen bei der Verwendung hilft.