Ich habe dump_all von postgres13
in dem ich Datenbanken und Datenbankbenutzer habe
Ich habe dem Benutzer Berechtigungen für die Datenbank zugewiesen, indem ich den folgenden Befehl verwende
„GEWÄHREN SIE ALLE PRIVILEGIEN FÜR DIE DATENBANK ‚DBNAME‘ AN ‚DBUSER‘“.
Und in postgressql13 kann ich eine Tabelle in der Datenbank erstellen.
Aber jetzt habe ich postgresql13 dump_all in postgresql16 wiederhergestellt. Jetzt sind alle Datenbanken und Benutzer wiederhergestellt, aber ich kann keine Tabelle in jeder Datenbank erstellen.
bekomme einen Fehler
FEHLER: Berechtigung für das öffentliche Schema verweigert.
Ich habe mehrere Benutzer und kann den Dbusern nicht jede Datenbank manuell gewähren.
Seit Postgres 16 werden die Berechtigungen für das Schema public nicht mehr automatisch vergeben. Du musst für jede Datenbank den entsprechenden GRANT Befehl absetzen:
grant all on schema public to dbuser;
Wenn Du so viele Datenbanken hast, dass Du das nicht für jede einzeln machen willst, lass Dir ein Script generieren. Mit psql ist das recht einfach:
select format(E'\\c %s\ngrant all on schema public to dbuser;', datname)
from pg_database
where not datistemplate
\gexec
Achtung: das SELECT darf nicht mit ; beendet werden. Das \gexec ersetzt das ;
Wie zum Beispiel hat dbuser1 DB1-Berechtigungen in Postgres13
dbuser2 hat DB2-Berechtigungen in Postgres13
dbuser3 hat DB3-Berechtigungen in Postgres13
und so weiter
Wie kann ich in meinem Fall alle öffentlichen Schemata gewähren?
Wenn unterschiedliche Benutzer unterschiedliche Berechtigungen in den verschiedenen Datenbanken haben, brauchst Du eine Abfrage pro Benutzer. Die verschiedenen Abfragen kannst Du per UNION miteinander verbinden, so dass trotzdem nur ein Script entsteht.
select format(E'\\c %s\ngrant all on schema public to dbuser2;', datname)
from pg_database
where datname in ('db1', 'db2')
union all
select format(E'\\c %s\ngrant all on schema public to dbuser3;', datname)
from pg_database
where datname in ('db3', 'db4')
\gexec
Du kannst natürlich auch ein Skript pro Benutzer machen.