1. Om användaren av misstag skapar alla sina objekt med super-user(postgres), och senare avser att byta till en annan användare, kommer REASSIGN OWNED BY inte att fungera och det felar bara som:
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. Om användaren vill ändra bara ett schema objekt äganderätt.
Antingen det gäller att byta objekt, från "postgres" användare till en annan användare eller bara ändra ett schemaobjekt, vi måste gå igenom varje objekt genom att samla in objektdetaljer från pg_catalogs &information_schema och anropa ALTER TABLE / FUNCTION / AGGREGATE / TYPE etc.
Jag gillade tekniken att justera pg_dump-utdata med OS-kommandon (sed/egrep), eftersom det var känt att pg_dumpen av naturen skriver ALTER .. OWNER TO för varje objekt (TABELLER / SEKVENSER / VISNINGAR / FUNKTIONER / AGGREGATES / TYPES ) i dess utdata. Att gripa dessa uttalanden från pg_dump stdout genom att ersätta nya USER/SCHEMANAME med sed och sedan skicka tillbaka dessa uttalanden till psql-klienten kommer att fixa sakerna även om objektet ägs av Postgres-användare. Jag använde samma tillvägagångssätt i skriptet och tillät användaren att skicka NYTT ANVÄNDARNAMN och SCHEMANAMN, så att ersätta det i ALTER…OWNER TO..-satsen.
Skriptanvändning och utdata:
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
Du kan ladda ner skriptet härifrån, och det finns även README som hjälper dig med användningen.