Postgresql

是否建議將擴展安裝到 pg_catalog 架構中?

  • March 6, 2019

由於pg_catalog模式中的對象隱含在search_pathdocs)中,是否建議在該模式中安裝擴展?

不要安裝擴展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架構進行擴展。

引用自:https://dba.stackexchange.com/questions/107389