我是创建数据库的新手,这个错误让我目瞪口呆,因为我对数据库管理非常陌生(我主要做报告类型查询)。我通过 pgAdmin3 GUI 创建了一个新数据库,我正在尝试使用 SQL 在其中创建 DB 对象,但得到了:
ERROR: relation "replays" does not exist SQL state: 42P01
我浏览了手册,但没有发现任何很有帮助的东西,尽管我怀疑它可能与search_path
某种方式有关。这是一个屏幕截图。知道我做错了什么吗?
我是创建数据库的新手,这个错误让我目瞪口呆,因为我对数据库管理非常陌生(我主要做报告类型查询)。我通过 pgAdmin3 GUI 创建了一个新数据库,我正在尝试使用 SQL 在其中创建 DB 对象,但得到了:
ERROR: relation "replays" does not exist SQL state: 42P01
我浏览了手册,但没有发现任何很有帮助的东西,尽管我怀疑它可能与search_path
某种方式有关。这是一个屏幕截图。知道我做错了什么吗?
您最初拥有的是正确的语法——用于表,而不是用于模式。由于您没有表格(在错误消息中称为“关系”),因此它引发了未找到错误。
我看到你已经注意到了这一点——我相信没有比纠正我们自己的错误更好的学习方法了;)
但还有更多。您在上面所做的一方面太多,另一方面还不够。
运行脚本,你
SELECT
的架构中的所有表授予此新角色_CREATE
和USAGE
)授予新角色问题出在第 (3) 点之内。您授予了对其中表的权限
replays
- 但那里没有表!将来可能会有一些,但此时模式是完全空的。这样,GRANT
in (3.) 什么都不做——这样你做的太多了。但是未来的桌子呢?
有一个覆盖它们的命令:
ALTER DEFAULT PRIVILEGES
. 它不仅适用于表格,还适用于:还有一个重要的限制:
这意味着由
alice
既不是您也不是您的成员的角色(可以检查,例如,通过使用\du
inpsql
)创建的表将不会获得规定的访问权限。可选FOR ROLE
子句用于指定您所属的“表创建者”角色。在许多情况下,这意味着使用相同的角色创建所有数据库对象是一个好主意 - 类似mydatabase_owner
.一个在工作中展示这一点的小例子:
如您所见,
alice
对后一个表没有明确的权限。(在这种情况下,SELECT
作为伪角色的成员,她仍然可以从表中退出public
,但我不想通过撤销来自 的权利来混淆示例public
。)我与帮助我找到答案的人交谈。正确的语法是,供以后的任何人参考。文档中提到了它,尽管它很容易被忽略。