sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur ändrar man ägandet av alla objekt i ett visst schema i PostgreSQL?

Det finns några förslag här (tack), inspirerade mig att komponera ett bash-skript för att ändra alla objekts (TABELLER / SEKVENSER / VISNINGAR / FUNKTIONER / AGGREGATER / TYPER) ägande av ett visst schema på en gång. Ingen speciell kod ingår i ett skript, jag valde i princip den föreslagna tekniken och förenklade implementeringsmetoden via skript. I själva verket gör REASSIGN OWNED BY-kommandot det mesta av arbetet smidigt, men det ändrar databasomfattande objekts äganderätt oavsett vilket schema som helst. Två eventualiteter där du inte får använda REASSIGN OWNED BY:

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.


  1. PostgreSQL:Varning:Konsolens teckentabell (437) skiljer sig från Windows teckentabell (1252)

  2. Schema Switch-A-Roo:Del 2

  3. Oracle External Table Exempel

  4. Avancerad failover med Post/pre Script Hooks