GPDB7

编程入门 行业动态 更新时间:2024-10-09 16:27:04

GPDB7

GPDB7

GPDB7-新特性-角色创建

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

1、现象

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)先从代码中定位该报错信息位于哪里,是什么地方对其进行的限制

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如下:

/?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_开头的,所以作为预留,不给用户使用了。

邮件链表讨论:

.GA3127%40tamriel.snowman

3、总结

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

更多推荐

GPDB7

本文发布于:2023-12-03 11:46:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1654993.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!