PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie ändert man den Besitz aller Objekte in einem bestimmten Schema in PostgreSQL?

Einige Vorschläge hier (Danke), haben mich dazu inspiriert, ein Bash-Skript zum Ändern aller Objekte (TABELLEN / SEQUENCES / VIEWS / FUNCTIONS / AGGREGATES / TYPES) zu erstellen Eigentum an einem bestimmten Schema auf einmal. Kein spezieller Code in einem Skript enthalten, ich habe im Grunde die vorgeschlagene Technik ausgewählt und die Implementierungsmethode per Skript vereinfacht. Tatsächlich erledigt der Befehl REASSIGN OWNED BY die meiste Arbeit reibungslos, ändert jedoch den datenbankweiten Objektbesitz unabhängig von einem Schema. Zwei Eventualitäten, in denen Sie REASSIGN OWNED BY nicht verwenden dürfen:

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.