Postgresql pg_还原错误:函数raise_err(未知)不存在
我使用pg_dump和pg_restore对我的数据库进行每日备份,在我推送更新后,pg_restore最近停止了工作 我有一个函数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
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_备份过程中试图查找依赖项感到困惑。