【问题标题】:pg_restore error: function raise_err(unknown) does not existpg_restore 错误:函数 raise_err(unknown) 不存在
【发布时间】:2020-08-20 21:19:16
【问题描述】:

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

【问题讨论】:

  • 使用psql 登录到您的源数据库,然后执行\df+ raise_err。据我所知,这不是标准功能。你不应该需要另一个函数来引发错误,因为你可以做 raise error
  • 这在sql 编写的函数中有效还是必须是plpgsql
  • \df+ raise_err 确实...返回函数。这不是我记得明确创建的东西,但我的意思是,事情发生了。
  • 对不起,我没有想到。 language sql 将不支持它,这可能解释了为什么您将其编写为函数。此外,它是raise exception,而不是raise error,正如我在之前的评论中错误地说的那样。看起来有时会发生这种情况:stackoverflow.com/q/30707533/13808319
  • 不要觉得愚蠢,创建该功能非常有意义 IMO。我怀疑这是一个language sql 函数这一事实混淆了算法试图在 pg_backup 期间找到依赖项。

标签: postgresql pg pg-dump pg-restore


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    我最终通过将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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-13
      • 2013-11-25
      • 2012-05-27
      • 1970-01-01
      • 2022-10-06
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多