PostgreSQL 中 schema 属主信息存储在 pg_namespace 系统表的 nspowner 字段,需结合 pg_get_userbyid(nspowner) 解析为用户名;DBeaver 不显示该字段因 JDBC getSchemas() 方法未返回 owner 列。

schema 属主信息藏在哪张系统表里?
DBeaver 本身不直接显示 schema 所有者(owner),它依赖数据库底层元数据返回结果。不同数据库的属主字段位置差异很大:pg_namespace(PostgreSQL)、sys.schemas(SQL Server)、INFORMATION_SCHEMA.SCHEMATA(MySQL 兼容层有限)——但 MySQL 实际上没有严格意义上的 schema owner 概念,它的 database owner 等价于创建该库的用户,且不可显式查询。
真正能稳定查出 owner 的,是 PostgreSQL 和 SQL Server:
- PostgreSQL:执行
SELECT nspname, pg_get_userbyid(nspowner) AS owner FROM pg_namespace WHERE nspname = 'public'; - SQL Server:执行
SELECT name AS schema_name, USER_NAME(principal_id) AS owner FROM sys.schemas WHERE name = 'sqltest';
为什么在 DBeaver 的 Database Navigator 里点不开 owner 字段?
因为 DBeaver 的左侧树形结构只展示对象层级(schemas → tables),并不渲染 owner 这类属性列。它调用的是 JDBC 的 getSchemas() 方法,该方法返回的 ResultSet 中不包含 owner 字段(JDBC 规范未定义此列)。所以你右键 schema → Properties,看到的“Owner”一栏通常是空的或显示为 UNKNOWN。
这不是 DBeaver 的 bug,而是 JDBC 驱动和数据库协议的限制。想确认 owner,必须手动查系统表。
用 DBeaver 执行 SQL 查 owner 时容易漏掉的关键点
常见错误是忽略当前连接上下文对 schema 解析的影响:
- 没
USE(SQL Server)或没SET search_path TO xxx(PostgreSQL),导致sys.schemas或pg_namespace查询结果为空或错乱 - 权限不足:普通用户查
pg_namespace.nspowner可能返回NULL,需pg_read_all_data或db_owner角色 - QuestDB / Doris / MaxCompute 等兼容层数据库:它们模拟了
pg_namespace,但 owner 字段可能固定返回postgres或public,实际无意义
快速验证 schema owner 的最小可行 SQL
别写复杂脚本,就一条命令解决:
PostgreSQL:SELECT nspname, pg_get_userbyid(nspowner) FROM pg_namespace WHERE nspname = current_schema();
SQL Server:SELECT s.name, u.name FROM sys.schemas s JOIN sys.database_principals u ON s.principal_id = u.principal_id WHERE s.name = SCHEMA_NAME();
注意:current_schema() 和 SCHEMA_NAME() 返回的是当前 session 默认 schema,不是你鼠标点中的那个节点——DBeaver 的 UI schema 切换和 SQL 执行上下文是分离的,这点最容易被忽略。











