GPDB7-新特性-角色创建

2023-10-26 19:08:06 浏览数 (1)

GPDB7-新特性-角色创建

9月GPDB7发布了release版本,新增了很多新特性及性能改进,对GPDB用户带来福音。业务在调研GPDB6升级到GPDB7的过程中,生产环境会创建用户,利用这些用户进行迁移。但是出现问题了,竟然会报:Role names starting with “pg_” are reserved。也就是说GPDB7以”pg_”开头的用户是预留用户,不给用户创建使用

1、现象

代码语言:javascript复制
postgres=# create role pg_h1 with login encrypted password ‘test123!XE’;
psql: ERROR: role name “pg_h1” is reserved
DETAIL: Role names starting with “pg_” are reserved.

2、分析

1)先从代码中定位该报错信息位于哪里,是什么地方对其进行的限制

代码语言:javascript复制
CreateRole:创建角色的入口函数
  if (IsReservedName(stmt->role))
    ereport(ERROR,
        (errcode(ERRCODE_RESERVED_NAME),
         errmsg("role name "%s" is reserved",
            stmt->role),
         errdetail("Role names starting with "pg_" are reserved.")));

2)可以看到创建角色时CreateRole调用的IsReservedName函数对此进行了检测,若返回true,则会报错。我们接着看下函数IsReservedName

3)IsReservedName确实是对name字符串前缀进行了检测

4)GPDB6中可以创建着用的用户,GPDB7中却不行了,什么原因导致在GPDB7中增加了限制呢?我们接着追溯GPDB6和GPDB7的代码,观察是哪个版本引入该代码

5)GPDB6是基于PG9.4而GPDB7基于PG12.12,先观察下PG12.12、PG9.4中该限制情况。经比对,在PG12.12中有该限制,而在PG9.4中没有。这就比较明显了,是PG版本的更迭引入的,而非GPDB。这就比较方便了,我们可以查看PG代码的commit

6)commit如下:

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=293007898d3fa5a815c1c5814df53627553f114d

Reserve the "pg_" namespace for roles

This will prevent users from creating roles which begin with "pg_" and

will check for those roles before allowing an upgrade using pg_upgrade.

This will allow for default roles to be provided at initdb time.

也就是说在initdb初始化时会用到默认的角色,该角色名有以pg_开头的,所以作为预留,不给用户使用了。

邮件链表讨论:

https://www.postgresql.org/message-id/20160301030233.GA3127@tamriel.snowman.net

3、总结

GPDB7中预留“pg_”开头的角色名不给用户使用。但是GPDB6中是可以的。业务若在GPDB6中使用大量以”pg_”开头的角色,那么将给升级到GPDB7带来麻烦!

0 人点赞