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里面的好处是优先级最高,所有用户可见。

create extension extension_name with schema pg_catalog;

即可创建到pg_catalog中。

或者通过这种方式

alter extension extension_name set schema pg_catalog;

但是目前来看,有一些小问题。

比如当extension中包含普通的复合类型,表等对象,使用create extension extension_name with schema pg_catalog; 语法,会报错

cd $PGHOME/share/extension  

cp btree_gist--1.2.sql btree_gist--9.9.9.sql  

vi btree_gist--9.9.9.sql
-- 添加如下
create type new_type as (
  id int,
  c1 int
);

测试

postgres=# create extension btree_gist with schema pg_catalog;
CREATE EXTENSION
postgres=# drop extension btree_gist ;
DROP EXTENSION  

由于新增了复合类型,导致创建失败
postgres=# \set VERBOSITY verbose
postgres=# create extension btree_gist with schema pg_catalog version '9.9.9';
ERROR:  42501: permission denied to create "pg_catalog.new_type"
DETAIL:  System catalog modifications are currently disallowed.
LOCATION:  heap_create, heap.c:280

对于包含table, seq, 复合类型的extension,如果要创建到pg_catalog中,可以使用如下方法修复

修复方法1

先创建到普通schema中,然后使用alter extension set schema pg_catalog修改。

postgres=# create extension btree_gist version '9.9.9';;
CREATE EXTENSION
postgres=# alter extension btree_gist set schema pg_catalog;
ALTER EXTENSION

修复方法2

设置allow_system_table_mods参数,允许修改

不能直接修改
postgres=# set allow_system_table_mods=on;
ERROR:  55P02: parameter "allow_system_table_mods" cannot be changed without restarting the server
LOCATION:  set_config_option, guc.c:5899  

修改到配置文件中,重启数据库
vi $PGDATA/postgresql.conf
allow_system_table_mods=on  

pg_ctl restart -m fast  

然后就可以直接创建到pg_catalog中了
postgres=# create extension btree_gist with schema pg_catalog version '9.9.9';
CREATE EXTENSION

这个报错的原因,归根到底是某个pg_catalog不允许被修改,然而非复合类型缺被允许。

截取部分原始btree_gist--1.2.sql中的内容,包含了create type , operator等操作,这些操作允许执行在pg_catalog中。  

CREATE TYPE gbtreekey_var (
        INTERNALLENGTH = VARIABLE,
        INPUT  = gbtreekey_var_in,
        OUTPUT = gbtreekey_var_out,
        STORAGE = EXTENDED
);

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

时间: 2024-12-29 18:45:02

PostgreSQL create extension with schema pg_catalog的权限异常case的相关文章

PostgreSQL DaaS设计注意 - schema与database的抉择

PostgreSQL DaaS设计注意 - schema与database的抉择 作者 digoal 日期 2016-10-12 标签 PostgreSQL , DaaS , 模板 , schema , database , apply delay , standby 背景 市面上有一些提供DaaS服务的厂商,例如heroKu,可能有上百万的数据库服务: 又比如提供PaaS平台的服务商,数据库也会有很多,同事这些数据库可能也是模板化的,这些厂商并不一定是为每个客户都新建一个数据库集群来满足数据库

用好PostgreSQL role membership来管理继承组权限

用好PostgreSQL role membership来管理继承组权限 作者 digoal 日期 2016-11-14 标签 PostgreSQL , role , 角色 , membership , inherit , 权限继承 背景 在数据库中,如果你想把A用户创建的对象权限赋予给B用户,或者其他用户. 通常我们会对需要赋权的对象使用grant的语法来赋权. 但是这种方法比较繁琐,因为需要对每个对象,每一组需要的权限进行赋权. 如果你需要整个A用户所有对象的权限,以及它将来创建的对象的所有

PostgreSQL教程(十二):角色和权限管理介绍_PostgreSQL

PostgreSQL是通过角色来管理数据库访问权限的,我们可以将一个角色看成是一个数据库用户,或者一组数据库用户.角色可以拥有数据库对象,如表.索引,也可以把这些对象上的权限赋予其它角色,以控制哪些用户对哪些对象拥有哪些权限.     一.数据库角色:     1. 创建角色:   复制代码 代码如下:     CREATE ROLE role_name;       2. 删除角色:   复制代码 代码如下:     DROP ROLE role_name;         3. 查询角色:

PostgreSQL 函数稳定性与constraint_excluded分区表逻辑推理过滤的CASE

PostgreSQL 函数稳定性我在以前写过一些文章来讲解,而且在PG的优化器中,也有大量的要用函数稳定性来做出优化选择的地方. http://www.tudou.com/programs/view/p6E3oQEsZv0/本文要分享的这个CASE也和函数稳定性有关,当我们在使用分区表时,PostgreSQL可以根据分区表的约束,以及用户在SQL中提供的条件进行比对,通过逻辑推理过滤掉一些不需要扫描的表. 逻辑推理在前面也讲过. https://yq.aliyun.com/articles/68

SQLServer存储过程访问数据库权限异常问题的解决方案

server|sqlserver|存储过程|访问|解决|数据|数据库|问题 最近用ASP.net 2.0 + SQL Server做一个网页表单的提交,使用C#编写存储过程来完成向SQL Server数据库表中插入记录的操作.在调用这个存储过程时,出现了关于存储权限的一个异常.下面详述异常产生的过程和解决方案. 1.操作步骤:1)使用ASP.net 2.0,用C#写了一个存储过程,对数据库test中的一个表进行操作,代码如下: public class StoredProcedures{[Mic

如何从PostgreSQL源码分析哪些操作需要超级用户权限 - 阿里云rds superuser提供了哪些权限

标签 PostgreSQL , 超级用户 , superuser 背景 在数据库中哪些操作需要超级用户的权限才能执行? 这个问题翻文档可能翻不全面,或者是已经比较难以完成的任务. 但是从源码里面是比较好找出这个答案的. 权限 例如 postgres=# select * from pg_authid; rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rol

PostgreSQL 从源码找出哪些操作需要超级用户权限 - 阿里云rds_superuser和superuser有什么区别

标签 PostgreSQL , 超级用户 , superuser 背景 在数据库中哪些操作需要超级用户的权限才能执行? 这个问题翻文档可能翻不全面,或者是已经比较难以完成的任务. 但是从源码里面是比较好找出这个答案的. 权限 例如 postgres=# select * from pg_authid; rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rol

PostgreSQL 事件触发器应用 - DDL审计

标签 PostgreSQL , 事件触发器 , DDL审计 , 表结构变更 , 建表等审计 背景 DDL语句的审计是非常重要的,目前PG的DDL审计记录在日志文件中.不便于查看. 为了让DDL事件记录到表中,方便查看,我们可以通过事件触发器来达到这个效果. 事件触发器审计DDL操作 事件触发器语法: Command: CREATE EVENT TRIGGER Description: define a new event trigger Syntax: CREATE EVENT TRIGGER

PostgreSQL 逻辑结构 和 权限体系 介绍

本文旨在帮助用户理解PostgreSQL的逻辑结构和权限体系,帮助用户快速的理解和管理数据库的权限. 逻辑结构 最上层是实例,实例中允许创建多个数据库,每个数据库中可以创建多个schema,每个schema下面可以创建多个对象.对象包括表.物化视图.操作符.索引.视图.序列.函数.... 等等. 在数据库中所有的权限都和角色(用户)挂钩,public是一个特殊角色,代表所有人.超级用户是有允许任意操作对象的,普通用户只能操作自己创建的对象.另外有一些对象是有赋予给public角色默认权限的,所以