Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何使扩展不可重新定位?_Postgresql_Postgresql Extensions - Fatal编程技术网

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路径上。只有扩展对象和系统对象中的对象可用。它们再次写入:在函数完成后,检查搜索路径的剩余内容?好的,请执行。您会发现,在函数执行完成后,上一个
搜索路径
会恢复。