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)?
fuente
Respuestas:
Esto sucede cuando no se tiene
USAGE
privilegio en ninguno de los esquemas desearch_path
. Por defecto, el pseudo-rolpublic
(todos los usuarios) tiene este privilegio en elpublic
esquema, por lo que este error ocurre solo después de revocarlo explícitamente con: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
REVOKE
no 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 (verCREATE DATABASE
).Cuando un usuario tiene
USAGE
privilegios, pero carece deCREATE
privilegios 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
\x
para facilitar la lectura):la falta de un nombre de rol antes
=
significa que es para todos los roles (= público)Sin privilegio de uso público
Sin privilegios públicos de USO o CREACIÓN
fuente
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
Para mi caso, el error ocurre cuando al comienzo de la línea de volcado actual
He cambiado el segundo argumento a "público"
Y el problema se fue
fuente