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中创建表或其它权限,他都可以直接赋权了。
上一篇:算法题——投篮比赛获胜概率问题


下一篇:Java编码问题解决方案大揭密