PostgreSQL中Hibernate生成的序列不在information_schema和pgAdmin显示如何处理
问题根因
你遇到的是PostgreSQL序列的权限和搜索路径匹配问题:
information_schema.sequences视图只会返回当前登录用户拥有访问权限、且所属模式在当前search_path范围内的序列,pgAdmin默认基于这个视图拉取序列展示列表- 直接查询
pg_class系统表能返回所有你有可见权限的数据库对象,所以能查到实际存在的序列
修复步骤
- 先查询确认序列的所属模式、所有者信息,排除系统内置序列干扰:
SELECT n.nspname AS schema_name, c.relname AS sequence_name, pg_get_userbyid(c.relowner) AS owner FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind = 'S' AND c.relname NOT LIKE 'pg_%' ORDER BY c.relname;
- 修复序列权限(二选一即可):
- 给登录pgAdmin的用户授予序列的访问权限:
-- 单条序列授权 GRANT USAGE, SELECT ON SEQUENCE <替换为schema名>.<替换为序列名> TO <替换为pgAdmin登录用户名>; -- 批量授权指定schema下所有序列 GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA <替换为schema名> TO <替换为pgAdmin登录用户名>;
- 若序列所有者异常,直接修改序列所有者为你登录使用的用户:
ALTER SEQUENCE <替换为schema名>.<替换为序列名> OWNER TO <替换为目标用户名>;
- 调整搜索路径(如果序列不在默认的public schema下需要执行):
-- 永久对指定用户生效 ALTER ROLE <替换为pgAdmin登录用户名> SET search_path TO public,<替换为序列所属的schema名>;
- 右键点击pgAdmin左侧的对应数据库,选择「刷新」,序列即可正常显示。
避坑提示
如果后续再做PostgreSQL数据库迁移,使用pg_dump导出时添加--privileges参数,会自动导出所有对象的权限配置,避免再次出现同类权限缺失问题。
内容的提问来源于stack exchange,提问作者Shehan Simen
相关产品推荐
相关产品推荐

