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
有任何提示吗?我应该寻找什么?
已解决。
感谢DanielVérité的回答,我用以下方法解决了问题: />这些是公共架构的默认权限吗?
我只有一个用户可以访问数据库,所以我认为这绝对不会增加安全风险...
我认为我应该对template1进行相同的修改。这是对的吗?如何检查template1中的权限是否正确(例如,默认值)?
#1 楼
如果对USAGE
的任何架构都不具有search_path
特权,则会发生这种情况。默认情况下,伪角色public
(所有用户)在public
架构上具有此特权,因此仅在使用以下命令明确吊销此错误后,才会发生此错误:当不希望人们窥视别人的模式时,即使不从表中选择数据(这是通过不同的特权授予的),也是如此。在新数据库建模所用的模板数据库中发生了错误(请参阅REVOKE
)。创建对象:拒绝架构公共权限。要检查psql内的特权,请使用
CREATE DATABASE
。 /> revoke usage on schema public from public;
USAGE
之前缺少角色名称表示适用于所有角色(= public)不带公共USAGE特权
# \dn+ public List of schemas -[ RECORD 1 ]-----+----------------------- Name | public Owner | postgres Access privileges | postgres=UC/postgres | =UC/postgres Description | standard public schema
没有公共USAGE或CREATE特权
Name | public Owner | postgres Access privileges | postgres=UC/postgres | =C/postgres Description | standard public schema
评论
谢谢,这解决了! (我将在问题中写一个便条)。
– Emanuele Paolini
15年7月6日在15:08
#2 楼
我有一个pgdump文件,可以在自定义模式中创建函数,我想将自定义模式名称切换为普通模式,并用旧模式将所有情况替换为空(例如,将myschema.tablename更改为tablename)。 >ERROR: no schema has been selected to create in
对于我来说,在转储当前行的开头时发生错误
SELECT pg_catalog.set_config('search_path', '', false);
我将第二个arg更改为“公共”
SELECT pg_catalog.set_config('search_path', 'public', false);
问题不见了
#3 楼
我已经尝试了多种解决方案,并不断出现相同的错误。 br修复是:grant usage on schema public to public;
grant create on schema public to public;
评论
谢谢。这也为我工作。
– SGuru
20 Dec 7 '23:42
评论
也许您的用户没有必要的特权在公共架构中创建表。编辑后:是,连接到template1并检查架构权限(请参阅编辑后的答案)。