【问题标题】:Postgresql functions execution processPostgresql函数执行过程
【发布时间】:2019-11-14 14:53:37
【问题描述】:

我有一个程序函数(用 pl/python 编写),它查询表 A,进行一些计算,然后返回一个集合。我使用这个函数作为我的物化视图 B 的查询。 一切正常,除了当我想恢复我的转储时,我收到以下错误:

详细信息:spiexceptions.UndefinedTable:关系“A”不存在。

引发此错误的行是我的 sql 转储的最后一行:

REFRESH MATERIALIZED VIEW B;

我知道我可以忽略此错误并在恢复过程后刷新我的物化视图,但我想知道为什么会发生这种情况?是因为这个函数在另一个对当前恢复过程一无所知的事务中运行吗?我可以做些什么来防止这个错误?

【问题讨论】:

  • 你确定它叫A而不是a吗?您的视图称为b,但您将其称为B。 (“我使用这个函数作为我的物化视图 B 的查询。”)但是 REFRESH MATERIALIZED VIEW B 刷新了一个名为 b 而不是 B 的视图。如果不清楚,引用标识符使其区分大小写,不引用导致标识符全小写,无论您写什么。因为您没有引用B,所以它将是b。因为它没有说b 不存在,所以b 视图存在,但A 不存在。由于您的视图是小写的,我怀疑您的表也是。
  • 另一种可能是您忘记对表进行架构限定,而search_path 不同。
  • 不,它与表名无关。正如我所说,当我手动刷新它时它可以工作。
  • 我的表不符合模式。我只有公共架构,正如我所说,当我手动运行刷新命令时它可以工作。

标签: postgresql materialized-views plpython


【解决方案1】:

出于安全原因,pg_dump(或 pg_restore)会发出一个清空 search_path 的命令,因此当您恢复时,进程会以空的搜索路径运行。但它根本不编辑函数的文本主体,而是按原样发出它,因此它无法更改它以指定表的完全限定名称。因此,该函数在执行还原的进程中运行时找不到表。

您可以完全限定函数中的表名,也可以使用SET search_path = public 定义函数。或者,如果您不担心安全隐患,您可以编辑转储文件以删除清除 search_path 的部分。

【讨论】:

  • 非常感谢。这就是问题所在。
猜你喜欢
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
相关资源
最近更新 更多