BŁĄD: nie wybrano żadnego schematu do utworzenia

38

Pracuję nad bazą danych amazon RDS postgresql, w której wiem, że wystąpił problem z publicznym schematem (być może został usunięty). Ale najwyraźniej schemat istnieje i problem nie został rozwiązany. Oto przykładowa sesja z nowo utworzoną pustą bazą danych:

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

Jakaś wskazówka? Czego powinienem szukać?

Rozwiązany. Dzięki odpowiedzi Daniela Vérité rozwiązałem następujące kwestie:

grant usage on schema public to public;
grant create on schema public to public;

Czy są to domyślne uprawnienia w schemacie publicznym?

Mam jednego użytkownika, który może uzyskać dostęp do bazy danych, więc myślę, że to i tak nie może zwiększyć ryzyka bezpieczeństwa ...

Myślę, że powinienem dokonać tej samej modyfikacji na template1 . Czy to jest poprawne? Jak mogę sprawdzić, czy uprawnienia w szablonie 1 są prawidłowe (powiedzmy, wartości domyślne)?

Emanuele Paolini
źródło
3
Być może użytkownik nie ma niezbędnych uprawnień do tworzenia tabel w schemacie publicznym.
a_horse_w_no_name
Po edycji: tak, połącz się z szablonem 1 i sprawdź uprawnienia do schematu (patrz edytowana odpowiedź).
Daniel Vérité,

Odpowiedzi:

34

Dzieje się tak, gdy nie ma USAGEuprawnień do żadnego ze schematów search_path. Domyślnie pseudo-rola public(wszyscy użytkownicy) ma to uprawnienie w publicschemacie, więc ten błąd występuje tylko po jawnym odwołaniu go za pomocą:

revoke usage on schema public from public;

Jest to wymagane, gdy nie jest pożądane, aby ludzie zaglądali do schematów innych osób, nawet bez wybierania danych z tabel (co jest przyznawane na podstawie różnych uprawnień).

Jeśli REVOKEnie zostało to zrobione w tej bazie danych, mogło się to zdarzyć w bazie danych szablonów, według której modelowane są nowe bazy danych (patrz CREATE DATABASE).


Gdy użytkownik ma USAGEuprawnienia, ale nie ma CREATEuprawnień do schematu, jest to inny błąd podczas próby utworzenia obiektu: odmowa dostępu do schematu publicznego .

Aby sprawdzić uprawnienia w psql, użyj \dn+ public.

Domyślnie (pokazany z rozszerzonym wyświetlaczem \xdla czytelności):

# \ dn + public
Lista schematów
- [NAGR. 1] ----- + -----------------------
Imię | publiczny
Właściciel | postgres
Uprawnienia dostępu | postgres = UC / postgres
                  | = UC / postgres
Opis | standardowy schemat publiczny

brak wcześniejszej nazwy roli =oznacza, że ​​dotyczy wszystkich ról (= public)

Bez publicznego uprawnienia do UŻYTKOWANIA

Imię | publiczny
Właściciel | postgres
Uprawnienia dostępu | postgres = UC / postgres
                  | = C / postgres
Opis | standardowy schemat publiczny

Bez publicznych uprawnień UŻYTKOWANIA lub TWORZENIA

Imię | publiczny
Właściciel | postgres
Uprawnienia dostępu | postgres = UC / postgres
Opis | standardowy schemat publiczny
Daniel Vérité
źródło
Dzięki, rozwiązane! (Napiszę notatkę w pytaniu).
Emanuele Paolini,
3

Miałem plik pgdump z funkcjami tworzenia w niestandardowym schemacie i chciałem zmienić niestandardową nazwę schematu na publiczną i zastąpić wszystkie wystąpienia starym schematem pustym (np. Myschema.tablename na tablename) i zacząłem otrzymywać błąd

ERROR:  no schema has been selected to create in

W moim przypadku błąd występuje, gdy na początku zrzutu obecnego wiersza

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

Zmieniłem drugi argument na „public”

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

I problem zniknął

Panoptik
źródło