Navicat 15查不到字段级权限的根源是其元数据查询未适配PostgreSQL系统目录pg_attribute和pg_class的attacl字段,仅查询表级权限视图,故“Privileges”面板始终为空;该限制在Navicat 16.2+才修复。
Navicat 15查不到字段级权限(如SELECT/INSERT on column)的根源
postgresql 的字段级权限(column privileges)不通过 information_schema.role_column_grants 全量暴露,而是藏在系统目录 pg_attribute 和 pg_class 的 attacl 字段里,需解析 acl 数组。navicat 15 的元数据查询逻辑未适配这套机制,它只查了表级权限视图,直接跳过字段粒度——所以“权限”标签页里永远空着,不是你漏授,是它压根没问。
手动验证字段权限是否存在(绕过Navicat)
用 psql 或 Navicat 自带 SQL 窗口执行以下语句,确认权限是否真实存在:
SELECT
a.attname AS column_name,
has_column_privilege('users', a.attname, 'SELECT') AS can_select,
has_column_privilege('users', a.attname, 'INSERT') AS can_insert
FROM pg_attribute a
JOIN pg_class c ON a.attrelid = c.oid
WHERE c.relname = 'users' AND a.attnum > 0 AND NOT a.attisdropped;
如果返回 true 但 Navicat 不显示,就坐实是客户端兼容问题,不是数据库配置错。
Navicat 15对PostgreSQL字段权限的支持上限
- 仅支持表级权限展示(
GRANT SELECT ON TABLE users TO myuser),字段级(GRANT SELECT (email) ON TABLE users TO myuser)完全不可见 - 不解析
attacl字段里的 ACL 字符串,也不调用has_column_privilege()函数做动态检查 - 即使你执行了
GRANT UPDATE (status) ON users TO myuser,Navicat 15 的“Privileges”面板仍显示 “No privileges” - 该限制在 Navicat 16.2+ 才被修复,底层改用了更完整的权限元数据查询路径
临时 workaround:用SQL代替GUI管理字段权限
别依赖 Navicat 的图形化权限编辑器,直接写 SQL 授予和回收:
- 授予字段 SELECT 权限:
GRANT SELECT (id, name) ON TABLE users TO myuser; - 回收字段 INSERT 权限:
REVOKE INSERT (email) ON TABLE users FROM myuser; - 查看某用户对某字段的实际权限:
SELECT has_column_privilege('myuser', 'users', 'email', 'SELECT');
字段权限本身生效完全正常,只是 Navicat 15 的 UI 层看不见——这点最容易被误判为“授权失败”,其实只要 SQL 能跑通、应用能读写对应字段,就说明权限已落地。


















