复制数据库的权限被拒绝
Permission denied to copy database
我还在习惯 Postgres 中的角色概念。
我正在尝试创建一个角色,migrator
,它将能够从生产数据库中读取并将其用作创建阶段和开发数据库的模板。
我创建了这个角色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 权限的角色也能够复制数据库?我查看了角色继承,但乍一看 inheriting 角色似乎只会获得与父角色相同的权限。
除非登录角色是所有者或the database is flagged as a template:
,否则无法复制数据库
datistemplate can be set to indicate that a database is intended as a template for CREATE DATABASE. If this flag is set, the database can be cloned by any user with CREATEDB privileges; if it is not set, only superusers and the owner of the database can clone it.
我还在习惯 Postgres 中的角色概念。
我正在尝试创建一个角色,migrator
,它将能够从生产数据库中读取并将其用作创建阶段和开发数据库的模板。
我创建了这个角色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 权限的角色也能够复制数据库?我查看了角色继承,但乍一看 inheriting 角色似乎只会获得与父角色相同的权限。
除非登录角色是所有者或the database is flagged as a template:
,否则无法复制数据库datistemplate can be set to indicate that a database is intended as a template for CREATE DATABASE. If this flag is set, the database can be cloned by any user with CREATEDB privileges; if it is not set, only superusers and the owner of the database can clone it.