天天看点

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不允许被修改,然而非复合类型缺被允许。

社区将修复此问题,统一权限风格。