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)?
la source
Réponses:
Cela se produit lorsque vous n’avez pas de
USAGE
privilège sur l’un des schémas desearch_path
. Par défaut, le pseudo-rôlepublic
(tous les utilisateurs) a ce privilège sur lepublic
schéma. Cette erreur ne survient donc qu'après l'avoir explicitement révoquée avec: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
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 de modèles avec laquelle les nouvelles bases de données sont modélisées (voirCREATE DATABASE
).Lorsqu'un utilisateur a des
USAGE
privilèges, mais qu'il en manque,CREATE
sur 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
\x
pour la lisibilité):l'absence d'un nom de rôle avant
=
signifie que c'est pour tous les rôles (= public)Sans privilège public USAGE
Sans privilèges publics USAGE ou CREATE
la source
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).
Pour mon cas, une erreur se produit au début du vidage de la ligne actuelle
J'ai changé le deuxième argument en "public"
Et le problème est parti
la source