开发者社区> 问答> 正文

RDS for PostgreSQL无法建只读用户的问题讨论

在阿里云RDS中的PostgreSQL数据库中,超级用户是没有给到最终用户的,而是给了一个比较大权限的用户,这个用户可以创建数据库,可以创建用户,在通常情况下都是够用的。最近业务方给我提了一个需求,需要建一个只读用户,这个只读用户不能有DDL的权限。目前发现在阿里云RDS提供的PostgreSQL数据库中,无法满足此需要,原因是,任何用户都能创建表,无法禁止用户创建表的权限,更深层次的原因为:


1. 原因是模板数据库template1中的有一个名称为“public”的schema,这个“public”的schema的属主是超级用户,而这个超级用户阿里云没有给到最终用户。而用户自己创建出来的数据库都是从template1拷贝的,所以用户创建出来的数据库中也有一个名称为“public”的schema,而这个“public”的schema的属主仍然是原先的超级用户,而任何人都有在这个“public”的schema中创建表的权限,而因为我们这些RDS使用用户没有超级用户的权限,所以无法用“revoke create on schema public from public”的方法取消任何用户在此schema建表的权限。而又因为这个“public”的schema的属主是超级用户,我们也无法删除掉这个schema。


目前我们自己是无法解决此问题,只能由阿里云来解决,解决的建议方法如下:


1. 建议阿里云默认创建出来的实例把在schema “public”中创建表的权限回收。
2.  再创建一个的模板数据,如名称为template2,)然把这个模板数据库中的public schema删除掉。
   create database template2;
  UPDATE pg_database SET datistemplate='true' WHERE datname='template2';
  drop schema public;
  这样用户可以从template2复制出一个数据库:
  create database userdb01 template template2;
这样建出来的数据库userdb01中是没有“public”这个schema的,用户如果想使用“public”这个schema,可以自己建,因为是用户自己建的“public”的这个schema,这个“public”的属主是用户自己,而不是阿里云的超级用户,这样用户想让谁能在这个“public”的schema中创建表或其它权限,他都可以直接赋权了。

展开
收起
yxdev 2016-11-11 18:55:08 3329 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像