Ich arbeite an einer Amazon RDS-Postgresql-Datenbank, bei der ich weiß, dass ein Problem mit dem öffentlichen Schema aufgetreten ist (möglicherweise wurde es gelöscht). Aber anscheinend existiert das Schema und trotzdem ist das Problem nicht gelöst. Hier ist eine Beispielsitzung mit einer neu erstellten leeren Datenbank:
mydb=> CREATE TABLE distributors (
mydb(> did integer,
mydb(> name varchar(40) UNIQUE
mydb(> );
ERROR: no schema has been selected to create in
mydb=> show search_path;
search_path
----------------
"$user",public
(1 row)
mydb=> create schema public;
ERROR: schema "public" already exists
Irgendein Hinweis? Wonach soll ich suchen?
Gelöst Dank der Antwort von Daniel Vérité habe ich folgendes gelöst:
grant usage on schema public to public;
grant create on schema public to public;
Sind dies die Standardberechtigungen für das öffentliche Schema?
Ich habe einen einzelnen Benutzer, der auf die Datenbank zugreifen kann. Daher kann dies meines Erachtens kein Sicherheitsrisiko darstellen.
Ich denke, ich sollte die gleiche Änderung an template1 vornehmen . Ist es richtig? Wie kann ich überprüfen, ob die Berechtigungen in template1 korrekt sind (z. B. Standardwerte)?
quelle
Antworten:
Dies ist der Fall, wenn Sie
USAGE
für keines der Schemas von Berechtigungen habensearch_path
. Standardmäßig hat die Pseudorollepublic
(alle Benutzer) dieses Privileg für daspublic
Schema, daher tritt dieser Fehler nur auf, nachdem er explizit mit folgendem Befehl widerrufen wurde:Dies ist erforderlich, wenn es nicht erwünscht ist, dass Personen in andere Personenschemata schauen, auch ohne Daten aus Tabellen auszuwählen (was durch unterschiedliche Berechtigungen gewährt wird).
Wenn
REVOKE
dies in dieser Datenbank nicht geschehen ist, ist es möglicherweise in der Vorlagendatenbank geschehen, anhand derer neue Datenbanken modelliert werden (sieheCREATE DATABASE
).Wenn ein Benutzer über
USAGE
Berechtigungen verfügt , jedoch keineCREATE
Berechtigungen für das Schema besitzt, liegt ein anderer Fehler vor, wenn versucht wird, ein Objekt zu erstellen: Berechtigung für öffentliches Schema verweigert .Verwenden Sie, um die Berechtigungen in psql zu überprüfen
\dn+ public
.Standardmäßig (
\x
zur besseren Lesbarkeit mit erweiterter Anzeige angezeigt ):Fehlen eines Rollennamens
=
bedeutet, dass er für alle Rollen gilt (= öffentlich)Ohne öffentliches USAGE-Privileg
Ohne öffentliche USAGE- oder CREATE-Berechtigungen
quelle
Ich hatte eine pgdump-Datei mit Funktionen im benutzerdefinierten Schema und wollte den Namen des benutzerdefinierten Schemas in die allgemeine Öffentlichkeit ändern und ersetzte alle Vorkommen durch ein altes Schema in leer (z. B. meinschema.tabellenname in tabellenname). Und fing an, einen Fehler zu erhalten
In meinem Fall tritt ein Fehler auf, wenn die aktuelle Zeile am Anfang des Dumps steht
Ich habe das zweite Argument in "öffentlich" geändert.
Und das Problem ist weg
quelle