首页 > 解决方案 > 如何使扩展不可重定位?

问题描述

我有一个扩展:https ://github.com/CraigTyle/Mathexp

我的任务是使扩展不可重定位:应该可以在任何模式中安装扩展,但应该不可能更改该模式。

有人告诉我这是怎么做的:不要使用运算符,而是@extschema@为本地定义的类型和对象使用前缀。好吧,不要声明可重定位扩展。

我到底该怎么做?

标签: postgresqlpostgresql-extensions

解决方案


首先,您必须在扩展的控制文件中更改relocatable为。false

除此之外,您得到的建议部分合理,部分无稽之谈。

你应该像这样定义你的函数:

CREATE FUNCTION .... AS
$$ /* function body */ $$
SET search_path = @extschema@;

然后将search_path固定为pg_catalogpg_temp并且在函数调用期间您的扩展模式。这意味着对没有显式模式的对象的所有访问都只会在这些模式中搜索。

然后您不必担心用 明确限定函数中的所有内容@extschema@,并且您可以使用运算符而不必担心,因为search_path也适用于运算符。(您也可以对运算符进行模式限定:OPERATOR(schema.+),但这显然很痛苦并且会损害可读性。)


推荐阅读