如何使扩展不可重定位?
How to make an extension not relocatable?
我有一个分机:https://github.com/CraigTyle/Mathexp
我的任务是使扩展不可重定位:应该可以在任何架构中安装扩展,但应该不可能更改该架构。
有人告诉我该怎么做:不要使用运算符并为本地定义的类型和对象使用 @extschema@
前缀。好吧,不要声明可重定位扩展。
我到底需要做什么?
首先,您必须在扩展的控制文件中将 relocatable
更改为 false
。
除此之外,您得到的建议部分有道理,部分无稽之谈。
你应该这样定义你的函数:
CREATE FUNCTION .... AS
$$ /* function body */ $$
SET search_path = @extschema@;
然后 search_path
在函数调用期间固定为 pg_catalog
、pg_temp
和您的扩展架构。
这意味着对没有显式模式的对象的所有访问都只会在这些模式中搜索。
那么您就不必担心用 @extschema@
显式限定函数中的所有内容,您可以放心地使用运算符,因为 search_path
也适用于运算符。 (您还可以对运算符进行模式限定:OPERATOR(schema.+)
,但这显然很痛苦并且会损害可读性。)
我有一个分机:https://github.com/CraigTyle/Mathexp
我的任务是使扩展不可重定位:应该可以在任何架构中安装扩展,但应该不可能更改该架构。
有人告诉我该怎么做:不要使用运算符并为本地定义的类型和对象使用 @extschema@
前缀。好吧,不要声明可重定位扩展。
我到底需要做什么?
首先,您必须在扩展的控制文件中将 relocatable
更改为 false
。
除此之外,您得到的建议部分有道理,部分无稽之谈。
你应该这样定义你的函数:
CREATE FUNCTION .... AS
$$ /* function body */ $$
SET search_path = @extschema@;
然后 search_path
在函数调用期间固定为 pg_catalog
、pg_temp
和您的扩展架构。
这意味着对没有显式模式的对象的所有访问都只会在这些模式中搜索。
那么您就不必担心用 @extschema@
显式限定函数中的所有内容,您可以放心地使用运算符,因为 search_path
也适用于运算符。 (您还可以对运算符进行模式限定:OPERATOR(schema.+)
,但这显然很痛苦并且会损害可读性。)