我使用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
语句,因为我只需要返回布尔值吗?所有权限似乎都是正确的,并且可以使用以前的备份进行还原。
答案 0 :(得分:1)
问题是openmdao --version
在您的功能代码中不符合架构要求。
这具有潜在的危险:恶意用户可以创建自己的功能raise_err
并设置raise_err
,以便调用错误的功能。
由于search_path
通常由超级用户运行,因此这可能是一个安全问题。想象一下在索引定义中使用了这样的函数!
由于这些原因,pg_restore
和pg_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