web-dev-qa-db-fra.com

Impossible de créer une nouvelle table après "DROP SCHEMA public"

Puisque je voulais laisser tomber quelques tableaux et que quelqu'un a suggéré ce qui suit et je l'ai fait:

postgres=# drop schema public cascade;
DROP SCHEMA
postgres=# create schema public;
CREATE SCHEMA

Ensuite, j'ai eu un problème lors de la création d'une nouvelle base de données, telle que:

postgres=# create database test;
CREATE DATABASE
postgres=# \c test
You are now connected to database "test" as user "postgres".
test=# create table hi(id int primary key);
*ERROR:  no schema has been selected to create in*

Vous pouvez voir que j'ai une erreur

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

Comment puis-je restaurer le schéma public?
Je suggère aux gens de ne jamais "laisser tomber la cascade publique du schéma;" si nous ne savons pas comment restaurer. Quelqu'un peut-il m'aider?

35
user1342336

Le message d'erreur apparaît quand aucun des schémas de votre search_path peut être trouvé.
Soit il est mal configuré. Qu'obtenez-vous pour cela?

SHOW search_path;

Ou vous avez supprimé le schéma public de votre base de données système standard template1 . Vous avez peut-être été connecté à la mauvaise base de données lorsque vous avez exécuté drop schema public cascade;

Comme son nom l'indique, il s'agit du modèle de création de nouvelles bases de données. Par conséquent, chaque nouvelle base de données démarre sans le schéma (par défaut) public maintenant - tandis que votre valeur par défaut search_path contient probablement "public".

Exécutez simplement (en tant que superutilisateur public ou voyez réponse de mgojohn ):

CREATE SCHEMA public;

dans la base de données template1 (ou toute autre base de données où vous en avez besoin).

Les conseils avec DROP SCHEMA ... CASCADE pour y détruire rapidement tous les objets est par ailleurs valide.

28
Erwin Brandstetter

Ce conseil peut causer des problèmes si vous avez un utilisateur d'application (comme "postgres") et exécutez les commandes DROP/CREATE en tant qu'utilisateur différent. Cela se produirait si, par exemple, vous êtes connecté en tant que "johndoe @ localhost" et appuyez simplement sur psql mydatabase. Si vous faites cela, le propriétaire du nouveau schéma sera johndoe, pas "postgres" et lorsque votre application viendra pour créer les tables dont elle a besoin, elle ne verra pas le nouveau schéma.

Pour redonner la propriété à l'utilisateur de votre application (en supposant que l'utilisateur est "postgres"), vous pouvez simplement exécuter (former la même invite psql que votre utilisateur local):

ALTER SCHEMA public OWNER to postgres;

et vous serez prêt.

23
mgojohn