Postgres没有跟随search_path来定位表

时间:2013-07-31 19:11:32

标签: postgresql postgresql-9.2 psql

我不确定这个开始发生的确切时间点(我相信它可能是在第一次启动pgadmin3之后)。基本上这似乎突然发生,一切似乎都配置正确..

PostgreSQL似乎不再在search_path之后找到我的表了。

\d
No relations found.

我的搜索路径已设置(持续存在):

SHOW search_path;
"public, myschema1, myschema2"
(1 row)

我不仅是有问题的表的所有者,而且还运行了:

GRANT ALL ON SCHEMA public to myusername;
GRANT ALL ON SCHEMA myschema1 to myusername;
GRANT ALL ON SCHEMA myschema2 to myusername;

数据就在那里。运行\ dn时我可以看到模式。如果我完全限定模式和表名,我也可以运行查询。最大的问题是,已经创建的引用非限定表名的函数将不起作用。

任何人都可以想到我可能没有尝试过的东西吗?关于是什么导致这个问题开始发生的任何想法?

感谢您的帮助! -hightech

2 个答案:

答案 0 :(得分:1)

您可能将search_path输入为一个字符串

postgres=# set search_path to public, s1;
SET
postgres=# show search_path ;
 search_path 
-------------
 public, s1
(1 row)

postgres=# set search_path to 'public, s1';
SET
postgres=# show search_path ;
 search_path  
--------------
 "public, s1"
(1 row)

第二个设置错误,无效。

答案 1 :(得分:0)

我通过 GRANT 解决了一个类似的问题,该用户在该架构上以 OWNER 登录了 SCHAGE上的用法。让我发展:

用户故事:我可以使用Postgres 9.6重现这种奇怪的行为,请参见下面的控制台输出。那是多么奇怪?我可以\dt,但是do_preprod=> -- I'm logged on as preprod_www_ro, a read-only user who belongs to readonly ROLE. do_preprod=> SET search_path TO preprod,public; SET do_preprod=> SHOW search_path; search_path ----------------- preprod, public (1 row) do_preprod=> \dt Did not find any relations. do_preprod=> \dt users; Did not find any relation named "users". do_preprod=> \dt preprod.users; List of relations Schema | Name | Type | Owner ---------+-------+-------+------------- preprod | users | table | preprod_www (1 row) 不会发出任何东西!我也可以在这些表上进行SELECT,这确实让我感到困惑。

(在search_path中,请注意逗号后的空格,由PostgreSQL自动调整)

preprod_www

然后,以readonly(=模式所有者)身份登录,我授予preprod_www_ro角色(USAGE的)preprod_www_ro特权。     do_preprod => SCHEMA preprod上的GRANT使用情况为只读;

然后,以\dt的身份,我可以立即看到与search_path的关系,充分享受我的\dt,而不必注销登录重新登录。

在发出\dt preprod.users[self.textView setMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)]; [self.textView setHorizontallyResizable:YES]; [[self.textView textContainer] setWidthTracksTextView:NO]; [[self.textView textContainer] setContainerSize:NSMakeSize(FLT_MAX, FLT_MAX)]; 时,我本来希望PostgreSQL发出更清晰的消息:“未授予SCHEMA的使用权限...”或类似的东西,实际上该用户可以使用它...但并不完全顺手。