PostgreSQL search_path 更改未按宣传的那样工作

问题描述 投票:0回答:5

我在 RedHat 上使用 PostgreSQL 9.0.3。 该数据库包含两个模式:

public
wh
。我创建了一个名为
django
的新角色。我希望该用户使用
wh
模式作为默认模式。

按照手册,我做了:

ALTER USER django SET SEARCH_PATH TO wh, public;

这似乎有效:

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

但是,如果我执行

\dt
,则仅显示公共模式中的表。在手册中,更改搜索路径应该会立即生效,并且我应该能够访问没有前缀的
wh
表,但事实并非如此。登录和退出会保留对
search_path
的更改,但不会显示任何行为变化。

我错过了什么?

postgresql privileges search-path
5个回答
18
投票

GRANT
可能会解决您的问题:

GRANT USAGE ON SCHEMA wh TO django;

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

设置

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


1
投票

我刚刚在 Windows 64 位上的(刚刚发布的)9.1 上测试了它,它按照指定的方式工作。

摘自

ALTER ROLE
手册页:

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

强调我的


0
投票

这可能是

\dt
命令的限制。

要验证 search_path 是否正常工作,请尝试运行

SELECT * FROM some_table
,其中
some_table
是位于 wh 模式中的路径。


0
投票

对于PostgreSQL,如果用户连接数据库并查找表之类的对象,首先 它会寻找与用户名同名的模式,如果没有找到,它会 查找公共模式,在您的情况下,如果您通过 django 用户连接数据库,它将默认查找模式 django ,但您希望当前模式是 wh,因此使模式名称和角色名称相同,并且比登录数据库作为角色将解决您的问题,无需输入前缀,只需尝试一下!


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.