ERRORE: nessuno schema è stato selezionato per la creazione


38

Sto lavorando su un database postgresql di Amazon RDS in cui so che ci sono stati dei problemi con lo schema pubblico (forse è stato eliminato). Ma a quanto pare lo schema esiste e comunque il problema non viene risolto. Ecco una sessione di esempio con un database vuoto appena creato:

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

Qualche suggerimento? Cosa dovrei cercare?

Risolto. Grazie alla risposta di Daniel Vérité ho risolto quanto segue:

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

Sono queste le autorizzazioni predefinite sullo schema pubblico?

Ho un singolo utente che può accedere al database, quindi penso che questo non possa aumentare i rischi per la sicurezza ...

Penso che dovrei apportare la stessa modifica su template1 . È corretto? Come posso verificare se le autorizzazioni in template1 sono corrette (diciamo, valori predefiniti)?


3
Forse il tuo utente non ha i privilegi necessari per creare tabelle nello schema pubblico.
a_horse_with_no_name il

Dopo la modifica: sì, connettiti a template1 e controlla le autorizzazioni dello schema (vedi risposta modificata).
Daniel Vérité,

Risposte:


34

Questo succede quando non si ha il USAGEprivilegio su nessuno degli schemi di search_path. Per impostazione predefinita, lo pseudo-ruolo public(tutti gli utenti) ha questo privilegio sullo publicschema, quindi questo errore si verifica solo dopo averlo revocato esplicitamente con:

revoke usage on schema public from public;

Ciò è necessario quando non è desiderabile che le persone sbirciano negli schemi di altre persone, anche senza selezionare i dati dalle tabelle (che sono concessi attraverso privilegi diversi).

Se ciò REVOKEnon è stato fatto in quel database, potrebbe essersi verificato nel database dei modelli in base al quale vengono modellati nuovi database (vedere CREATE DATABASE).


Quando un utente dispone di USAGEprivilegi, ma non ha CREATEprivilegi sullo schema, si tratta di un errore diverso quando si tenta di creare un oggetto: autorizzazione negata per lo schema pubblico .

Per verificare i privilegi all'interno di psql, utilizzare \dn+ public.

Per impostazione predefinita (mostrato con display esteso \xper la leggibilità):

# \ dn + pubblico
Elenco di schemi
- [RECORD 1] ----- + -----------------------
Nome | pubblico
Proprietario | Postgres
Privilegi di accesso | postgres = UC / postgres
                  | = UC / postgres
Descrizione | schema pubblico standard

la mancanza di un nome prima =significa che è per tutti i ruoli (= pubblico)

Senza privilegio pubblico USAGE

Nome | pubblico
Proprietario | Postgres
Privilegi di accesso | postgres = UC / postgres
                  | = C / postgres
Descrizione | schema pubblico standard

Senza i privilegi di UTILIZZO o CREAZIONE pubblici

Nome | pubblico
Proprietario | Postgres
Privilegi di accesso | postgres = UC / postgres
Descrizione | schema pubblico standard

Grazie risolto! (Scriverò una nota nella domanda).
Emanuele Paolini,

3

Avevo il file pgdump con la creazione di funzioni nello schema personalizzato e volevo passare il nome dello schema personalizzato al pubblico generale e ho sostituito tutte le occorrenze con il vecchio schema a vuoto (ad esempio myschema.tablename in tablename) E ho iniziato a ricevere errori

ERROR:  no schema has been selected to create in

Per il mio caso si verifica un errore all'inizio della discarica presente riga

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

Ho cambiato il secondo argomento in "pubblico"

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

E il problema è andato

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.