PostgreSQL Ändern Sie den Eigentümer aller Tabellen unter einem bestimmten Schema

19

Ich versuche, den Inhaber aller Tabellen unter dem gleichen Schema in einer Befehlszeile zu ändern. dh: alter table schema_name.* owner to newowner. Gibt es eine Möglichkeit, dies zu erreichen?

Verdrehtes Schicksal
quelle

Antworten:

11

Neu zugewiesenes Eigentum

Es gibt einen speziellen Berechtigungsbefehl, der genau dies ausführt RESASSIGN OWNED. Dadurch werden alle Objekte neu zugewiesen, nicht nur diejenigen in einem bestimmten Schema.

Schemaspezifisch

Sie können die ALTER TABLEBefehle wie folgt generieren :

SELECT format(
  'ALTER TABLE %I.%I.%I OWNER TO %I;',
  table_catalog,
  table_schema,
  table_name,
  current_user  -- or another just put it in quotes
)
FROM information_schema.tables
WHERE table_schema = 'mySchema';

In psql können Sie sie ausführen, indem Sie ihr sofort mit folgen \gexec

Evan Carroll
quelle
8

Ich kenne keine Möglichkeit, dies rein durch psql zu erreichen, aber mit bash können Sie die Tabellen in der Datenbank $ DB auflisten mit:

psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}

Und das Eigentum kann auf $ OWNER übertragen werden mit:

psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB}

Wenn Sie dies zusammenfassen, erhalten Sie:

 $ for table in `psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}` ; do  psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB} ; done

$ DB, $ SCHEMA und $ OWNER repräsentieren die Datenbank, das Schema (normalerweise 'public') und den Namen des neuen Besitzers.

jrial
quelle
7

Wenn Sie die Tabellennamen in Ihrem Schema abfragen können, können Sie die Abfragen zum ALTER-Tabelleneigentum generieren.

Beispielsweise:

 select 'ALTER TABLE ' || t.tablename || ' OWNER TO new_owner;' 
 from  pg_tables t
 where t.tableowner != 'rdsadmin';

Gibt die Abfrage zurück, um den Besitz aller Tabellen zu ändern:

ALTER TABLE schema_version OWNER TO ali;
ALTER TABLE users OWNER TO ali; 
ALTER TABLE company OWNER TO ali;
ALTER TABLE books OWNER TO ali;
...

dann kannst du diese einfach laufen lassen :)

Ali Saeed
quelle
1

Dieses Skript erledigt den Trick.

sh change_owner.sh -n new_owner -S schema_name

sh change_owner.sh -n user1 -S public

Summary:
    Tables/Sequences/Views : 16
    Functions              : 43
    Aggregates             : 1
    Type                   : 2

Hier finden Sie https://github.com/trrao/PostgreSQL_Scripts

Yatabani
quelle
0

Ähnlich wie oben mit bash, aber ich musste in eine Textdatei ausgeben und dann in psql eingeben:

$ psql -qAt -d mydatabase -c "SELECT 'ALTER TABLE '||schemaname||'.'||tablename||' \
                                      OWNER TO new_owner;' \
                                      FROM pg_tables \
                                      WHERE schemaname = 'myschema'" > data.txt


$ psql < data.txt -d mydatabase

Basierend darauf, aber Datenbank hinzugefügt: http://penningpence.blogspot.ca/2014/09/changing-owner-of-multiple-database.html

Riley
quelle
0

Dies ist eine Funktion, die ich zum Ändern von Tabellen-, Ansichts- und Funktionseigentum in einem Schema verwende. Es ist schnell, sauber und ein gutes Beispiel für die Verwendung von Cursorn. Auch keine Befehlszeile erforderlich.

Folgendes ändert die Berechtigungen über eine plpgsql-Funktion:

CREATE OR REPLACE FUNCTION YOURSCHEMA.do_changeowner(
    newowner text,
    pschem text)
  RETURNS void AS
$BODY$
declare
  tblnames CURSOR FOR
    SELECT tablename FROM pg_tables
    WHERE schemaname = pschem;
  viewnames CURSOR FOR
    SELECT viewname FROM pg_views
    WHERE schemaname = pschem;
  funcnames CURSOR FOR
    SELECT p.proname AS name, pg_catalog.pg_get_function_identity_arguments(p.oid) as params
    FROM pg_proc p 
    JOIN pg_namespace n ON n.oid = p.pronamespace 
    WHERE n.nspname = pschem;

begin

  FOR stmt IN tblnames LOOP
    EXECUTE 'alter TABLE ' || pschem || '.' || stmt.tablename || ' owner to ' || newowner || ';';
  END LOOP;
  FOR stmt IN viewnames LOOP
    EXECUTE 'alter VIEW ' || pschem || '.' || stmt.viewname || ' owner to ' || newowner || ';';
  END LOOP;
  FOR stmt IN funcnames LOOP
    EXECUTE 'alter FUNCTION ' || pschem || '.' || stmt.name || '(' ||  stmt.params || ') owner to ' || newowner || ';';
  END LOOP;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
Martin Jstone
quelle