错误:尚未选择要在其中创建的架构


38

我正在一个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

有什么提示吗?我应该找什么?

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

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

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

我只有一个可以访问数据库的用户,所以我认为这绝对不会增加安全风险...

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


3
也许您的用户没有必要的特权才能在公共架构中创建表。
a_horse_with_no_name 2015年

编辑后:是,连接到template1并检查架构权限(请参阅编辑后的答案)。
DanielVérité15年

Answers:


34

如果没有USAGE对的任何架构的特权,就会发生这种情况search_path。缺省情况下,伪角色public(所有用户)对public模式具有此特权,因此仅在使用以下命令明确吊销它之后,才会发生此错误:

revoke usage on schema public from public;

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

如果REVOKE尚未在该数据库中完成此操作,则可能是在模板数据库中发生的,通过该数据库对新数据库进行建模(请参阅参考资料CREATE DATABASE)。


当用户具有USAGE特权但CREATE对架构缺少特权时,尝试创建对象时会出现另一个错误:拒绝架构public的权限

要检查psql内的特权,请使用\dn+ public

默认情况下\x为便于阅读,带有扩展显示):

#\ dn +公共
模式清单
-[记录1] ----- + -----------------------
姓名| 上市
业主| Postgres
访问权限| postgres = UC / postgres
                  | = UC / postgres
描述 标准公共模式

之前没有=角色名称意味着适用于所有角色(= public)

没有公共使用权限

姓名| 上市
业主| Postgres
访问权限| postgres = UC / postgres
                  | = C / postgres
描述 标准公共模式

没有公共的使用或创建权限

姓名| 上市
业主| Postgres
访问权限| postgres = UC / postgres
描述 标准公共模式

谢谢,这解决了!(我将在问题中写一个便条)。
Emanuele Paolini 2015年

3

我有一个pgdump文件,用于在自定义模式中创建函数,我想将自定义模式名称切换为普通模式,并将所有出现的情况都替换为旧模式为空(例如,将myschema.tablename更改为tablename),并开始接收错误

ERROR:  no schema has been selected to create in

就我而言,在转储当前行的开头发生错误

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

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

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

问题消失了

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.