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

38

Estoy trabajando en una base de datos postgresql de Amazon RDS donde sé que hubo algún problema con el esquema público (tal vez se eliminó). Pero aparentemente el esquema existe, y de todos modos el problema no está resuelto. Aquí hay una sesión de muestra con una base de datos vacía recién creada:

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

Alguna pista? ¿Que debería buscar?

Resuelto Gracias a la respuesta de Daniel Vérité he resuelto con lo siguiente:

grant usage on schema public to public;
grant create on schema public to public;

¿Son estos los permisos predeterminados en el esquema público?

Tengo un solo usuario que puede acceder a la base de datos, así que creo que de todos modos esto no puede aumentar los riesgos de seguridad ...

Creo que debería hacer la misma modificación en template1 . ¿Es correcto? ¿Cómo puedo verificar si los permisos en template1 son correctos (por ejemplo, valores predeterminados)?

Emanuele Paolini
fuente
3
Tal vez su usuario no tenga los privilegios necesarios para crear tablas en el esquema público.
a_horse_with_no_name
Siguiente edición: sí, conéctese a template1 y verifique los permisos del esquema (vea la respuesta editada).
Daniel Vérité

Respuestas:

34

Esto sucede cuando no se tiene USAGEprivilegio en ninguno de los esquemas de search_path. Por defecto, el pseudo-rol public(todos los usuarios) tiene este privilegio en el publicesquema, por lo que este error ocurre solo después de revocarlo explícitamente con:

revoke usage on schema public from public;

Esto es necesario cuando no es deseable que las personas echen un vistazo a los esquemas de otras personas, incluso sin seleccionar datos de las tablas (que se otorgan a través de diferentes privilegios).

Si esto REVOKEno se ha hecho en esa base de datos, puede haber sucedido en la base de datos de plantilla mediante la cual se modelan nuevas bases de datos (ver CREATE DATABASE).


Cuando un usuario tiene USAGEprivilegios, pero carece de CREATEprivilegios en el esquema, es un error diferente al intentar crear un objeto: permiso denegado para el esquema público .

Para verificar los privilegios dentro de psql, use \dn+ public.

Por defecto (se muestra con pantalla extendida \xpara facilitar la lectura):

# \ dn + public
Lista de esquemas
- [REGISTRO 1] ----- + -----------------------
Nombre | público
Propietario | postgres
Privilegios de acceso | postgres = UC / postgres
                  El | = UC / postgres
Descripción | esquema público estándar

la falta de un nombre de rol antes =significa que es para todos los roles (= público)

Sin privilegio de uso público

Nombre | público
Propietario | postgres
Privilegios de acceso | postgres = UC / postgres
                  El | = C / postgres
Descripción | esquema público estándar

Sin privilegios públicos de USO o CREACIÓN

Nombre | público
Propietario | postgres
Privilegios de acceso | postgres = UC / postgres
Descripción | esquema público estándar
Daniel Vérité
fuente
Gracias, esto resuelto! (Escribiré una nota en la pregunta).
Emanuele Paolini
3

Tenía un archivo pgdump con la creación de funciones en un esquema personalizado y quería cambiar el nombre del esquema personalizado al público en general y reemplacé todas las ocurrencias con un esquema antiguo para vaciarlo (por ejemplo, myschema.tablename a tablename) y comencé a recibir un error

ERROR:  no schema has been selected to create in

Para mi caso, el error ocurre cuando al comienzo de la línea de volcado actual

SELECT pg_catalog.set_config('search_path', '', false);

He cambiado el segundo argumento a "público"

SELECT pg_catalog.set_config('search_path', 'public', false);

Y el problema se fue

Panoptik
fuente