Postgresql函数执行过程
Postgresql functions execution process
我有一个程序函数(用 pl/python 编写)查询 table A,进行一些计算,然后 returns 一组。我将此函数用作我的物化视图 B 的查询。
一切正常,除了当我想恢复转储时,出现以下错误:
DETAIL: spiexceptions.UndefinedTable: relation "A" does not exist.
引发此错误的行是我的 sql 转储的最后一行:
REFRESH MATERIALIZED VIEW B;
我知道我可以忽略这个错误并在恢复过程后刷新我的物化视图,但我想知道为什么会这样?是因为这个函数运行在另一个对当前恢复过程一无所知的事务中吗?我能做些什么来防止这个错误?
出于安全原因,pg_dump(或pg_restore)发出清空 search_path 的命令,因此当您恢复进程时,通过空搜索获得 运行小路。但它根本不编辑函数的文本主体,而是按原样发出它,因此它无法更改它以指定 table 的完全限定名称。所以函数在执行恢复的过程中找不到 table when 运行。
您可以在函数中完全限定 table 名称,也可以使用 SET search_path = public
定义函数。或者,如果您不担心安全隐患,您可以编辑转储文件以删除清除 search_path 的部分。
我有一个程序函数(用 pl/python 编写)查询 table A,进行一些计算,然后 returns 一组。我将此函数用作我的物化视图 B 的查询。 一切正常,除了当我想恢复转储时,出现以下错误:
DETAIL: spiexceptions.UndefinedTable: relation "A" does not exist.
引发此错误的行是我的 sql 转储的最后一行:
REFRESH MATERIALIZED VIEW B;
我知道我可以忽略这个错误并在恢复过程后刷新我的物化视图,但我想知道为什么会这样?是因为这个函数运行在另一个对当前恢复过程一无所知的事务中吗?我能做些什么来防止这个错误?
出于安全原因,pg_dump(或pg_restore)发出清空 search_path 的命令,因此当您恢复进程时,通过空搜索获得 运行小路。但它根本不编辑函数的文本主体,而是按原样发出它,因此它无法更改它以指定 table 的完全限定名称。所以函数在执行恢复的过程中找不到 table when 运行。
您可以在函数中完全限定 table 名称,也可以使用 SET search_path = public
定义函数。或者,如果您不担心安全隐患,您可以编辑转储文件以删除清除 search_path 的部分。