如何让外部应用通过JDBC访问Databricks并遵循Unity Catalog权限?
解决Databricks Unity Catalog JDBC连接权限不生效问题
核心问题分析
当前JDBC连接未正确关联Unity Catalog(UC)的权限模型,要么 fallback到了旧的Hive Metastore,要么使用了未绑定UC的SQL端点,导致UC的细粒度权限控制未生效。
具体解决方案
替换连接串中的数据库为UC的目录.数据库
原连接串里的default属于Hive Metastore,不受UC权限管控。需要将其替换为Unity Catalog中的目录名.数据库名格式,比如my_catalog.my_db。使用绑定Unity Catalog的SQL Warehouse的HTTP路径
确保JDBC连接使用的是已启用Unity Catalog的SQL Warehouse的HTTP路径,而非经典SQL端点路径。正确的HTTP路径格式为sql/1.0/warehouses/<warehouse-id>,可在Databricks控制台的SQL Warehouse页面复制该路径,替换原连接串中的httpPath值。添加UC目录指定参数(可选但推荐)
在连接串中追加catalog=<你的UC目录名>参数,强制连接默认使用指定的UC目录,避免意外切换到Hive Metastore。验证令牌身份的UC权限
- 在Databricks SQL中执行以下语句,确认目标用户/服务主体对目标表仅拥有SELECT权限:
SHOW GRANTS ON TABLE <catalog>.<db>.<table> TO `<user-or-spn>`; - 确保该身份不是Workspace Admin,因为Workspace Admin权限会绕过Unity Catalog的细粒度权限控制。
- 在Databricks SQL中执行以下语句,确认目标用户/服务主体对目标表仅拥有SELECT权限:
示例修正后的JDBC连接串
jdbc:databricks://adb-xxxxxxxxxxxxx.8.azuredatabricks.net:443/my_catalog.my_db;transportMode=http;ssl=1;httpPath=sql/1.0/warehouses/xxxxxxxxxxxx;AuthMech=3;UID=token;PWD=<personal-access-token>;catalog=my_catalog
验证权限生效
连接成功后,在DBeaver中执行以下操作确认:
- 执行
SELECT current_catalog(), current_database();,确认返回的是你指定的UC目录和数据库。 - 尝试执行修改类语句(如
UPDATE、INSERT),此时应收到权限拒绝的错误提示,说明UC权限已生效。
内容的提问来源于stack exchange,提问作者Exc
相关产品推荐
相关产品推荐

