FEHLER: Es wurde kein Schema zum Erstellen ausgewählt

38

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)?

Emanuele Paolini
quelle
3
Möglicherweise verfügt Ihr Benutzer nicht über die erforderlichen Berechtigungen zum Erstellen von Tabellen im öffentlichen Schema.
a_horse_with_no_name
Nach der Bearbeitung: Ja, stellen Sie eine Verbindung zu template1 her und überprüfen Sie die Schemaberechtigungen (siehe bearbeitete Antwort).
Daniel Vérité

Antworten:

34

Dies ist der Fall, wenn Sie USAGEfür keines der Schemas von Berechtigungen haben search_path. Standardmäßig hat die Pseudorolle public(alle Benutzer) dieses Privileg für das publicSchema, daher tritt dieser Fehler nur auf, nachdem er explizit mit folgendem Befehl widerrufen wurde:

revoke usage on schema public from public;

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 REVOKEdies in dieser Datenbank nicht geschehen ist, ist es möglicherweise in der Vorlagendatenbank geschehen, anhand derer neue Datenbanken modelliert werden (siehe CREATE DATABASE).


Wenn ein Benutzer über USAGEBerechtigungen verfügt , jedoch keine CREATEBerechtigungen 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 ( \xzur besseren Lesbarkeit mit erweiterter Anzeige angezeigt ):

# \ dn + public
Liste der Schemata
- [RECORD 1] ----- + -----------------------
Name | Öffentlichkeit
Besitzer | postgres
Zugriffsrechte | postgres = UC / postgres
                  | = UC / Postgres
Beschreibung | öffentliches Standardschema

Fehlen eines Rollennamens =bedeutet, dass er für alle Rollen gilt (= öffentlich)

Ohne öffentliches USAGE-Privileg

Name | Öffentlichkeit
Besitzer | postgres
Zugriffsrechte | postgres = UC / postgres
                  | = C / postgres
Beschreibung | öffentliches Standardschema

Ohne öffentliche USAGE- oder CREATE-Berechtigungen

Name | Öffentlichkeit
Besitzer | postgres
Zugriffsrechte | postgres = UC / postgres
Beschreibung | öffentliches Standardschema
Daniel Vérité
quelle
Danke, das gelöst! (Ich werde eine Notiz in der Frage schreiben).
Emanuele Paolini
3

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

ERROR:  no schema has been selected to create in

In meinem Fall tritt ein Fehler auf, wenn die aktuelle Zeile am Anfang des Dumps steht

SELECT pg_catalog.set_config('search_path', '', false);

Ich habe das zweite Argument in "öffentlich" geändert.

SELECT pg_catalog.set_config('search_path', 'public', false);

Und das Problem ist weg

Panoptik
quelle