DBeaver的“模式权限”标签页仅用于只读查看,不执行授权;真正生效需手动运行GRANT USAGE、GRANT SELECT ON ALL TABLES及ALTER DEFAULT PRIVILEGES三条SQL,并用高权限账号执行后重连会话。

直接给用户开放某个 schema 的权限,不能只靠 DBeaver 界面点几下就生效——它只是图形外壳,底层必须执行正确的 SQL 授权语句,否则用户连 SELECT 都会报错。
为什么在 DBeaver 里点“模式权限”没用?
DBeaver 的【模式权限】标签页(比如 PostgreSQL 或达梦中)仅用于查看当前用户对 schema 的已有权限,不是授权入口。它不生成或执行 GRANT 命令,也不自动刷新权限缓存。你点保存 → 点执行,实际什么都没发给数据库。
- PostgreSQL 中,DBeaver 这个标签页读的是
pg_namespace和pg_authid视图,纯只读 - SQL Server 里它甚至不显示 schema-level 权限,只展示 user → schema 绑定关系
- 达梦、DWS 等国产库同理:界面不触发任何
GRANT USAGE ON SCHEMA
真正起作用的授权 SQL 是什么?
必须手动执行对应数据库语法的授权命令,且注意三类权限缺一不可:
-
GRANT USAGE ON SCHEMA <schema_name> TO <user_name></user_name></schema_name>—— 允许用户“看到”该 schema(否则SELECT * FROM schema.table直接报schema does not exist) -
GRANT SELECT ON ALL TABLES IN SCHEMA <schema_name> TO <user_name></user_name></schema_name>—— 授予当前已存在所有表的查询权 -
ALTER DEFAULT PRIVILEGES FOR ROLE <owner_role> IN SCHEMA <schema_name> GRANT SELECT ON TABLES TO <user_name></user_name></schema_name></owner_role>—— 让后续新建的表自动带权限(否则新表默认谁都查不了)
示例(PostgreSQL):
GRANT USAGE ON SCHEMA u1 TO u2; GRANT SELECT ON ALL TABLES IN SCHEMA u1 TO u2; ALTER DEFAULT PRIVILEGES FOR ROLE u1 IN SCHEMA u1 GRANT SELECT ON TABLES TO u2;
DBeaver 里怎么安全执行这些授权?
别用【用户】→【编辑】→【模式权限】这种误导性路径。正确做法是:
- 用高权限账号(如
dbadmin、postgres、dbo)连库,在 SQL 编辑器里粘贴并执行上述GRANT语句 - 执行后,**必须断开并重连目标用户会话**——PostgreSQL 不支持运行时刷新权限,MySQL 8.0+ 需要
FLUSH PRIVILEGES,但多数情况重连最稳 - 验证时不要只看 DBeaver 左侧树是否展开:右键 schema → “Get Object Privileges”,或直接跑
SELECT has_schema_privilege('u2', 'u1', 'USAGE')
最容易被忽略的一点:即使 USAGE 和 SELECT 都给了,如果 schema 所有者是 u1,而你用 ALTER DEFAULT PRIVILEGES 指定了 FOR ROLE u2,那这条语句根本不会生效——必须指定为 schema 的实际 owner 角色。


















