postgresql , create extension , pg_catalog
pg_catalog這個schema是postgresql預設的中繼資料schema,所有的中繼資料都在這裡.
另一方面,pg_catalog這個schema預設就在搜尋路徑search_path裡面,并且是删除不掉的,而且它的優先級排在所有schema的前面。
比如有兩個重名的pg_class分别在這兩個schema裡面。pg_catalog.pg_calss, public.pg_class, 如果你執行select * from pg_class,那麼搜尋的是pg_catalog.pg_class.
是以我們在建立extension或者建立一些共用對象時,可以建立在public裡面,也可以建立在pg_catalog裡面。建立在pg_catalog裡面的好處是優先級最高,所有使用者可見。
即可建立到pg_catalog中。
或者通過這種方式
但是目前來看,有一些小問題。
比如當extension中包含普通的複合類型,表等對象,使用create extension extension_name with schema pg_catalog; 文法,會報錯
測試
對于包含table, seq, 複合類型的extension,如果要建立到pg_catalog中,可以使用如下方法修複
先建立到普通schema中,然後使用alter extension set schema pg_catalog修改。
設定allow_system_table_mods參數,允許修改
這個報錯的原因,歸根到底是某個pg_catalog不允許被修改,然而非複合類型缺被允許。
社群将修複此問題,統一權限風格。