创建动态试图
在 Unity Catalog 中,可以使用动态视图配置细粒度访问控制,包括:
- 列或行级别的安全性。
- 数据掩码。
注意
使用动态视图的精细访问控制在采用单一用户访问模式的群集上不可用。
Unity Catalog 引入了以下功能,这些功能允许你动态限制哪些用户可以访问视图中的行、列或记录:
current_user()
:返回当前用户的电子邮件地址。is_account_group_member()
:如果当前用户是特定帐户级别组的成员,则返回TRUE
。 建议在针对 Unity Catalog 数据的动态视图中使用。is_member()
:如果当前用户是特定工作区级别组的成员,则返回TRUE
。 提供此函数是为了与现有 Hive 元存储兼容。 请避免将它与针对 Unity Catalog 数据的视图一起使用,因为它不评估帐户级别的组成员身份。
Azure Databricks 建议不要授予用户读取视图中引用的表和视图的权利。
下面的示例说明如何在 Unity Catalog 中创建动态视图。
列级权限
使用动态视图,可以限制特定用户或组可以访问的列。 在下面的示例中,只有 auditors
组的成员可以从 sales_raw
表中访问电子邮件地址。 在查询分析过程中,Apache Spark 将 CASE
语句替换为文字字符串 REDACTED
或替换为电子邮件地址列的实际内容。 其他列按正常方式返回。 此策略对查询性能没有负面影响。
-- Alias the field 'email' to itself (as 'email') to prevent the
-- permission logic from showing up directly in the column name results.
CREATE VIEW sales_redacted AS
SELECT
user_id,
CASE WHEN
is_account_group_member('auditors') THEN email
ELSE 'REDACTED'
END AS email,
country,
product,
total
FROM sales_raw
行级权限
使用动态视图,你可以指定低至行级或字段级的权限。 在下面的示例中,当交易金额超过 1,000,000 美元时,只有 managers
组的成员才能查看交易金额。 对于其他用户,匹配结果将被筛选掉。
CREATE VIEW sales_redacted AS
SELECT
user_id,
country,
product,
total
FROM sales_raw
WHERE
CASE
WHEN is_account_group_member('managers') THEN TRUE
ELSE total <= 1000000
END;
数据屏蔽
因为 Unity Catalog 中的视图使用 Spark SQL,所以可以通过使用更复杂的 SQL 表达式和正则表达式来实现高级数据屏蔽。 在下面的示例中,所有用户都可以分析电子邮件域,但只有 auditors
组的成员才能查看用户的整个电子邮件地址。
-- The regexp_extract function takes an email address such as
-- user.x.lastname@example.com and extracts 'example', allowing
-- analysts to query the domain name.
CREATE VIEW sales_redacted AS
SELECT
user_id,
region,
CASE
WHEN is_account_group_member('auditors') THEN email
ELSE regexp_extract(email, '^.*@(.*)$', 1)
END
FROM sales_raw