postgres创建只读用户

PostgreSQL 给用户授予只读权限,推荐创建一个只读角色(role),再授权给用户。不要直接给用户逐个授权,方便后续管理


方案1:给已有用户授予指定数据库只读权限(推荐)

假设:

  • 数据库:mydb
  • 用户:readonly_user
  • schema:public

登录 PostgreSQL:

复制代码
psql -U postgres -d mydb

1. 创建只读角色

复制代码
CREATE ROLE readonly_role;

2. 授权连接数据库

复制代码
GRANT CONNECT ON DATABASE mydb TO readonly_role;

3. 授权 schema 访问

复制代码
GRANT USAGE ON SCHEMA public TO readonly_role;

4. 授权已有表只读

复制代码
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_role;

5. 授权未来创建的表自动只读

非常重要:

复制代码
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO readonly_role;

6. 把角色授权给用户

复制代码
GRANT readonly_role TO readonly_user;

完成


验证权限

切换用户:

复制代码
psql -U readonly_user -d mydb

测试查询:

复制代码
SELECT * FROM users LIMIT 10;

应该成功

测试写入:

复制代码
CREATE TABLE test(id int);

应该失败:

复制代码
ERROR: permission denied for schema public

方案2:所有数据库所有 schema 只读

适合:

  • BI平台
  • 数据分析账号
  • Grafana
  • Superset
  • 数据同步

进入 postgres:

复制代码
psql -U postgres

执行:

复制代码
GRANT CONNECT ON DATABASE mydb TO readonly_user;

进入数据库:

复制代码
\c mydb

执行:

复制代码
GRANT USAGE ON SCHEMA public TO readonly_user;

GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;

ALTER DEFAULT PRIVILEGES
GRANT SELECT ON TABLES TO readonly_user;

方案3:PostgreSQL 14/15/16 推荐写法

创建专用只读账号:

复制代码
CREATE USER report_user
WITH PASSWORD 'StrongPassword';

创建角色:

复制代码
CREATE ROLE pg_readonly;

授权:

复制代码
GRANT CONNECT ON DATABASE mydb TO pg_readonly;

\c mydb

GRANT USAGE ON SCHEMA public TO pg_readonly;

GRANT SELECT ON ALL TABLES IN SCHEMA public TO pg_readonly;

GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO pg_readonly;

ALTER DEFAULT PRIVILEGES
IN SCHEMA public
GRANT SELECT ON TABLES TO pg_readonly;

绑定:

复制代码
GRANT pg_readonly TO report_user;

如果有多个 schema

例如:

复制代码
\dn

看到:

复制代码
public
sales
finance

执行:

复制代码
GRANT USAGE ON SCHEMA sales, finance TO readonly_role;

GRANT SELECT ON ALL TABLES IN SCHEMA sales, finance TO readonly_role;

如果使用 RDS / 云数据库

通常还需要:

复制代码
GRANT pg_read_all_data TO readonly_user;

PostgreSQL 14+ 内置只读角色:

复制代码
pg_read_all_data

使用:

复制代码
GRANT pg_read_all_data TO readonly_user;

它包含:

  • 所有表 SELECT
  • 所有 sequence SELECT
  • 所有 schema USAGE

但是:

不包含:

  • CONNECT

所以建议:

复制代码
GRANT CONNECT ON DATABASE mydb TO readonly_user;

GRANT pg_read_all_data TO readonly_user;

查看用户权限

查看用户:

复制代码
\du

查看表权限:

复制代码
\dp

查看角色继承:

复制代码
SELECT 
  member.rolname,
  role.rolname
FROM pg_auth_members
JOIN pg_roles member 
ON member.oid=member
JOIN pg_roles role
ON role.oid=roleid;

生产环境推荐(你的 PostgreSQL / 企业平台场景)

建议统一:

复制代码
postgres
   |
   +-- pg_dba
   |
   +-- pg_rw_role
   |
   +-- pg_readonly_role
            |
            +-- grafana_user
            +-- bi_user
            +-- report_user

不要直接:

复制代码
GRANT SELECT ON ALL TABLES TO user;

后期表扩展会不好维护

相关推荐
IvorySQL5 小时前
PostgreSQL 日报|8 字节 TOAST 值支持(9 月 16 日)
数据库·人工智能·postgresql
IvorySQL6 小时前
AI 时代,PostgreSQL 正在发生什么变化?
数据库·人工智能·postgresql
风哥2号7 小时前
数据库教程FGMT50‑PostgreSQL体系结构深入与源码解析
数据库·postgresql
风哥2号10 小时前
数据库教程FGMT52‑PostgreSQL用户权限与安全管理
数据库·postgresql
IvorySQL1 天前
PostgreSQL 日报|大模型破解在线校验和(9 月 15 日)
数据库·人工智能·postgresql
IvorySQL2 天前
当PostgreSQL“听懂”MySQL——协议兼容层的设计与实战
数据库·人工智能·postgresql
IvorySQL2 天前
PostgreSQL 日报|建库策略致备库静默丢数据(9 月 12 日)
数据库·人工智能·postgresql
瀚高PG实验室2 天前
瀚高数据库如何克隆表
数据库·sql·postgresql·瀚高数据库
承渊政道3 天前
PostgreSQL 鸿蒙 PC 适配全记录:从原生交叉编译到 HNP 数据库服务闭环
数据库·postgresql·harmonyos·鸿蒙系统·pc端