zam*_*6ak 13 postgresql best-practices postgresql-9.4 postgresql-extensions
由于pg_catalog
架构中的对象隐含在search_path
( docs ) 中,是否建议在该架构中安装扩展?
Erw*_*ter 17
不要安装扩展pg_catalog
(除非这是他们的默认设置:很少有扩展是这样设计的),因为你永远不会弄乱系统目录。@Chris展示了一个原因。还有其他人。
然而,“公共”模式并没有什么特别之处。这只是标准发行版中预装的默认架构,因此我们可以立即开始。一些数据库管理员根本不使用“公共”模式,有些甚至删除它。
CREATE EXTENSION
不隶属于“公共”模式。除非另有说明,否则它会安装到当前架构中- 除了某些扩展具有预设架构(如PGQ / Londiste)。文档:
模式名称
安装扩展对象的架构名称,假定扩展允许重定位其内容。命名模式必须已经存在。如果未指定,并且扩展的控制文件也未指定架构,则使用当前默认的对象创建架构。
请记住,扩展本身不被视为在任何模式中:扩展具有非限定名称,该名称必须在数据库范围内是唯一的。但是属于扩展的对象可以在模式内。
大胆强调我的。
决定如何管理用户、模式和search_path
:
然后决定在哪里安装扩展。您可以安装到您选择的任何架构,并将该架构包含在search_path
所有用户的默认设置中,或者仅包含部分用户或根本不包含该架构(因此需要限定引用)。这一切都取决于您想要实现的目标。
无论你做什么,保持一致。
我喜欢在专用的“扩展”模式中安装扩展(允许它),我将其包含在“public”(和“$user” - 如果您使用它)search_path
之后的默认设置中。有助于清晰地分离我自己的公共功能和其他公共对象。我的设置postgresql.conf
:
search_path = "$user",public,extensions
Run Code Online (Sandbox Code Playgroud)
或者:
search_path = public,extensions
Run Code Online (Sandbox Code Playgroud)
我安装扩展程序:
CREATE EXTENSION some_extension SCHEMA extensions;
Run Code Online (Sandbox Code Playgroud)
需要注意的一件事:通过这种方式,您可以在extensions
模式中的同名(和参数)对象后面“隐藏”(非限定)模式中的对象public
。
有关的:
pg_catalog
据我所知,不建议将扩展安装到其中。您应该使用默认public
架构,它也在search_path
默认情况下。
例如,我将使用pageinspect
我已经在public
架构中创建的扩展。默认情况下,如果数据库中的所有模式都位于模式中,则所有函数均可访问public
。
现在,我尝试将其移动到pg_catalog
架构,使用
ALTER EXTENSION pageinspect SET SCHEMA pg_catalog;
Run Code Online (Sandbox Code Playgroud)
它工作得很好。
但...
尝试再次移动它,public
使用
ALTER EXTENSION pageinspect SET SCHEMA public;
Run Code Online (Sandbox Code Playgroud)
它不会允许它,产生以下错误
ERROR: cannot remove dependency on schema pg_catalog because it is a system object
SQL state: 0A000
Run Code Online (Sandbox Code Playgroud)
哦哦!好吧,它不会让我移动它也没关系。我可以public
通过删除它并重新创建来将它恢复到模式中,对吗?...
DROP EXTENSION pageinspect;
CREATE EXTENSION pageinspect;
Run Code Online (Sandbox Code Playgroud)
好的,不错。回到它的正确位置public
数据库中的所有模式仍然可以访问这些函数。
TL,博士;只需使用public
扩展的默认架构即可。
归档时间: |
|
查看次数: |
9536 次 |
最近记录: |