Postgresql 如何使扩展不可重新定位?
我有一个分机: 我的任务是使扩展不可重定位:应该可以在任何模式中安装扩展,但不可能更改该模式 有人告诉我这是如何做到的:不要使用运算符,对本地定义的类型和对象使用Postgresql 如何使扩展不可重新定位?,postgresql,postgresql-extensions,Postgresql,Postgresql Extensions,我有一个分机: 我的任务是使扩展不可重定位:应该可以在任何模式中安装扩展,但不可能更改该模式 有人告诉我这是如何做到的:不要使用运算符,对本地定义的类型和对象使用@extschema@前缀。不要声明可重定位扩展 我到底要做什么?首先,您必须在扩展名的控制文件中将可重定位更改为false 除此之外,你得到的建议部分是合理的,部分是胡说八道的 您应该这样定义您的函数: CREATE FUNCTION .... AS $$ /* function body */ $$ SET search_path
@extschema@
前缀。不要声明可重定位扩展
我到底要做什么?首先,您必须在扩展名的控制文件中将
可重定位
更改为false
除此之外,你得到的建议部分是合理的,部分是胡说八道的
您应该这样定义您的函数:
CREATE FUNCTION .... AS
$$ /* function body */ $$
SET search_path = @extschema@;
然后,在函数调用期间,search\u路径
固定为pg\u catalog
,pg\u temp
和扩展模式。
这意味着对没有显式模式的对象的所有访问将只在这些模式中搜索
这样,您就不必担心使用
@extschema@
显式限定函数中的所有内容,而且您可以使用运算符而无需担心,因为搜索路径
也适用于运算符。(您也可以对运算符进行模式限定:运算符(schema.+)
,但这显然是痛苦的,并且会损害可读性。)首先,您必须在扩展名的控制文件中将可重定位的
更改为假
除此之外,你得到的建议部分是合理的,部分是胡说八道的
您应该这样定义您的函数:
CREATE FUNCTION .... AS
$$ /* function body */ $$
SET search_path = @extschema@;
然后,在函数调用期间,search\u路径
固定为pg\u catalog
,pg\u temp
和扩展模式。
这意味着对没有显式模式的对象的所有访问将只在这些模式中搜索
这样,您就不必担心使用
@extschema@
显式限定函数中的所有内容,而且您可以使用运算符而无需担心,因为搜索路径
也适用于运算符。(您也可以对操作符进行模式限定:操作符(schema.+)
,但这显然很痛苦,并且会损害可读性。)他们写信给我说这有点错误,因为您不需要使用全局名称,而只需要使用局部名称(引用:但您在会话中全局公开它,这不好)为避免与可能对象的公共方案中的名称发生冲突(引用:如果公共方案中存在名称冲突的对象,并且您对用户隐藏了它们,该怎么办?将扩展视为您提供给用户的模块),它们会被混淆。没有“全局”和“局部”对象。如果按照我的答案建议的方式设置search\u路径
,public
将不在search\u路径上。只有扩展对象和系统对象中的对象可用。它们再次写入:在函数完成后,检查搜索路径的剩余内容?好的,请执行。您会发现,在函数执行完成后,上一个搜索路径
会被还原。他们写信给我说这有点错误,因为您不需要使用全局名称,而只需要使用局部名称(引用:但您在会话中全局公开它,这不好)为避免与可能对象的公共方案中的名称发生冲突(引用:如果公共方案中存在名称冲突的对象,并且您对用户隐藏了它们,该怎么办?将扩展视为您提供给用户的模块),它们会被混淆。没有“全局”和“局部”对象。如果按照我的答案建议的方式设置search\u路径
,public
将不在search\u路径上。只有扩展对象和系统对象中的对象可用。它们再次写入:在函数完成后,检查搜索路径的剩余内容?好的,请执行。您会发现,在函数执行完成后,上一个搜索路径
会恢复。