Answers:
不要安装扩展名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
。
有关:
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.
pg_catalog
。(如果尝试更改它会引发错误。)这也许是安装函数的过程语言扩展的标准吗?
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
对扩展使用默认架构。
plpgsql
扩展,然后以某种方式将此规则作为例外?我见过的每个安装都在pg_catalog中具有此扩展名