是否建议将扩展安装到pg_catalog模式?


Answers:


16

不要安装扩展名pg_catalog(除非它们是默认扩展名:很少有这样设计的扩展名),因为您永远不会搞乱系统目录。@Chris演示了一个原因。还有其他

但是,“公共”模式绝非特别。它只是预先安装在标准发行版中的默认架构,因此我们可以立即开始使用。一些数据库管理员根本不使用“公共”模式,甚至有些管理员将其删除。

CREATE EXTENSION不隶属于“公共”模式。除非另有说明,否则它将安装到当前模式中 -除非某些扩展具有预设模式(例如PGQ / Londiste)。文档:

schema_name

假设扩展允许其内容重定位,则在其中安装扩展对象的模式的名称。命名模式必须已经存在。如果未指定,并且扩展的控制文件也未指定架构,则使用当前的默认对象创建架构

请记住,扩展本身不被认为在任何模式中:扩展具有非限定名称,这些名称必须在数据库范围内是唯一的。但是属于扩展名的对象可以在模式内。

大胆强调我的。
确定如何管理用户,架构和search_path

然后决定在哪里安装扩展。您可以安装到您选择的任何模式,并将该模式​​默认包含search_path给所有用户,也可以只包含一些用户或根本不包含任何用户(因此需要合格的引用)。这完全取决于您要实现的目标。
无论您做什么,都要保持一致。

我想安装扩展(即允许它)在专用的“扩展”模式,这是我在默认search_path 后, “公共”(和“$ USER” -如果使用)。有助于将我自己的公共职能和其他公共物品彻底分开。我在的设置postgresql.conf

search_path = "$user",public,extensions

要么:

search_path = public,extensions

我安装扩展带有:

CREATE EXTENSION some_extension SCHEMA extensions;

需要注意的一件事:这样,您可以在extensions架构中具有相同名称(和参数)的对象之后“隐藏”(不合格)架构中的对象public

有关:


确定是plpgsql扩展,然后以某种方式将此规则作为例外?我见过的每个安装都在pg_catalog中具有此扩展名
zam6ak 2015年

@ zam6ak:是的,plpgsql有点特殊情况:引用手册In PostgreSQL 9.0 and later, PL/pgSQL is installed by default. However it is still a loadable module, so especially security-conscious administrators could choose to remove it.
Erwin Brandstetter

1
plv8也会自行安装到pg_catalog。(如果尝试更改它会引发错误。)这也许是安装函数的过程语言扩展的标准吗?
jpmc26 2016年

6

pg_catalog据我所知,不建议将扩展程序安装到其中。您应该使用默认public架构,默认情况下也是如此search_path

为什么?

例如,我将使用pageinspect已经在public模式中创建的扩展名。默认情况下,数据库中的所有架构都可以访问所有功能(如果它们位于public架构中)。

现在,我尝试pg_catalog使用

ALTER EXTENSION pageinspect SET SCHEMA pg_catalog;

而且效果很好。

但...

尝试再次移动它,public使用

ALTER EXTENSION pageinspect SET SCHEMA public;

并且它不允许这样做,并产生以下错误

ERROR: cannot remove dependency on schema pg_catalog because it is a system object
SQL state: 0A000

哦!好吧,那不会让我移动它的。我可以public通过拖放并重新创建将其重新放入架构中,对吗?

DROP EXTENSION pageinspect;
CREATE EXTENSION pageinspect;

好好 返回到public架构中的正确位置,并且数据库中的所有架构仍然可以使用这些功能。

TL,DR;只需public对扩展使用默认架构。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.