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。

posted @ 2026-05-12 16:09  数据库小白(专注)  阅读(30)  评论(0)    收藏  举报