No se puede crear una nueva tabla después de " DROP SCHEMA public"


Ya que quería dejar caer algunas tablas y alguien sugirió lo siguiente y lo hice:

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

Entonces tengo un problema al crear una nueva base de datos, como:

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*

Puedes ver que tengo un error

ERROR: no se ha seleccionado ningún esquema para crear en *

¿Cómo puedo restaurar el esquema público?
Sugiero que la gente nunca haga " drop schema public cascade;" si no sabemos cómo restaurar. ¿Alguien puede ayudarme?

Author: Erwin Brandstetter, 2013-01-12

2 answers

El mensaje de error aparece cuando ninguno de los esquemas en su search_path se puede encontrar.
O bien está mal configurado. ¿Qué consigues por esto?

SHOW search_path;

O ha eliminado el esquema public de su base de datos del sistema estándartemplate1. Es posible que se haya conectado a la base de datos incorrecta cuando ejecutó drop schema public cascade;

Como su nombre indica, esta es la plantilla para crear nuevas bases de datos. Por lo tanto, cada nueva base de datos comienza sin el (default) schema public ahora - mientras que su default search_path probablemente tiene 'public' en él.

Simplemente ejecute (como superusuario public o vea la respuesta de mgojohn):

CREATE SCHEMA public;

En la base de datos template1 (o cualquier otra base de datos donde la necesite).

El consejo con DROP SCHEMA ... CASCADE para destruir todos los objetos en él rápidamente es por lo demás válido.

 26
Author: Erwin Brandstetter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:09:17

Ese consejo puede causar algunos problemas si tiene un usuario de la aplicación (como 'postgres') y ejecuta los comandos DROP/CREATE como un usuario diferente. Esto sucedería si, por ejemplo, estás conectado como 'johndoe@localhost' y simplemente golpeas psql mydatabase. Si lo hace, el propietario del nuevo esquema será johndoe, no 'postgres' y cuando su aplicación aparezca para crear las tablas que necesita, no verá el nuevo esquema.

Para devolver la propiedad al usuario de su aplicación (suponiendo que usuario es 'postgres'), simplemente puede ejecutar (formar el mismo mensaje de psql que su usuario local):

ALTER SCHEMA public OWNER to postgres;

Y estarás listo.

 23
Author: mgojohn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-08 15:46:00