13

我在 RedHat 上使用 PostgreSQL 9.0.3。该数据库包含两个模式,publicwh. 我创建了一个名为 的新角色django。我希望这个用户使用wh默认模式。

按照手册,我做了:

ALTER USER django SET SEARCH_PATH TO wh, public;

这似乎有效:

SHOW SEARCH_PATH;
search_path 
-------------
wh, public

但是,如果我随后执行\dt,则仅显示来自公共模式的表。在手册中,更改搜索路径应该有立竿见影的效果,我应该能够访问wh没有前缀的表,但事实并非如此。登录和注销会保留更改,search_path但不会显示任何行为更改。

我错过了什么?

4

5 回答 5

15

GRANT可能会解决您的问题:

GRANT USAGE ON SCHEMA wh TO django;

(或者GRANT USAGE ...任何将 django 作为(直接或间接)成员的角色。)
(或者GRANT ALL ...如果这是你想要的。)

设置search_path指示 Postgres 在列出的模式中查找对象。它不授予查看那里的权限。如果“django”没有必要的权限,\dt则不得(也不会)显示该信息。

另一方面,如果您已经尝试过作为超级用户(根据您对上一个建议的评论),那么这可能不是它......

于 2011-09-14T00:18:23.700 回答
1

我刚刚在 Windows 64 位上(仅发布)9.1 上对其进行了测试,并且它按规定工作。

摘自手册ALTER ROLE页:

其余变体更改配置变量的角色会话默认值,无论是针对所有数据库,还是在指定 IN DATABASE 子句时,仅针对命名数据库中的会话。每当角色随后启动新会话时,指定的值将成为会话默认值,覆盖 postgresql.conf 中存在的或从 postgres 命令行接收的任何设置。这只发生在登录时;执行 SET ROLE 或 SET SESSION AUTHORIZATION 不会导致设置新的配置值。

强调我的

于 2011-09-13T22:04:51.810 回答
0

这可能是\dt命令的限制。

要验证 search_path 是否正常工作,请尝试运行SELECT * FROM some_tablewhere some_tableis one 位于 wh 模式中。

于 2011-09-13T20:28:54.973 回答
0

对于PostgreSQL,如果用户连接数据库并查找表等对象,首先它将查找与用户名相同的模式,如果未找到,它将查找公共模式,在您的情况下,如果您通过 django 用户连接数据库,它会默认查找架构 django ,但是您希望当前架构是 wh,因此使架构名称和角色名称相同,然后以角色身份登录数据库将解决您的问题,不用输入前缀,试一试!

于 2011-09-14T08:47:24.167 回答
0

对我来说,问题是我试图在 pgAdmin 中设置搜索路径。由于某种原因,它没有将更改应用到 search_path。(它一直在数据库上设置参数?)
我通过 psql 登录并运行完全相同的命令并且它工作。也许我做错了什么,但这可能会帮助其他人,如果他们也做错了什么:)

于 2018-04-16T16:22:31.043 回答