pgsql指定用户看到某个表

你的核心诉求

  1. 单独隔离密码:不希望把包含所有核心数据的管理员连接(postgres)交给外部或测试程序,而是想单独为某些库设置一套专属密码。
  2. 通配/批量权限:希望该用户(demo)只能访问以特定前缀(如 demo_)命名的数据库,且无法触碰主库或系统库。
  3. 基于已有库克隆:新库的内容往往来自已有的生产库或模板库。
  4. 最小权限原则:不希望给 demo 过高的权限(如全局创建新数据库的特权)。

踩坑复盘(为什么 PG 感觉繁琐)

  • 通配符不支持:PostgreSQL 无法像 MySQL 一样直接一条 GRANT ... ON demo_%,权限必须按库、按表显式授权。
  • 所有权割裂问题:如果用管理员账号克隆/传输数据到新库,库里的表所有权依然属于管理员,导致 demo 连进去后报 42501 permission denied
  • 特权受限:直接给普通用户提权建库又违背了权限隔离的初衷。

最终最佳实践方案(一劳永逸版)

只要遵循 “管理员建空壳,demo 自己搬家具” 的原则,后续再做类似的库克隆,只需两分钟且不需要背任何赋权 SQL:

第一步:创建受限用户(仅需一次)
用管理员执行,创建一个只用于特定业务的普通账号:

CREATE USER demo WITH PASSWORD '你的强密码';

第二步:管理员建空库并直接指定归属
每次需要基于老库给 demo 派生新库时,管理员仅负责建一个空库,把产权直接写成 demo

CREATE DATABASE demo_blog OWNER demo;

(这样 demo 依然没有全局建库权限,安全可控。)

第三步:以 demo 的身份导入数据
在 Navicat 中使用 阿里云-demo用户 连接这个新库 demo_blog,执行数据传输或运行建表迁移脚本:

  • 因为数据是 demo 亲自导入的,库内所有表、视图、序列天然归 demo 所有。
  • 后端程序使用 demo 账号连接,查表、增删改查畅通无阻,彻底告别权限报错。
posted @ 2026-09-05 17:04  丁少华  阅读(5)  评论(0)    收藏  举报