天天看點

PostgreSQL create extension with schema pg_catalog的權限異常case

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不允許被修改,然而非複合類型缺被允許。

社群将修複此問題,統一權限風格。