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