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

38

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 devrais-je rechercher?

Résolu Grâce à la réponse de Daniel Vérité, j'ai résolu le problème suivant:

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?

Je n'ai qu'un seul utilisateur qui peut accéder à la base de données, je pense donc que cela ne peut en aucun cas générer des risques pour la 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)?

Emanuele Paolini
la source
3
Peut-être que votre utilisateur ne dispose pas des privilèges nécessaires pour créer des tables dans le schéma public.
a_horse_with_no_name
Après édition: oui, connectez-vous à template1 et vérifiez les autorisations du schéma (voir la réponse modifiée).
Daniel Vérité le

Réponses:

34

Cela se produit lorsque vous n’avez pas de USAGEprivilège sur l’un des schémas de search_path. Par défaut, le pseudo-rôle public(tous les utilisateurs) a ce privilège sur le publicschéma. Cette erreur ne survient donc qu'après l'avoir explicitement révoquée avec:

revoke usage on schema public from public;

Cela est nécessaire lorsqu'il n'est pas souhaitable que les personnes consultent les schémas d'autres personnes, même sans sélectionner les données des tables (octroyées via des privilèges différents).

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


Lorsqu'un utilisateur a des USAGEprivilèges, mais qu'il en manque, CREATEsur le schéma, l'erreur est différente lorsque vous essayez de créer un objet: permission 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 \xpour la lisibilité):

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

l'absence d'un nom de rôle avant =signifie que c'est pour tous les rôles (= public)

Sans privilège public USAGE

Nom | Publique
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 | Publique
Propriétaire | postgres
Privilèges d'accès | postgres = UC / postgres
Description | schéma public standard
Daniel Vérité
la source
Merci, c'est résolu! (Je vais écrire une note dans la question).
Emanuele Paolini
3

J'avais un fichier pgdump avec la création de fonctions dans un schéma personnalisé et je voulais passer d'un nom de schéma personnalisé à un grand public et remplacer toutes les occurrences d'un ancien schéma par un objet vide (par exemple, myschema.nom_tablable vers nom_table).

ERROR:  no schema has been selected to create in

Pour mon cas, une erreur se produit au début du vidage de la ligne actuelle

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 est parti

Panoptik
la source