我在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
的更改,但不会显示任何行为更改。
我错过了什么?
答案 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登录并运行完全相同的命令,它工作。也许我做错了什么,但如果他们做错了什么,这可能会有所帮助:)