错误:没有选择要在其中创建的架构

Ema*_*ini 50 schema postgresql amazon-rds

我正在处理一个 amazon 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
Run Code Online (Sandbox Code Playgroud)

任何提示?我应该寻找什么?

解决了。 感谢 Daniel Vérité 的回答,我已经解决了以下问题:

grant usage on schema public to public;
grant create on schema public to public;
Run Code Online (Sandbox Code Playgroud)

这些是公共架构的默认权限吗?

我有一个可以访问数据库的用户,所以我认为这无论如何都不会增加安全风险......

我想我应该对template1进行相同的修改。这是正确的吗?如何检查 template1 中的权限是否正确(例如,默认值)?

Dan*_*ité 42

USAGEsearch_path. 默认情况下,伪角色public(所有用户)在public架构上具有此权限,因此仅在使用以下命令显式撤消它后才会发生此错误:

revoke usage on schema public from public;
Run Code Online (Sandbox Code Playgroud)

当不希望人们窥视其他人的模式时,即使不从表中选择数据(通过不同的权限授予),这是必需的。

如果REVOKE在那个数据库中没有这样做,那么它可能已经在为新数据库建模的模板数据库中发生了(请参阅 参考资料CREATE DATABASE)。


当用户拥有USAGE特权但缺乏CREATE架构特权时,尝试创建对象时会出现不同的错误:架构 public 的权限被拒绝

要检查 psql 中的权限,请使用\dn+ public.

默认情况下(显示扩展显示\x以提高可读性):

# \dn+ 公共
模式列表
-[ 记录 1 ]-----+--------------
姓名 | 民众
业主 | 邮局
访问权限 | postgres=UC/postgres
                  | =UC/postgres
说明 | 标准公共模式

之前缺少=角色名意味着它适用于所有角色(=public)

没有公共 USAGE 权限

姓名 | 民众
业主 | 邮局
访问权限 | postgres=UC/postgres
                  | =C/postgres
说明 | 标准公共模式

没有公共 USAGE 或 CREATE 权限

姓名 | 民众
业主 | 邮局
访问权限 | postgres=UC/postgres
说明 | 标准公共模式


小智 7

我有在自定义模式中创建函数的 pgdump 文件,我想将自定义模式名称切换为一般公共并将旧模式的所有出现替换为空(例如 myschema.tablename 到 tablename)并开始收到错误

ERROR:  no schema has been selected to create in
Run Code Online (Sandbox Code Playgroud)

对于我的情况错误发生在转储当前行的开头

SELECT pg_catalog.set_config('search_path', '', false);
Run Code Online (Sandbox Code Playgroud)

我已将第二个 arg 更改为“public”

SELECT pg_catalog.set_config('search_path', 'public', false);
Run Code Online (Sandbox Code Playgroud)

问题消失了


小智 7

我尝试了多种解决方案,并一遍又一遍地出现相同的错误。

更糟糕的是,当我需要通过删除公共模式并再次创建数据库来重新启动数据库迁移时,我会看到该错误。

修复是:

grant usage on schema public to public;
grant create on schema public to public;
Run Code Online (Sandbox Code Playgroud)