我正在一个亚马逊RDS postgresql数据库上工作,在该数据库中我知道公共架构存在一些问题(也许已删除)。但是显然该模式存在,并且无论如何该问题都没有解决。这是一个带有新创建的空数据库的示例会话:

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中的权限是否正确(例如,默认值)?

评论

也许您的用户没有必要的特权在公共架构中创建表。

编辑后:是,连接到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