sql >> Database >  >> RDS >> PostgreSQL

Hoe verander ik het eigendom van alle objecten in een bepaald schema in PostgreSQL?

Enkele suggesties hier (bedankt), inspireerden me om een ​​bash-script samen te stellen voor het wijzigen van alle objecten (TABELLEN / SEQUENCES / VIEWS / FUNCTIONS / AGGREGATES / TYPES) eigendom in een bepaald schema in één keer. Geen speciale code in een script, ik koos in feite de voorgestelde techniek en vereenvoudigde de implementatiemethode via script. In feite doet REASSIGN OWNED BY het meeste werk soepel, maar het verandert het eigendom van objecten in de database, ongeacht welk schema dan ook. Twee gevallen waarin u REASSIGN OWNED BY niet mag gebruiken:

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.


  1. MySQL hoe ontbrekende datums binnen bereik in te vullen?

  2. Eenvoudige CRUD-bewerking met PDO-databaseverbinding

  3. Opgeslagen Oracle-procedure aanroepen met uitvoerparameter van SQL Server

  4. Beste databaseveldtype voor een URL