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.

2voto

Sharoon Thomas Punkte 1716

Die Antwort von @Alex Soto ist richtig, und die von @Yoav Aner hochgeladene Liste funktioniert ebenfalls, sofern die Tabellen-/Viewnamen keine Sonderzeichen enthalten (die in Postgres zulässig sind).

Sie müssen ihnen entkommen, damit sie funktionieren, und dafür habe ich einen Gist hochgeladen: https://gist.github.com/2911117

1voto

sramay Punkte 241

Das folgende einfachere Shell-Skript hat bei mir funktioniert.

#!/bin/bash
for i in  `psql -U $1  -qt -c  "select tablename from pg_tables where schemaname='$2'"`
do
psql -U $1 -c  "alter table $2.$i set schema $3"
done

Wo Eingabe $1 - Benutzername (Datenbank) $2 = bestehendes Schema $3 = zu neuem Schema.

1voto

Sean Punkte 9306

Beginnend mit PostgreSQL 9.0 haben Sie die Möglichkeit GRANT [priv name] ON ALL [object type] IN SCHEMA donde [priv name] ist die typische SELECT, INSERT, UPDATE, DELETE, etc y [object type] kann eines der folgenden sein:

  • TABLES
  • SEQUENCES
  • FUNCTIONS

Die PostgreSQL-Dokumente über GRANT y REVOKE mehr ins Detail zu gehen. In einigen Situationen ist es immer noch erforderlich, Tricks mit den Systemkatalogen anzuwenden ( pg_catalog.pg_* ), aber es ist nicht annähernd so häufig. Ich mache häufig das Folgende:

  1. BEGIN eine Transaktion zur Änderung der Privilegien
  2. Änderung der Eigentumsverhältnisse von DATABASES zu einer "DBA-Rolle"
  3. Änderung der Eigentumsverhältnisse von SCHEMAS zur "DBA-Rolle"
  4. REVOKE ALL Berechtigungen für alle TABLES , SEQUENCES y FUNCTIONS aus allen Rollen
  5. GRANT SELECT, INSERT, UPDATE, DELETE über relevante/geeignete Tabellen an die entsprechenden Rollen
  6. COMMIT die DCL-Transaktion.

1voto

Anton Smolkov Punkte 116

Gleicher Ansatz wie bei @AlexSoto für Funktionen:

IFS=$'\n'  
for fnc in `psql -qAt -c "SELECT  '\"' || p.proname||'\"' || '(' || pg_catalog.pg_get_function_identity_arguments(p.oid) || ')' FROM pg_catalog.pg_namespace n JOIN pg_catalog.pg_proc p ON p.pronamespace = n.oid WHERE n.nspname = 'public';" YOUR_DB` ; do  psql -c "alter function $fnc owner to NEW_OWNER" YOUR_DB; done

1voto

jsh Punkte 261

Die akzeptierte Lösung kümmert sich nicht um den Funktionsbesitz, die folgende Lösung kümmert sich um alles (bei der Überprüfung habe ich festgestellt, dass sie ähnlich ist wie die von @magiconair oben)

echo "Database: ${DB_NAME}"
echo "Schema: ${SCHEMA}"
echo "User: ${NEW_OWNER}"

pg_dump -s -c -U postgres ${DB_NAME} | egrep "${SCHEMA}\..*OWNER TO"| sed -e "s/OWNER TO.*;$/OWNER TO ${NEW_OWNER};/" | psql -U postgres -d ${DB_NAME}
# do following as last step to allow recovery
psql -U postgres -d postgres -c "ALTER DATABASE ${DB_NAME} OWNER TO ${NEW_OWNER};"

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