我对 postgres 权限相当陌生。我正在使用 postgres 服务器来添加/删除数据库,作为工作流程的一部分。每个数据库都需要有一个与其关联的角色,该角色可以执行该数据库内的所有操作,但不能执行数据库之外的任何操作。到目前为止,我已经成功地创建了一个数据库和一个角色,并为该角色(我认为是)提供了正确的权限。这似乎运作良好。
这是工作流程:
- 创建数据库A
- 创建角色A并限制其对数据库A的权限
- 创建数据库B
- 创建角色B并限制其对数据库B的权限
然而,在我创建数据库 B 的步骤中,角色 A 以某种方式获得了对数据库 B 的权限。这意味着当我稍后删除数据库 A 及其关联的角色 A 时,我会收到错误,因为角色 A 具有依赖于它的对象:
role "role A" cannot be dropped because some objects depend on it
Detail: 4 objects in database database B
在创建数据库 B 后查询该pg_catalog.pg_class
表,我可以看到角色 A 就在其中:
{postgres=arwdDxt/postgres,"\"role a\"=arwdDxt/postgres"}
任何想法出了什么问题,更重要的是如何预防它?
- - 编辑 - -
这是我运行来创建数据库和角色的 SQL:
CREATE ROLE roleA WITH LOGIN PASSWORD 'password' NOINHERIT;
ALTER DATABASE databaseA OWNER TO roleA;
REVOKE ALL PRIVILEGES ON SCHEMA public FROM roleA;
REVOKE ALL PRIVILEGES ON DATABASE databaseA FROM PUBLIC;
GRANT GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO roleA;
我尝试了其他权限的各种组合,但无法使其与我需要的权限一起使用。我尝试过不执行REVOKE
andGRANT
语句,但这也不起作用。
我终于弄清楚了这件事的真相。作为工作流程的一部分,我正在运行
pg_dump
创建数据库的备份,然后稍后恢复它。pg_dump
向角色 A 的备份文件中添加一条GRANT
命令,使其在恢复数据库 B 时获得对数据库 B 的权限。通过在创建备份时传递到
--no-acl
,pg_dump
它不再将 放在GRANT
那里并且问题得到解决。