【发布时间】: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