错误 42P01:关系不存在

Phr*_*cis 13 schema postgresql pgadmin

我是创建数据库的新手,这个错误让我目瞪口呆,因为我是数据库管理方面的新手(我主要做报告类型查询)。我通过 pgAdmin3 GUI 创建了一个新数据库,我正在尝试使用 SQL 在其中创建 DB 对象,但得到了一个:

ERROR: relation "replays" does not exist
SQL state: 42P01
Run Code Online (Sandbox Code Playgroud)

我浏览了手册,但没有发现任何有用的东西,尽管我怀疑它可能与search_path某种方式有关。这是一个屏幕截图。知道我做错了什么吗?

42P01

dez*_*zso 8

您最初拥有的是正确的语法 - 用于,而不是用于模式。由于您没有表(在错误消息中称为“关系”),它抛出了未找到的错误。

我看到你已经注意到了这一点——我相信没有比纠正我们自己的错误更好的学习方法了;)

但还有更多。你在上面做的一方面太多,另一方面还不够。

运行脚本,你

  1. 创建模式
  2. 创建角色
  3. SELECT (1.) 中创建的架构中的所有表授予此新角色_
  4. 最后,将新模式的所有权限(CREATEUSAGE)授予新角色

问题出在第 (3) 点。您授予了对表中的权限replays- 但那里没有表!将来可能会有一些,但此时模式完全是空的。这样,GRANTin (3.) 什么都不做——这样你就做得太多了。

但是未来的表呢?

有一个命令可以覆盖它们:ALTER DEFAULT PRIVILEGES. 它不仅适用于表格,还适用于:

目前[as of 9.4]只能更改表(包括视图和外部表)、序列、函数和类型(包括域)的权限。

还有一个重要的限制:

您只能更改将由您自己或您所属的角色创建的对象的默认权限。

这意味着由 所创建的表alice,既不是您,也不是您的成员的角色(可以检查,例如,使用\duin psql),将不会获得规定的访问权限。可选FOR ROLE子句用于指定您所属的“表创建者”角色。在许多情况下,这意味着使用相同的角色创建所有数据库对象是一个好主意,例如mydatabase_owner.

在工作中展示这一点的小例子:

CREATE ROLE test_owner; -- cannot log in
CREATE SCHEMA replays AUTHORIZATION test_owner;
GRANT ALL ON SCHEMA replays TO test_owner;

SET ROLE TO test_owner; -- here we change the context, 
                        -- so that the next statement is issued as the owner role

ALTER DEFAULT PRIVILEGES IN SCHEMA replays GRANT SELECT ON TABLES TO alice;

CREATE TABLE replays.replayer (r_id serial PRIMARY KEY);

RESET ROLE; -- changing the context back to the original role

CREATE TABLE replays.replay_event (re_id serial PRIMARY KEY);

-- and now compare the two

\dp replays.replayer
                                   Access privileges
 Schema  ?   Name   ? Type  ?       Access privileges       ? Column access privileges 
???????????????????????????????????????????????????????????????????????????????????????
 replays ? replayer ? table ? alice=r/test_owner           ?? 
         ?          ?       ? test_owner=arwdDxt/test_owner ? 

\dp replays.replay_event
                               Access privileges
 Schema  ?     Name     ? Type  ? Access privileges ? Column access privileges 
???????????????????????????????????????????????????????????????????????????????
 replays ? replay_event ? table ?                   ? 
Run Code Online (Sandbox Code Playgroud)

如您所见,alice对后一个表没有明确的权限。(在这种情况下,SELECT作为public伪角色的成员,她仍然可以离开桌子,但我不想通过从 撤销权限来使示例混乱public。)