Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql pg_还原错误:函数raise_err(未知)不存在_Postgresql_Pg_Pg Dump_Pg Restore - Fatal编程技术网

Postgresql pg_还原错误:函数raise_err(未知)不存在

Postgresql pg_还原错误:函数raise_err(未知)不存在,postgresql,pg,pg-dump,pg-restore,Postgresql,Pg,Pg Dump,Pg Restore,我使用pg_dump和pg_restore对我的数据库进行每日备份,在我推送更新后,pg_restore最近停止了工作 我有一个函数validate\u id,它是一个Case/When语句,用于快速检查一些存在完整性问题的数据。看起来像这样: CREATE OR REPLACE FUNCTION validate_id( _string text, _type type ) RETURNS boolean AS $$ SELECT CASE WHEN (stuff) T

我使用pg_dump和pg_restore对我的数据库进行每日备份,在我推送更新后,pg_restore最近停止了工作

我有一个函数
validate\u 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>backupfolder/databaseName.tar

使用此命令时:

pg\U restore-U postgres-h localhost-p 5432-d postgres-C“backupfolder/databaseName.tar”

截至两天前,这将抛出一个错误:

pg\u restore:错误:无法执行查询:错误:函数raise\u err(未知)不存在


我真不知道该怎么办。我认为可能发生的情况是,它试图在恢复
raise\u err
函数之前恢复此函数。我认为这是postgres内置的(我可以
选择raise_err('Hello,World');
)。这可能吗?这是我的
CASE
语句,因为我只需要返回布尔值吗?所有权限似乎都正确,使用以前的备份进行恢复也可以正常工作。

问题在于功能代码中的
raise\u err
不符合架构要求

这有潜在的危险:恶意用户可能创建自己的函数
raise\u err
并设置
search\u path
,从而调用错误的函数

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

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


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

我最终解决了这个问题,方法是显式设置两个函数的搜索路径,
raise\u err()
validate\u id()
public

ALTER FUNCTION validate_id(text,text) SET search_path=public;
ALTER FUNCTION raise_err(text,text) SET search_path=public;

使用
psql
登录源数据库,然后执行
\df+raise\u err
。据我所知,这不是一个标准函数。您不应该需要另一个函数来引发错误,因为您可以只执行
raiseerror
这在
sql
中编写的函数中起作用,还是必须是
plpgsql
\df+raise\u err
返回函数。这不是我记得明确创建的东西,但我的意思是,事情发生了。对不起,我没有想到这一点<代码>语言sql将不支持它,这可能解释了为什么将它作为函数编写。此外,它是
引发异常
,而不是我在前面的评论中错误地说的
引发错误
。看起来有时会发生这样的情况:不要觉得愚蠢,在我看来创建该函数非常有意义。我怀疑这是一个
语言sql
函数这一事实让algo在pg_备份过程中试图查找依赖项感到困惑。