web-dev-qa-db-fra.com

ERREUR: aucun schéma n'a été sélectionné pour créer dans

Je travaille sur une base de données postgresql Amazon RDS où je sais qu'il y a eu un problème avec le schéma public (il a peut-être été supprimé). Mais apparemment, le schéma existe, et de toute façon le problème n'est pas résolu. Voici un exemple de session avec une base de données vide nouvellement créée:

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

Un indice? Que dois-je rechercher?

Résolu. Grâce à la réponse de Daniel Vérité, j'ai résolu ce qui suit:

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

S'agit-il des autorisations par défaut sur le schéma public?

J'ai un seul utilisateur qui peut accéder à la base de données, donc je pense que de toute façon cela ne peut pas augmenter les risques de sécurité ...

Je pense que je devrais faire la même modification sur template1 . Est-ce correct? Comment puis-je vérifier si les autorisations dans template1 sont correctes (par exemple, les valeurs par défaut)?

39
Emanuele Paolini

Cela se produit lorsque vous ne disposez pas du privilège USAGE sur aucun des schémas de search_path. Par défaut, le pseudo-rôle public (tous les utilisateurs) a ce privilège sur le schéma public, donc cette erreur se produit uniquement après sa révocation explicite avec:

revoke usage on schema public from public;

Cela est nécessaire lorsqu'il n'est pas souhaitable que les gens regardent dans d'autres schémas de personnes, même sans sélectionner de données dans les tables (ce qui est accordé via différents privilèges).

Si ce REVOKE n'a pas été fait dans cette base de données, il se peut que cela se soit produit dans la base de données modèle par laquelle les nouvelles bases de données sont modélisées (voir CREATE DATABASE).


Lorsqu'un utilisateur dispose du privilège USAGE, mais qu'il n'a pas le privilège CREATE sur le schéma, il s'agit d'une erreur différente lors de la tentative de création d'un objet: autorisation refusée pour le schéma public .

Pour vérifier les privilèges dans psql, utilisez \dn+ public.

Par défaut (affiché avec affichage étendu \x pour plus de lisibilité):

 #\dn + public 
 Liste des schémas 
 - [ENREGISTREMENT 1] ----- + ----------------- ------ 
 Nom | public 
 Propriétaire | postgres 
 Privilèges d'accès | postgres = UC/postgres 
 | = UC/postgres
 Description | schéma public standard 

absence de nom de vol avant = signifie que c'est pour tous les rôles (= public)

Sans privilège USAGE public

 Nom | public 
 Propriétaire | postgres 
 Privilèges d'accès | postgres = UC/postgres 
 | = C/postgres
 Description | schéma public standard 

Sans privilèges publics USAGE ou CREATE

 Nom | public 
 Propriétaire | postgres 
 Privilèges d'accès | postgres = UC/postgres 
 Description | schéma public standard 
34
Daniel Vérité

J'avais un fichier pgdump avec la création de fonctions dans un schéma personnalisé et je voulais passer le nom du schéma personnalisé au grand public et remplacer toutes les occurrences par l'ancien schéma pour le vider (par exemple, myschema.tablename en tablename) et j'ai commencé à recevoir une erreur

ERROR:  no schema has been selected to create in

Pour mon cas, une erreur se produit quand au début de la ligne de vidage présente

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

J'ai changé le deuxième argument en "public"

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

Et le problème a disparu

6
Panoptik