pg_restore error: function raise_err(unknown) does not exist

pg_restore error: function raise_err(unknown) does not exist

我 运行 使用 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 语句是因为我只需要 return 布尔值吗?所有权限似乎都是正确的,并且使用以前的备份恢复也可以正常工作。

问题是 raise_err 不是您的函数代码中限定的架构。

这有潜在的危险:恶意用户可以创建自己的函数 raise_err 并设置 search_path 以便调用错误的函数。

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

由于这些原因 pg_dumppg_restore 在当前版本的 PostgreSQL 中设置一个空 search_path

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

我最终通过将 raise_err()validate_id() 这两个函数的搜索路径显式设置为 public:

解决了这个问题
ALTER FUNCTION validate_id(text,text) SET search_path=public;
ALTER FUNCTION raise_err(text,text) SET search_path=public;