1. Als de gebruiker per ongeluk al zijn objecten maakt met super-user(postgres), en later van plan is om naar een andere gebruiker over te gaan, dan zal REASSIGN OWNED BY niet werken en er zal alleen een fout optreden als:
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. Als de gebruiker het eigendom van slechts één schemaobject wil wijzigen.
Ofwel gevallen van het veranderen van objecten, van "postgres" gebruiker naar andere gebruiker of het veranderen van slechts één schema-object, we moeten elk object doorlopen door objectdetails te verzamelen van pg_catalog's &information_schema en ALTER TABLE / FUNCTION / AGGREGATE / TYPE aan te roepen enz.
Ik vond de techniek van het tweaken van pg_dump-uitvoer met behulp van OS-commando's (sed/egrep), omdat het bekend was dat de pg_dump van nature ALTER .. OWNER TO van elk object schrijft (TABELLEN / SEQUENCES / VIEWS / FUNCTIONS / AGGREGATES / TYPES ) in de uitvoer. Het ophalen van die instructies van pg_dump stdout door de nieuwe USER/SCHEMANAME te vervangen door sed en deze instructies vervolgens terug te sturen naar de psql-client, zal de dingen oplossen, zelfs als het object eigendom is van de Postgres-gebruiker. Ik gebruikte dezelfde aanpak in het script en stond de gebruiker toe om NIEUWE GEBRUIKERSNAAM en SCHEMA NAAM door te geven, dus om het te vervangen in de instructie ALTER...OWNER TO..
Scriptgebruik en uitvoer:
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
Je kunt het script hier downloaden en er is ook README om je te helpen bij het gebruik.