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