Phr*_*cis 13 schema postgresql pgadmin
我是创建数据库的新手,这个错误让我目瞪口呆,因为我是数据库管理方面的新手(我主要做报告类型查询)。我通过 pgAdmin3 GUI 创建了一个新数据库,我正在尝试使用 SQL 在其中创建 DB 对象,但得到了一个:
Run Code Online (Sandbox Code Playgroud)ERROR: relation "replays" does not exist SQL state: 42P01
我浏览了手册,但没有发现任何有用的东西,尽管我怀疑它可能与search_path
某种方式有关。这是一个屏幕截图。知道我做错了什么吗?
您最初拥有的是正确的语法 - 用于表,而不是用于模式。由于您没有表(在错误消息中称为“关系”),它抛出了未找到的错误。
我看到你已经注意到了这一点——我相信没有比纠正我们自己的错误更好的学习方法了;)
但还有更多。你在上面做的一方面太多,另一方面还不够。
运行脚本,你
SELECT
将(1.) 中创建的架构中的所有表授予此新角色_CREATE
和USAGE
)授予新角色问题出在第 (3) 点。您授予了对表中的权限replays
- 但那里没有表!将来可能会有一些,但此时模式完全是空的。这样,GRANT
in (3.) 什么都不做——这样你就做得太多了。
但是未来的表呢?
有一个命令可以覆盖它们:ALTER DEFAULT PRIVILEGES
. 它不仅适用于表格,还适用于:
目前[as of 9.4]只能更改表(包括视图和外部表)、序列、函数和类型(包括域)的权限。
还有一个重要的限制:
您只能更改将由您自己或您所属的角色创建的对象的默认权限。
这意味着由 所创建的表alice
,既不是您,也不是您的成员的角色(可以检查,例如,使用\du
in 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
。)