You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中如何将用户访问权限隔离至单一Schema

问题:限制PostgreSQL用户仅访问指定Schema并隐藏其他元数据

我不是DBA,目标是让用户username仅能访问PostgreSQL 15.3[psql(15.3 (Debian 15.3-0+deb12u1), server 15.4)]中的user_schema下的表和视图,完全无法看到其他Schema的存在——包括自动补全提示、元命令(如\dn、\dt)的输出。

我已执行以下操作:

CREATE ROLE username LOGIN PASSWORD 'user_passwd';
CREATE SCHEMA user_schema;
ALTER USER username SET search_path = user_schema;  -- 设置搜索路径为用户专属Schema
GRANT USAGE ON SCHEMA olga TO username;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA user_schema TO username;
REVOKE SELECT ON ALL TABLES IN SCHEMA other_schema FROM username;

连接数据库后,确认搜索路径正确,也能正常访问user_schema的内容,但存在不符合预期的情况:

  • 输入other_schema.后按Tab会出现自动补全提示(实际访问该Schema下的表会报错权限不足)
  • 执行\dn能看到所有Schema,而我只希望显示user_schema

解决方案

核心原因

PostgreSQL默认允许所有用户查看pg_namespace系统表中的Schema信息,这是\dn和自动补全能显示其他Schema的根源。要彻底隐藏,需限制用户对系统元数据的访问权限。

具体操作步骤

1. 清理用户对非目标Schema的权限

确保用户没有其他Schema的任何权限:

-- 撤销对other_schema的所有权限
REVOKE ALL ON SCHEMA other_schema FROM username;
-- 撤销对public schema的默认权限(若无需访问public可执行)
REVOKE ALL ON SCHEMA public FROM username;
-- 若之前误授权olga schema,一并撤销
REVOKE ALL ON SCHEMA olga FROM username;

2. 限制用户对系统元数据的访问

修改pg_namespace表的权限,让用户仅能看到user_schema:

-- 撤销用户对pg_namespace的默认查询权限
REVOKE SELECT ON pg_namespace FROM username;
-- 仅授予用户查看user_schema的权限
GRANT SELECT ON pg_namespace TO username WHERE nspname = 'user_schema';

3. 确保未来新表的权限继承

若后续会在user_schema中创建新表,设置默认权限避免手动重复授权:

ALTER DEFAULT PRIVILEGES IN SCHEMA user_schema GRANT ALL PRIVILEGES ON TABLES TO username;

验证效果

重新用username登录数据库:

  • 执行\dn仅会显示user_schema
  • 输入SELECT * FROM 后按Tab,仅会补全user_schema下的表和视图
  • 尝试输入other_schema.不会出现自动补全提示,直接访问会报错权限不足

内容的提问来源于stack exchange,提问作者Índio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:43:18