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

Hel*_*Vim 7 postgresql pg-dump pg-restore pg

我使用 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;
Run Code Online (Sandbox Code Playgroud)

由于我添加了此功能,当我使用此命令转储时:

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声明,因为我只需要返回布尔值?所有权限似乎都是正确的,并且使用以前的备份进行恢复效果很好。

Lau*_*lbe 6

问题是raise_err您的函数代码中没有模式限定。

这具有潜在的危险:恶意用户可能会创建自己的函数raise_err并进行设置search_path,从而调用错误的函数。

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

由于这些原因,在当前版本的 PostgreSQL 中pg_dump设置pg_restore为空。search_path

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