没有模式Postgres查询失败

3

这不起作用,导致出现错误:关系“user”不存在

select * from "user"

这个可以做到

select * from "dbo"."user"

这表明你的 search_path 不包括 dbo 模式。SHOW search_path; 的输出是什么? - undefined
@CraigRinger 它显示 ""$user",public" - undefined
...你是以用户dbo的身份连接的吗? - undefined
@CraigRinger 作为用户 postgres - undefined
所以它不起作用是因为它不在search_path上。所以你必须使用模式限定它。这就是拥有模式的意义所在。 - undefined
1个回答

3

未经模式限定的表会在search_path上进行搜索。这并不会搜索每个模式。默认情况下,它只会搜索以下内容:

  • pg_catalog(始终是第一个,不列在search_path上)
  • pg_temp表空间(隐含的,不列在search_path上)
  • 以当前用户命名的模式,在search_path中列为$user
  • public模式

如果您想让PostgreSQL在其他地方查找,您必须修改search_path以告诉它,或者完全模式限定名称。

请参见 PostgreSQL手册中的search_path

另外,请注意,与某些数据库不同,名称dbo在PostgreSQL中没有特殊意义。它只是另一个名称而已。


我注意到,如果一个视图使用的表的模式不在搜索路径上(比如,在创建视图后被移除),Postgres实际上会返回数据。 当你尝试在视图之外运行这个select语句时,查询会失败。这种情况发生在从搜索路径中移除一个模式之后。 重新将模式添加到视图中,在创建视图后就会丢失。非常令人烦恼。 - undefined
@RTD 这是因为视图的 search_path 在视图创建时被解析并固定在视图中。在视图和函数中明确限定引用是一个好的实践,而不是依赖于搜索路径。 - undefined
我记得在创建视图时,我明确地将模式名称硬编码到了视图中。保存后,Postgres以自己的方式修改了视图,从视图定义中删除了模式名称,因为它在search_path中。然而,在从搜索路径中删除模式之后,看起来视图并没有重构...不幸的是,我没有时间测试这个假设,谢谢您的回复。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接