我不确定这个开始发生的确切时间点(我相信它可能是在第一次启动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
答案 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的使用权限...”或类似的东西,实际上该用户可以使用它...但并不完全顺手。