PostgreSQL 10:非超级用户能否为其他用户创建数据库并指定所有者?
解决PostgreSQL非超级用户指定数据库所有者的权限问题
问题核心
你需要让非超级用户starter具备创建数据库、用户,并将用户指定为对应数据库所有者的权限,但当前执行CREATE DATABASE newdatabase OWNER test;时触发报错:ERROR: must be member of role "test"。
原因分析
PostgreSQL的权限规则中,只有超级用户,或者拥有目标角色的ADMIN权限/是目标角色的成员,才能将数据库的所有权指定给该角色。你的starter用户虽有CREATEDB和CREATEROLE权限,但默认没有对test角色的管理权限,因此无法完成操作。
解决方案
根据test角色是否由starter创建,分两种情况处理:
情况1:test由starter创建
让starter在创建test角色时,给自己赋予对该角色的管理权限,执行以下SQL:
CREATE ROLE test LOGIN WITH ENCRYPTED PASSWORD 'test_password' WITH ADMIN OPTION;
加上WITH ADMIN OPTION后,starter作为test的管理员,即可正常执行CREATE DATABASE newdatabase OWNER test;。
情况2:test是已存在的角色
需要超级用户执行以下SQL,给starter授予对test角色的管理权限:
GRANT test TO starter WITH ADMIN OPTION;
执行后,starter就具备了将数据库所有权指定给test的权限。
权限边界说明
- 上述配置不会让
starter获得超级用户权限,依然无法删除他人创建的数据库(默认非超级用户仅能删除自己拥有的数据库)。 - 之前执行的
REVOKE语句已经限制了starter对publicschema下表的操作权限,无需调整。
内容的提问来源于stack exchange,提问作者Alberto B
相关产品推荐
相关产品推荐

