我仍然习惯于Postgres中的角色概念。
我正在尝试创建一个角色migrator
,该角色能够从生产数据库中读取并将其用作模板来创建stage和dev数据库。
我最初创建了这个角色migrator
:
CREATE ROLE migrator LOGIN ENCRYPTED PASSWORD '<password>'
并继续限制对prod数据库的访问:
REVOKE ALL ON DATABASE prod FROM PUBLIC;
GRANT CONNECT ON DATABASE prod TO migrator;
/* switch to prod database */
GRANT USAGE ON SCHEMA public TO migrator;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO migrator;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO migrator;
尝试CREATE DATABASE stage TEMPLATE prod;
并收到错误后,我不得不改变角色来创建数据库:
ALTER ROLE migrator CREATEDB;
再次尝试。这次我得到了错误:
ERROR: permission denied to copy database "prod"
同样,我尝试将复制权限添加到迁移器角色(不确定这是否正确,因为手册说这是一个非常高级的权限)
ALTER ROLE migrator REPLICATION;
然而,我仍然得到同样的错误。
更新:我发现这与拥有数据库的人有关;但是,我的问题仍然存在。如何只允许具有READ权限的其他角色复制数据库?我查看了角色继承,但乍一看,继承角色看起来只会获得与父角色相同的权限。
答案 0 :(得分:2)
除非登录角色是所有者或the database is flagged as a template,否则无法复制数据库:
可以设置datistemplate以指示数据库是否用作CREATE DATABASE的模板。如果设置了此标志,则具有CREATEDB权限的任何用户都可以克隆数据库;如果没有设置,只有超级用户和数据库的所有者才能克隆它。