权限被拒绝复制数据库

时间:2017-08-18 23:12:58

标签: postgresql roles postgresql-9.5

我仍然习惯于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权限的其他角色复制数据库?我查看了角色继承,但乍一看,继承角色看起来只会获得与父角色相同的权限。

1 个答案:

答案 0 :(得分:2)

除非登录角色是所有者或the database is flagged as a template,否则无法复制数据库:

  可以设置

datistemplate以指示数据库是否用作CREATE DATABASE的模板。如果设置了此标志,则具有CREATEDB权限的任何用户都可以克隆数据库;如果没有设置,只有超级用户和数据库的所有者才能克隆它。