Postgres13 dump_all wird in postgres16 wiederhergestellt, kann aber keine Tabelle erstellen

Hallo,

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.

wie ich dieses Problem lösen kann

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 ;

2 „Gefällt mir“

Hallo,

Ich habe auch mehrere Benutzer.

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?

Danke für die Wiederholung

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.

Hallo,

Ich habe es versucht, aber das funktioniert nicht

Ich habe das in Centos bemerkt, als ich postgres13 dump_all und in postgres16 wiederherstelle
In Centos funktioniert es.

Aber unter Ubuntu funktioniert es nicht. Ich habe die von Ihnen bereitgestellte Abfrage ausgeführt.

aber immer noch nicht in der Lage, Tabellen in der Datenbank zu erstellen, es kommt zu einem öffentlichen Schemafehler