Important
跨引擎 ABAC 处于 Beta 阶段。
外部引擎可以使用强制实施的 基于属性的访问控制(ABAC) 策略读取 Unity 目录表。 这允许应用动态强制实施的 ABAC 行筛选器和列掩码,即使从外部Azure Databricks进行查询也是如此。
当外部引擎查询应用了 ABAC 策略的表时,Azure Databricks 会使用专用的无服务器计算层对数据进行筛选,并将净化后的数据返回给外部引擎。
Requirements
若要对从外部引擎查询的表强制实施精细访问控制,必须完成以下操作:
- 在 Unity Catalog 元存储上启用外部数据访问。
- 向查询主体
EXTERNAL USE SCHEMA授予权限。 - 将 托管表 与 目录提交操作一起使用。
- 使用 OAuth 机器到机器 (M2M) 或 个人访问令牌 (PAT) 进行身份验证。
创建包含目录提交的托管 Delta 表
若要使用目录提交功能创建新的托管 Delta 表(需要 Databricks Runtime 16.4 及以上版本):
CREATE TABLE <catalog>.<schema>.<table> (id INT, name STRING)
TBLPROPERTIES ('delta.feature.catalogManaged' = 'supported') USING delta;
若要升级现有托管表(需要 Databricks Runtime 18.0 及更高版本):
ALTER TABLE <catalog>.<schema>.<table>
SET TBLPROPERTIES ('delta.feature.catalogManaged' = 'supported');
创建表后,可以应用 ABAC 策略、行筛选器或列掩码。
请参阅 “创建策略 ”或 “手动应用行筛选器”和“列掩码”。
使用 Apache Spark(Delta)读取表数据
使用 Delta-Spark 4.1 或更高版本 和 Unity 目录 Spark 连接器 0.4 或更高版本配置 Apache Spark。
"spark.sql.extensions": "io.delta.sql.DeltaSparkSessionExtension",
"spark.sql.catalog.spark_catalog": "io.unitycatalog.spark.UCSingleCatalog",
"spark.sql.catalog.<uc-catalog-name>": "io.unitycatalog.spark.UCSingleCatalog",
"spark.sql.catalog.<uc-catalog-name>.uri": "<workspace-url>",
"spark.sql.catalog.<uc-catalog-name>.auth.type": "oauth",
"spark.sql.catalog.<uc-catalog-name>.auth.oauth.uri": "<oauth-token-endpoint>",
"spark.sql.catalog.<uc-catalog-name>.auth.oauth.clientId": "<oauth-client-id>",
"spark.sql.catalog.<uc-catalog-name>.auth.oauth.clientSecret": "<oauth-client-secret>",
"spark.sql.catalog.<uc-catalog-name>.ServerSidePlanning.enabled": "true",
"spark.sql.defaultCatalog": "<uc-catalog-name>",
"spark.jars.packages": "io.delta:delta-spark_4.0_2.13:4.1.0,io.delta:delta-iceberg_2.13:4.1.0,io.unitycatalog:unitycatalog-spark_2.13:0.4.0,org.apache.hadoop:hadoop-azure:3.4.2"
注释
将 ServerSidePlanning.enabled 设置为 true,以启用由外部引擎执行的细粒度访问控制。
替换以下变量:
-
<uc-catalog-name>:Unity Catalog 中包含你的表的目录名称。 -
<workspace-url>:Azure Databricks 工作区 URL,包括工作区 ID。 -
<oauth-token-endpoint>:OAuth 令牌终结点 URL。 请参阅 使用 OAuth 授权服务主体访问 Azure Databricks。 -
<oauth-client-id>:身份验证主体的 OAuth 客户端 ID。 -
<oauth-client-secret>:身份验证主体的 OAuth 客户端密码。
使用 Apache Spark(Iceberg)读取表
使用 Iceberg-Spark 1.11 或更高版本 和 Apache Spark 4.0 或更高版本配置 Apache Spark。
"spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions",
"spark.sql.catalog.<uc-catalog-name>": "org.apache.iceberg.spark.SparkCatalog",
"spark.sql.catalog.<uc-catalog-name>.type": "rest",
"spark.sql.catalog.<uc-catalog-name>.uri": "<workspace-url>/api/2.1/unity-catalog/iceberg-rest/",
"spark.sql.catalog.<uc-catalog-name>.credential": "<oauth-client-id>:<oauth-client-secret>",
"spark.sql.catalog.<uc-catalog-name>.oauth2-server-uri": "<oauth-token-endpoint>",
"spark.sql.catalog.<uc-catalog-name>.warehouse": "<uc-catalog-name>",
"spark.sql.catalog.<uc-catalog-name>.cache-enabled": "false",
"spark.sql.defaultCatalog": "<uc-catalog-name>"
替换以下变量:
-
<uc-catalog-name>:Unity Catalog 中包含你的表的目录名称。 -
<workspace-url>:Azure Databricks 工作区 URL,包括工作区 ID。 -
<oauth-token-endpoint>:OAuth 令牌终结点 URL。 请参阅 使用 OAuth 授权服务主体访问 Azure Databricks。 -
<oauth-client-id>:身份验证主体的 OAuth 客户端 ID。 -
<oauth-client-secret>:身份验证主体的 OAuth 客户端密码。
查询数据
可以使用 Apache Spark SQL 或 DataFrame API 查询表。 Azure Databricks在后台强制实施精细访问策略。
SELECT * FROM <uc-catalog-name>.<schema>.<table>;
Warning
在查询规划期间,并发写入可能导致在自连接查询和多次扫描查询中,同一张表从不同的表快照中被读取,从而可能导致结果不正确。
无服务器计算成本
跨引擎 ABAC 使用无服务器计算资源在服务器端执行细粒度访问策略。 客户需要为这些资源付费。 有关定价信息,请参阅 Beta 产品定价。
有权访问计费系统表的用户可以查询 system.billing.usage 以查看已收取的费用。 例如,以下查询按用户细分计算成本:
SELECT usage_date,
sku_name,
identity_metadata.run_as,
SUM(usage_quantity) AS `DBUs consumed by cross-engine ABAC`
FROM system.billing.usage
WHERE usage_date BETWEEN '2026-06-01' AND '2026-07-01'
AND billing_origin_product = 'EXTERNAL_COMPATIBILITY'
GROUP BY 1, 2, 3 ORDER BY 1;
局限性
- 仅当强制实施精细访问控制(FGAC)时,外部引擎才支持读取。 若要进行写入,必须将写入主体排除在 ABAC 策略之外。
- 不支持动态视图。
- 不支持对
VARIANT列进行投影。 - 不支持对
BINARY列进行筛选。 - 不支持其返回类型不同于原始列类型的列掩码函数。
- 大型聚合可能会遇到性能下降的情况。