pg_read_all_data 和 pg_write_all_data
pg_read_all_data 和 pg_write_all_data
目录
在 PostgreSQL 中,pg_read_all_data 和 pg_write_all_data 是 从 v14 起引入的预定义角色,用于简化大规模数据库中权限管理的复杂性。以下是它们的核心区别和使用场景:
✅ pg_read_all_data 角色
| 权限范围 | 说明 |
|---|---|
| 读取权限 | 对所有表、视图、序列拥有 SELECT 权限 |
| 模式权限 | 对所有 schema 拥有 USAGE 权限 |
| 是否跨库 | ✅ 是,全实例级别(所有数据库) |
| 适用场景 | 报表、监控系统、只读账号 |
| 注意事项 | 不具备 BYPASSRLS 权限,若启用 RLS,需额外设置 |
✅ pg_write_all_data 角色
| 权限范围 | 说明 |
| -------- | ------------------------------------------ |
| **写入权限** | 对所有表、视图、序列拥有 `INSERT`、`UPDATE`、`DELETE` 权限 |
| **模式权限** | 对所有 schema 拥有 `USAGE` 权限 |
| **是否跨库** | ✅ 是,**全实例级别** |
| **适用场景** | ETL 工具、批量写操作账号 |
| **注意事项** | 不具备 `BYPASSRLS` 权限,若启用 RLS,需额外设置 |
示例:
CREATE USER app_user_write WITH PASSWORD 'app_user_write';
GRANT pg_write_all_data to app_user_write;
CREATE USER app_user_read WITH PASSWORD 'app_user_read';
GRANT pg_read_all_datato app_user_read;
⚠️ 使用注意
不适用于对象所有者变更后的权限继承
这两个角色是全局权限,不会因对象所有者不同而失效,但也不会自动拥有 DDL 权限(如 CREATE TABLE)。
不能与 ALTER DEFAULT PRIVILEGES 混用
ALTER DEFAULT PRIVILEGES 是基于对象创建者设置的,而这两个角色是全局授权,优先级更高。
RLS(行级安全策略)用户需额外处理
如果数据库启用了 RLS,默认这两个角色不会绕过策略,需手动:
ALTER ROLE some_user SET row_security = off;
总结:
| 角色名 | 权限范围 | 是否跨库 | 典型用途 |
|---|---|---|---|
pg_read_all_data |
所有表/视图/序列的 SELECT + USAGE | ✅ | 只读账号、监控 |
pg_write_all_data |
所有表/视图/序列的 INSERT/UPDATE/DELETE | ✅ | ETL、批量写入账号 |
如需更细粒度控制(如仅限某个 schema),请使用 GRANT ... ON ALL TABLES IN SCHEMA ... 结合 ALTER DEFAULT PRIVILEGES。

浙公网安备 33010602011771号