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带来麻烦!