Hinweis: Wie @trygvis in der folgenden Antwort erwähnt , ist der REASSIGN OWNED
Befehl seit mindestens Version 8.2 verfügbar und eine viel einfachere Methode.
Da Sie den Besitz für alle Tabellen ändern, möchten Sie wahrscheinlich auch Ansichten und Sequenzen. Folgendes habe ich getan:
Tabellen:
for tbl in `psql -qAt -c "select tablename from pg_tables where schemaname = 'public';" YOUR_DB` ; do psql -c "alter table \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done
Sequenzen:
for tbl in `psql -qAt -c "select sequence_name from information_schema.sequences where sequence_schema = 'public';" YOUR_DB` ; do psql -c "alter sequence \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done
Ansichten:
for tbl in `psql -qAt -c "select table_name from information_schema.views where table_schema = 'public';" YOUR_DB` ; do psql -c "alter view \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done
Sie könnten das wahrscheinlich etwas austrocknen , da die alter-Anweisungen für alle drei identisch sind.
REASSIGN OWNED BY old_role [, ...] TO new_role
Sie können den
REASSIGN OWNED
Befehl verwenden.Zusammenfassung:
Dadurch werden alle Objekte, deren Eigentümer sie sind,
old_role
in die neue Rolle geändert . Sie müssen nicht darüber nachdenken, welche Art von Objekten der Benutzer hat, sie werden alle geändert. Beachten Sie, dass dies nur für Objekte in einer einzelnen Datenbank gilt. Es ändert auch nicht den Eigentümer der Datenbank selbst.Es ist ab mindestens 8.2 verfügbar. Ihre Online-Dokumentation reicht nur so weit zurück.
quelle
ERROR: unexpected classid 3079
. Ich denke, das funktioniert derzeit nicht, wenn es Erweiterungen gibt.Dies: http://archives.postgresql.org/pgsql-bugs/2007-10/msg00234.php ist ebenfalls eine schöne und schnelle Lösung und funktioniert für mehrere Schemas in einer Datenbank:
Tabellen
Sequenzen
Ansichten
Materialisierte Ansichten
Basierend auf dieser Antwort
Dies erzeugt alle erforderlichen
ALTER TABLE
/ALTER SEQUENCE
/ALTER VIEW
Anweisungen, kopieren Sie diese und fügen sie sie wieder in plsql zu laufen.Überprüfen Sie Ihre Arbeit in psql, indem Sie Folgendes tun:
quelle
Wenn Sie dies in einer SQL-Anweisung tun möchten, müssen Sie eine exec () - Funktion definieren, wie unter http://wiki.postgresql.org/wiki/Dynamic_DDL beschrieben
Anschließend können Sie diese Abfrage ausführen. Dadurch wird der Eigentümer von Tabellen, Sequenzen und Ansichten geändert:
$ NEWUSER ist der postgresql neue Name des neuen Besitzers.
In den meisten Fällen müssen Sie Superuser sein, um dies auszuführen. Sie können dies vermeiden, indem Sie den Eigentümer von Ihrem eigenen Benutzer in eine Rollengruppe ändern, in der Sie Mitglied sind.
Vielen Dank an RhodiumToad auf #postgresql für die Hilfe.
quelle
Ich musste kürzlich den Besitz aller Objekte in einer Datenbank ändern. Obwohl Tabellen, Ansichten, Trigger und Sequenzen leicht geändert werden konnten, schlug der obige Ansatz für Funktionen fehl, da die Signatur Teil des Funktionsnamens ist. Zugegeben, ich habe einen MySQL-Hintergrund und bin mit Postgres nicht so vertraut.
Mit pg_dump können Sie jedoch nur das Schema sichern, das ALTER xxx OWNER TO yyy enthält. Aussagen, die Sie brauchen. Hier ist mein bisschen Muschelmagie zum Thema
quelle
grep
Befehl verwenden. Ich bin selbst neu in Linux, aber nach meinem Verständnis scheintsed
es in Ordnung zu sein , es zu verwenden, zumal Sie sowieso eine Übereinstimmung angeben, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird.sehr einfach, probieren Sie es aus ...
quelle
ist sehr einfach
erledigt.
quelle
Ich mag dieses, da es Tabellen , Ansichten , Sequenzen und Funktionen eines bestimmten Schemas auf einmal (in einer SQL-Anweisung) ändert, ohne eine Funktion zu erstellen, und Sie es direkt in PgAdmin III und psql verwenden können :
(Getestet in PostgreSql v9.2)
Basierend auf den Antworten von @rkj, @AlannaRose, @SharoonThomas, @ user3560574 und dieser Antwort von @a_horse_with_no_name
Vielen Dank.
Noch besser: Ändern Sie auch den Datenbank- und Schemabesitzer .
quelle
information_schema.sequences
leer ist, obwohlSELECT c.* FROM pg_class c WHERE c.relkind = 'S';
Sequenzen aufgelistet sind. Warum könnten sie nicht zusammenpassen?ALTER
Abfrage nicht auch eine seinALTER SEQUENCE
?Ich musste den Besitz von Tabellen, Ansichten und Sequenzen ändern und fand, dass die großartige Lösung von @rjk einwandfrei funktioniert - trotz eines Details: Wenn die Objektnamen in Groß- und Kleinschreibung geschrieben sind (z. B. "Tabellenname"), schlägt dies mit einem "fehl. kein Fehler gefunden.
Um dies zu umgehen, schließen Sie die Objektnamen wie folgt mit '"' ein:
Tabellen
Sequenzen
Ansichten
quelle
In PostgreSQL 9 können Sie Folgendes versuchen
quelle
In PostgreSQL gibt es keinen solchen Befehl. Aber man kann es umgehen Methode I beschrieben für GRANTs vor einiger Zeit.
quelle
Basierend auf der Antwort von elysch gibt es hier eine Lösung für mehrere Schemata:
quelle
Die Antwort von @Alex Soto ist die richtige und der von @Yoav Aner hochgeladene Kern funktioniert auch, vorausgesetzt, die Tabellen- / Ansichtsnamen enthalten keine Sonderzeichen (die in Postgres legal sind).
Sie müssen ihnen entkommen, um arbeiten zu können, und dafür habe ich eine Zusammenfassung hochgeladen: https://gist.github.com/2911117
quelle
Leiten Sie dann die Sicherungsdatei mit folgenden Elementen zurück an PostgreSQL:
Da kein Eigentümer enthalten ist, werden alle erstellten Tabellen, Schemata usw. unter dem von Ihnen angegebenen Anmeldebenutzer erstellt.
Ich habe gelesen, dass dies auch ein guter Ansatz für die Migration zwischen PostgreSQL-Versionen sein könnte.
quelle
Ich habe dafür ein praktisches Skript erstellt. pg_change_db_owner.sh . Dieses Skript ändert den Besitz für alle Tabellen, Ansichten, Sequenzen und Funktionen in einem Datenbankschema sowie den Besitzer des Schemas.
Beachten Sie, dass Sie
REASSIGN OWNED
stattdessen einfach den Befehl verwenden können, wenn Sie nur den Besitz aller Objekte in einer bestimmten Datenbank ändern möchten, die einer bestimmten Datenbankrolle gehört .quelle
Ab PostgreSQL 9.0 haben Sie die Möglichkeit zu ermitteln,
GRANT [priv name] ON ALL [object type] IN SCHEMA
wo dies[priv name]
typisch ist,SELECT, INSERT, UPDATE, DELETE, etc
und[object type]
können eine der folgenden sein:TABLES
SEQUENCES
FUNCTIONS
PostgreSQLs Dokumente auf
GRANT
undREVOKE
gehen Sie diesbezüglich näher darauf ein. In einigen Situationen müssen immer noch Tricks mit den Systemkatalogen (pg_catalog.pg_*
) verwendet werden, aber dies ist bei weitem nicht so häufig. Ich mache häufig folgendes:BEGIN
eine Transaktion zum Ändern der PrivilegienDATABASES
einer "DBA-Rolle"SCHEMAS
in die "DBA-Rolle"REVOKE ALL
privs auf alleTABLES
,SEQUENCES
undFUNCTIONS
aus allen RollenGRANT SELECT, INSERT, UPDATE, DELETE
auf relevanten / geeigneten Tabellen zu den entsprechenden RollenCOMMIT
die DCL-Transaktion.quelle
Die akzeptierte Lösung kümmert sich nicht um den Funktionsbesitz, nachdem die Lösung sich um alles gekümmert hat (bei der Überprüfung habe ich festgestellt, dass sie @magiconair oben ähnlich ist).
quelle
Das folgende einfachere Shell-Skript hat bei mir funktioniert.
Wobei $ 1 eingegeben wird - Benutzername (Datenbank) $ 2 = vorhandenes Schema $ 3 = in neues Schema.
quelle
Entspricht dem Funktionsansatz von @ AlexSoto:
quelle
Docker: Eigentümer aller Tabellen + Sequenzen ändern
quelle