我最近将一个 Postgres 函数app_user_id
从一个旧的自定义扩展名intpair
移到了一个新的自定义扩展名heap_exts
. 除了我从 Postgres 备份恢复的机器之外,这运行良好。
这是错误:
db=> select app_user_id(1, 2);
ERROR: could not access file "$libdir/intpair": No such file or directory
intpair
未安装并heap_exts
已安装,如以下输出所示\dx
:
-[ RECORD 3 ]-------------------------------------------------------------
Name | heap_exts
Version | 1.0
Schema | public
Description |
-- No mention of intpair
该功能app_user_id
在系统目录中列为归heap_exts
:
SELECT e.extname, ne.nspname AS extschema, p.proname, np.nspname AS proschema
FROM pg_catalog.pg_extension AS e
INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid)
INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid)
INNER JOIN pg_catalog.pg_namespace AS ne ON (ne.oid = e.extnamespace)
INNER JOIN pg_catalog.pg_namespace AS np ON (np.oid = p.pronamespace)
WHERE d.deptype = 'e'
AND e.extname IN ('heap_exts')
AND p.proname = 'app_user_id'
ORDER BY 1, 3;
-[ RECORD 1 ]----------
extname | heap_exts
extschema | public
proname | app_user_id
proschema | public
我最初使用以下代码将该功能从旧扩展迁移intpair
到新扩展:heap_exts
-- version 0.1 in heap_exts--0.1.sql
ALTER EXTENSION intpair DROP FUNCTION app_user_id(bigint, bigint);
ALTER EXTENSION heap_exts ADD FUNCTION app_user_id(bigint, bigint);
但是,对于通过旧机器备份恢复的新机器,我app_user_id
直接创建了函数,因为旧扩展intpair
不再存在:
CREATE FUNCTION app_user_id(BIGINT, BIGINT) RETURNS app_user_id
AS 'MODULE_PATHNAME', 'app_user_id_make' LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
为什么 Postgres 试图查看函数的intpair
扩展app_user_id
而不是查看heap_exts
?
听起来您仍然有(或有)一个指向旧函数定义(将是)的条目
pg_proc
。app_user_id(bigint, bigint)
probin
$libdir/intpair
假设那里有一个条目,我猜它与旧
intpair
扩展名没有正确关联(可能是手动添加的,或者代码早于 PostgreSQL 的扩展功能并且该功能被遗漏了CREATE EXTENSION FROM unpackaged
或其他东西)所以当扩展名已被删除,因此仍存在于您恢复的实例中 - 当然,相关的扩展名库文件不再存在。问题是该
pg_proc
条目是否以某种方式最终与您的新扩展相关联,或者您有两个pg_proc
用于该功能的条目。您的上述查询报告的这个修改版本是什么?
我找到了解决方法,但作为答案并不令人满意。我只是尝试安装旧的扩展。正如预期的那样,安装扩展失败,因为函数定义重叠。
尽管有错误,但这似乎修复了函数到扩展的 Postgres 映射。