开发者问题收集

Postgresql函数执行过程

2019-11-14
152

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

DETAIL: spiexceptions.UndefinedTable: relation "A" does not exist.

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

REFRESH MATERIALIZED VIEW B;

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

1个回答

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

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

jjanes
2019-11-14