518 Stimmen

PostgreSQL: Ändern Sie OWNER in allen Tabellen gleichzeitig in PostgreSQL

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.

11voto

user3560574 Punkte 111

Sie können folgendes in PostgreSQL 9 versuchen

DO $$DECLARE r record;
BEGIN
    FOR r IN SELECT tablename FROM pg_tables WHERE schemaname = 'public'
    LOOP
        EXECUTE 'alter table '|| r.tablename ||' owner to newowner;';
    END LOOP;
END$$;

6voto

Es gibt keinen solchen Befehl in PostgreSQL. Aber Sie können es mit der Methode I umgehen beschrieben vor einiger Zeit für GRANTs.

0 Stimmen

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.

0 Stimmen

Mit Postgres 9.3 wurde der Befehl REASSIGN OWNED eingeführt. postgresql.org/docs/9.3/sql-reassign-owned.html

5voto

JC Boggio Punkte 355

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
$$;

3voto

atwsKris Punkte 21
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.

0 Stimmen

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 .

2voto

Jakub Jirutka Punkte 9431

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.com

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.

Powered by:

X