如何在不修改访问权限的前提下隐藏PostgreSQL分区子表?
PostgreSQL pg_partman分区子表隐藏方案
针对pg_partman生成的大量分区子表干扰数据库客户端导航的需求,可在不修改子表访问权限的前提下,通过以下几种方案实现隐藏:
方案1:客户端配置过滤规则(优先推荐)
该方案无需调整数据库侧任何配置,无业务影响,仅需使用客户端的用户自行配置表过滤规则即可:
- DBeaver操作步骤:
- 在导航器面板右键点击子表所属的schema,依次选择「过滤器」→「配置过滤器」
- 新增排除规则,匹配pg_partman默认的子表命名格式
父表名_p_时间后缀,可使用通配符*_p_*或者指定3张父表的子表前缀(如父表为log则配置log_p_*) - 勾选「排除匹配项」保存后,导航器会自动隐藏所有符合规则的子表,直接访问父表或子表全路径的读写操作均不受影响
- SQuirreL操作步骤:
- 在Objects面板右键点击子表所属schema,选择「Filter Objects」
- 添加和pg_partman子表命名规则匹配的通配符排除规则,保存后即可生效
方案2:服务端拆分schema统一管控(适合全局生效场景)
如果需要对所有业务用户统一隐藏子表,无需每个人单独配置,可以通过拆分父表、子表的存储schema实现:
- 新建专门存储分区子表的schema,授予业务用户对应访问权限:
-- 创建子表专属schema CREATE SCHEMA partman_partitions; -- 给业务角色授予schema的usage权限,保证子表可正常访问 GRANT USAGE ON SCHEMA partman_partitions TO app_user;
- 修改pg_partman对应3张父表的分区配置,指定新生成的子表都存储在
partman_partitionsschema下,已生成的历史子表也可以直接迁移到该schema - 修改业务用户的默认搜索路径,排除子表专属schema:
ALTER ROLE app_user SET search_path = app_schema, public;
该方案下,客户端默认只会加载search_path内包含的schema的表,子表不会出现在导航列表中,用户需要直接访问子表时,只要写全路径partman_partitions.子表名即可正常读写,权限不受任何影响。
方案3:服务端配置系统表过滤规则
PostgreSQL 10及以上版本中,所有分区子表的系统表pg_class中relispartition属性默认为true,主流JDBC客户端默认会识别该属性,你可以给业务用户配置参数过滤分区子表:
ALTER ROLE app_user SET pg_class.relispartition = false;
注意:该操作需要超级用户权限,仅修改过滤规则,不影响任何子表的访问权限。
内容的提问来源于stack exchange,提问作者Mohamed BOUAKKAZ
相关产品推荐
相关产品推荐

