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.
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
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.
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:
BEGIN
eine Transaktion zur Änderung der PrivilegienDATABASES
zu einer "DBA-Rolle"SCHEMAS
zur "DBA-Rolle"REVOKE ALL
Berechtigungen für alle TABLES
, SEQUENCES
y FUNCTIONS
aus allen RollenGRANT SELECT, INSERT, UPDATE, DELETE
über relevante/geeignete Tabellen an die entsprechenden RollenCOMMIT
die DCL-Transaktion.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
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 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.