PostgreSQL search_path更改不像宣传的那样工作

时间:2011-09-13 19:32:45

标签: postgresql privileges search-path

我在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的更改,但不会显示任何行为更改。

我错过了什么?

5 个答案:

答案 0 :(得分:13)

这可能会解决您的问题:

GRANT USAGE ON SCHEMA wh TO django;

(或对任何将django作为(直接或间接)成员的角色授予使用权。)
(或者全部授予......如果这就是你想要的。)

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

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

答案 1 :(得分:1)

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

摘自ALTER ROLE联机帮助页:

  

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

强调我的

答案 2 :(得分:0)

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

要验证search_path是否正常工作,请尝试运行SELECT * FROM some_table,其中some_table是位于wh架构中的{{1}}。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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