pg_restore错误:函数raise_err(未知)不存在

时间:2020-08-20 21:19:16

标签: postgresql pg pg-dump pg-restore

我使用pg_dump和pg_restore运行数据库的每日备份,这些备份最近在我推送更新后停止工作。

我有一个函数validate_id,它是一个Case/When语句,就像对具有完整性问题的某些数据进行快速检查一样。看起来像这样:

CREATE OR REPLACE FUNCTION validate_id(
    _string text,
    _type type
) RETURNS boolean AS
$$
SELECT
    CASE WHEN (stuff) THEN TRUE
    WHEN (other stuff) THEN TRUE
    When (more stuff) THEN raise_err('Not an accepted type, the accepted types are: x y z')
ELSE FALSE
$$
LANGUAGE SQL;

自从我添加此功能以来,当我使用以下命令转储时:

pg_dump -U postgres -h ipaddress -p 5432 -w -F t databaseName > backupsfolder/databaseName.tar

当我使用此命令时:

pg_restore -U postgres -h localhost -p 5432 -d postgres -C "backupsfolder/databaseName.tar"

从两天前开始,现在会引发错误:

pg_restore: error: could not execute query: ERROR: function raise_err(unknown) does not exist

我对要做的事很迷茫。我认为可能正在发生的事情是,它在恢复raise_err函数之前试图恢复该函数。我认为是postgres内置的(我可以SELECT raise_err('Hello, World');)。这可能吗?是我的CASE语句,因为我只需要返回布尔值吗?所有权限似乎都是正确的,并且可以使用以前的备份进行还原。

2 个答案:

答案 0 :(得分:1)

问题是openmdao --version在您的功能代码中不符合架构要求。

这具有潜在的危险:恶意用户可以创建自己的功能raise_err并设置raise_err,以便调用错误的功能。

由于search_path通常由超级用户运行,因此这可能是一个安全问题。想象一下在索引定义中使用了这样的函数!

由于这些原因,pg_restorepg_dump在当前PostgreSQL版本中设置了一个空pg_restore

解决此问题的方法是在SQL语句中显式使用该函数的架构。

答案 1 :(得分:0)

我最终通过明确设置两个函数 var loggerConfig = new LoggerConfiguration() .WriteTo.Async(a => a.Console()) .CreateLogger(); services.AddLogging(c => c.AddSerilog(loggerConfig)); raise_err()validate_id()的搜索路径来解决了这个问题:

public
相关问题