是否建議將擴展安裝到 pg_catalog 架構中?
由於
pg_catalog
模式中的對象隱含在search_path
(docs)中,是否建議在該模式中安裝擴展?
不要安裝擴展
pg_catalog
(除非這是他們的預設設置:很少有擴展是這樣設計的),因為你永遠不會弄亂系統目錄。@Chris說明了一個原因。還有其他的。但是,“公共”模式絕不是特殊的。它只是標準發行版中預裝的預設模式,因此我們可以立即開始。一些數據庫管理員根本不使用“公共”模式,有些甚至將其刪除。
**
CREATE EXTENSION
**不隸屬於“公共”模式。除非另有說明,否則它將安裝到目前模式中- 除了某些擴展具有預設模式(如PGQ / Londiste)。文件:模式名稱
安裝擴展對象的模式的名稱,假設擴展允許其內容被重新定位。命名模式必須已經存在。如果未指定,並且擴展的控製文件也未指定模式,則使用目前預設的對象創建模式。
請記住,擴展本身不被視為在任何模式中:擴展具有非限定名稱,在數據庫範圍內必須是唯一的。但是屬於擴展的對象可以在模式中。
大膽強調我的。
決定如何管理使用者、模式和**
search_path
**:然後決定在哪里安裝擴展。您可以安裝到您選擇的任何模式,並將該模式包含在
search_path
所有使用者的預設值中,或者只為部分使用者或根本沒有使用者(因此需要合格的引用)。這完全取決於您想要達到的目標。無論你做什麼,保持一致。
我喜歡在專用的“擴展”模式中安裝擴展(允許它),我在“公共”(和“$user” - 如果你使用它)
search_path
*之後的預設值中包含它。*有助於我自己的公共功能和其他公共對象的清晰分離。我的設置postgresql.conf
:search_path = "$user",public,extensions
要麼:
search_path = public,extensions
我安裝擴展程序:
CREATE EXTENSION some_extension SCHEMA extensions;
需要注意的一件事:通過這種方式,您可以在
extensions
架構中的同名(和參數)對像後面“隱藏”(不合格的)對象public
。有關的:
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,博士;**只需使用預設
public
架構進行擴展。