Ich habe mit pg_dump eine Sicherung meiner Datenbank erstellt.
Diese Sicherung habe ich auf einem anderen Rechner mit pg_restore wiederhergestellt.
2.1 Ich musste pg_restore mit --no-owner durchführen. Da diese datenbank einen anderen Benutzer hat sonst hat pg_restore nicht geklappt.
2.2 Das Problem ist nun das alle Tabellen als Eigentümer postgres haben. Der eigentliche Benutzer hat keinen Zugriff auf die Tabellen.
ein
ALTER TABLE name OWNER
für jede Tabelle würde zu lange dauern. Es sind viele Tabellen vorhanden.
Meine Frage nun:
Wie kann ich den Eigentümer aller Tabellen auf einmal setzen?
Mal eine andere Frage:
Kann ich schon bei pg_restore schon sagen das die angelegten Tabellen den von mir definierten Benutzer gehören sollen und nicht dem der in der Archivdatei definiert ist?
für alle die sich mit ähnlichem Problem zu tun haben oder haben sollten. Ich habe ein Skript geschrieben das von allen Tabellen den Eigentümer setzt.
#!/bin/ash
mydb=thedbname
myuser=thedbuser
SQL="SELECT relname FROM pg_class WHERE (relkind = 'r' OR relkind = 'S')
AND relname !~ '^pg_' ORDER BY relname"
OBJ=`su - postgres -c "psql -t -c \"$SQL \" $mydb
OBJ=`echo ${OBJ} | sed 's/ /, /g'`
###############################################################
#### Hier werden alle Elemente von $str durchlaufen als
#### Trennzeichen wird "," benutzt
###############################################################
str=$OBJ
while [ "$str" != "$sub" ]; do
sub=${str/\,*/}
str=${str/$sub,/}
SQL="ALTER TABLE $sub OWNER TO $myuser"
su - postgres -c "psql -c \"$SQL \" $mydb"
done
Mir persönlich gefällt gut REASSIGN
REASSIGN OWNED BY old_role [, …] TO new_role;
Hier werden nicht nur die Owner der Tabellen geändert, sonder auch die der Sequenzen und anderen Objekten!