Wie kann ich den Eigentümer aller Tabellen in einer PostgreSQL-Datenbank ändern?
Ich habe versucht ALTER TABLE * OWNER TO new_owner
aber es unterstützt nicht die Sternchensyntax.
Wie kann ich den Eigentümer aller Tabellen in einer PostgreSQL-Datenbank ändern?
Ich habe versucht ALTER TABLE * OWNER TO new_owner
aber es unterstützt nicht die Sternchensyntax.
Es gibt keinen solchen Befehl in PostgreSQL. Aber Sie können es mit der Methode I umgehen beschrieben vor einiger Zeit für GRANTs.
Vielen Dank, sehr schöner Artikel. Ich werde ihn als zukünftige Referenz aufbewahren. Mit Hilfe von pgAdmin habe ich die DB gesichert, die DB gelöscht, new_owner vorübergehend die erforderlichen Rechte erteilt und dann die DB als new_owner neu erstellt und wiederhergestellt, wobei die Option "no owner" im Wiederherstellungsfenster aktiviert war. Dies führte zu den gewünschten Ergebnissen mit new_owner als Eigentümer von allem.
Mit Postgres 9.3 wurde der Befehl REASSIGN OWNED eingeführt. postgresql.org/docs/9.3/sql-reassign-owned.html
Auf der Grundlage der Antwort von elysch Hier ist eine Lösung für mehrere Schemata:
DO $$
DECLARE
r record;
i int;
v_schema text[] := '{public,schema1,schema2,schema3}';
v_new_owner varchar := 'my_new_owner';
BEGIN
FOR r IN
select 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.tables where table_schema = ANY (v_schema)
union all
select 'ALTER TABLE "' || sequence_schema || '"."' || sequence_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.sequences where sequence_schema = ANY (v_schema)
union all
select 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.views where table_schema = ANY (v_schema)
union all
select 'ALTER FUNCTION "'||nsp.nspname||'"."'||p.proname||'"('||pg_get_function_identity_arguments(p.oid)||') OWNER TO ' || v_new_owner || ';' as a from pg_proc p join pg_namespace nsp ON p.pronamespace = nsp.oid where nsp.nspname = ANY (v_schema)
union all
select 'ALTER DATABASE "' || current_database() || '" OWNER TO ' || v_new_owner
LOOP
EXECUTE r.a;
END LOOP;
FOR i IN array_lower(v_schema,1) .. array_upper(v_schema,1)
LOOP
EXECUTE 'ALTER SCHEMA "' || v_schema[i] || '" OWNER TO ' || v_new_owner ;
END LOOP;
END
$$;
pg_dump as insert statements
pg_dump -d -O database filename
-d ( data as inserts ) -O ( capital O is no owner )
Dann leiten Sie die Sicherungsdatei zurück in PostgreSQL mit:
psql -d database -U username -h hostname < filename
Da kein Eigentümer angegeben ist, werden alle erstellten Tabellen, Schemata usw. unter dem von Ihnen angegebenen Login-Benutzer erstellt.
Ich habe gelesen, dass dies auch ein guter Ansatz für die Migration zwischen PostgreSQL-Versionen sein könnte.
Ich denke, dass dies der einfachste Weg ist, den Besitz von allem in einer Datenbank zu ändern, wenn sie klein genug ist und Dumping/Wiederherstellung eine Option ist. pg_dump
Befehlssyntax ist veraltet und -d
ist jetzt --column-inserts
aber es wird nicht für reine pgsql-operationen empfohlen. ich benutze nur --clean
y --no-owner
.
Dafür habe ich ein praktisches Skript erstellt; pg_change_db_owner.sh . Dieses Skript ändert die Eigentümerschaft für alle Tabellen, Ansichten, Sequenzen und Funktionen in einem Datenbankschema und auch den Eigentümer des Schemas selbst.
Bitte beachten Sie, dass, wenn Sie nur die Eigentümerschaft aller Objekte in einer bestimmten Datenbank ändern möchten, die einer bestimmten Datenbankrolle gehören, dann können Sie einfach den Befehl REASSIGN OWNED
ではなく
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.