Postgresql函数执行过程

Postgresql函数执行过程,postgresql,materialized-views,plpython,Postgresql,Materialized Views,Plpython,我有一个过程函数(用pl/python编写),它查询表a,进行一些计算,然后返回一个集合。我使用这个函数作为我的物化视图B的查询。 所有操作都能正常工作,但当我想恢复转储时,会出现以下错误: 详细信息:SpieExceptions.UndefinedTable:关系“A”不存在 引发此错误的行是我的sql转储的最后一行: 刷新物化视图B 我知道我可以忽略这个错误并在恢复过程后刷新我的物化视图,但我想知道为什么会发生这种情况?是否因为此函数在另一个事务中运行,而该事务对当前恢复过程一无所知?我能做

我有一个过程函数(用pl/python编写),它查询表a,进行一些计算,然后返回一个集合。我使用这个函数作为我的物化视图B的查询。 所有操作都能正常工作,但当我想恢复转储时,会出现以下错误:

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

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

刷新物化视图B


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

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


您可以在函数中完全限定表名,也可以使用
SET search\u path=public
定义函数。或者,如果您不担心安全问题,也可以编辑转储文件以删除清除搜索路径的部分。

您确定该文件名为
A
而不是
A
?您的视图称为
b
,但您将其称为
b
。(“我使用此函数作为我的物化视图B的查询”)但是
刷新物化视图B
刷新名为
B
的视图,而不是
B
。如果不清楚,引用标识符会使其区分大小写,不引用会导致标识符全部小写,而不管您写了什么。由于您没有引用
B
,因此它将是
B
。因为它没有说
b
不存在,所以
b
视图存在,但是
A
不存在。由于您的视图是小写的,我怀疑您的表也是。另一种可能是您忘记了对表进行模式限定,并且
search\u path
不同。不,它与表名无关。正如我所说,当我手动刷新它时,它会工作。我的表不是符合模式的。我只有公共模式,正如我所说,当我手动运行refresh命令时,它可以工作。非常感谢。这就是问题所在。