• 发文
  • 评论
  • 微博
  • 空间
  • 微信

GPDB7-新特性-角色创建

yzsDBA 2023-10-26 14:50 发文

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

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%40tamriel.snowman.net

3、总结

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

声明:本文为OFweek维科号作者发布,不代表OFweek维科号立场。如有侵权或其他问题,请及时联系我们举报。
2
评论

评论

    相关阅读

    暂无数据

    yzsDBA

    专注于开源数据库原理与使用...

    举报文章问题

    ×
    • 营销广告
    • 重复、旧闻
    • 格式问题
    • 低俗
    • 标题夸张
    • 与事实不符
    • 疑似抄袭
    • 我有话要说
    确定 取消

    举报评论问题

    ×
    • 淫秽色情
    • 营销广告
    • 恶意攻击谩骂
    • 我要吐槽
    确定 取消

    用户登录×

    请输入用户名/手机/邮箱

    请输入密码