COLUMN
适用于:
Databricks SQL
Databricks Runtime 12.2 LTS 及更高版本
仅 Unity Catalog
指定每次从表中提取行时应用于列的函数。 该列的所有后续查询将会收到对该列计算该函数(而不是该列的原始值)的结果。 这对于细粒度的访问控制目的非常有用,在这种情况下,该函数可以检查调用用户的身份或组成员身份,以便决定是否编辑该值。
可以在以下情况下添加列掩码:
- 使用 CREATE TABLE创建表。
- 使用 ALTER TABLE … ADD COLUMN 将列添加到表中。
- 使用 ALTER TABLE … ALTER COLUMN 更改列。
重要
从数据源提取每一行后,就会立即应用掩码。 所有表达式、谓词或排序将在屏蔽后应用。 例如,将屏蔽列与另一个表中的列之间的联接使用屏蔽值进行联接比较。
有关如何使用列掩码的详细信息,请参阅 Azure Databricks 表。
所需权限
若要分配向表添加列掩码的函数,您必须对函数、EXECUTE架构和USE SCHEMA父目录具有USE CATALOG权限。
如果在 创建新 表时添加列掩码,则必须对架构具有 CREATE TABLE 特权。
如果要在 现有 表上添加或删除列掩码,则必须是表所有者,或者同时具有 MANAGE 表的和 SELECT 权限。
如果同一语句也会更改表架构(例如,添加包含掩码的新列),则还需要 MODIFY 对表具有特权。
语法
MASK func_name [ USING COLUMNS ( other_column_name | constant_literal [, ...] ) ]
参数
-
至少具有一个参数的标量 SQL UDF。
SQL UDF 的第一个参数与屏蔽列进行一对一映射。 掩码列的类型必须可转换为 SQL UDF 参数类型。 如果
func_name需要更多参数,则参数必须由USING COLUMNS子句提供。函数的返回类型必须可强制转换为屏蔽列的数据类型。
-
可选地指定包含掩码列的表中的其他列,以传递到
func_name。 每个other_column_name必须可转换为func_name的相应参数。使用列掩码根据用户对
column_identifier执行查询、table_name的值和column_identifier(可选)来选择性地匿名化other_column的值。 constant_literal
指定类型与函数参数匹配的常量参数。 支持以下类型:
STRING、数字(INTEGER、FLOAT,DOUBLE、DECIMAL...)、BOOLEAN、INTERVAL、NULL。
示例
可以在 Azure Databricks 表中找到更多示例。 演示 USING COLUMNS 子句的示例,请参阅 包含其他列的列掩码(USING COLUMNS)。
-- Create a table with a masked column
> CREATE FUNCTION mask_ssn(ssn STRING) RETURN CASE WHEN is_member('HumanResourceDept') THEN ssn ELSE '***-**-****' END;
> CREATE TABLE persons(name STRING, ssn STRING MASK mask_ssn);
> INSERT INTO persons VALUES('James', '123-45-6789');
-- As a non-member of 'HumanResourceDept'
> SELECT * FROM persons;
James ***-**-****
-- As a member of 'HumanResourceDept'
> SELECT * FROM persons;
James 123-45-6789
-- Create a masking function with multiple parameters. When applied first parameter will be the column that masking function applies to
> CREATE FUNCTION mask_pii_regional(value STRING, region STRING)
RETURN IF(is_account_group_member(region || '_HumanResourceDept'), value, 'REDACTED');
-- Create a table with a masked column. Masking function first parameter will be the column that is masked.
-- The rest of the parameters should be specified in `USING COLUMNS (<columnList>)` clause
> CREATE TABLE persons(name STRING, address STRING MASK mask_pii_regional USING COLUMNS (region), region STRING);
> INSERT INTO persons('James', '160 Spear St, San Francisco', 'US')
-- As a non-member of 'US_HumanResourceDept'
> SELECT * FROM persons;
James | REDACTED | US
-- As a member of 'US_HumanResourceDept'
> SELECT * FROM persons;
James | 160 Spear St, San Francisco | US
Limitations
- 列掩码不能应用于由生成的列引用的列。 请参阅 生成的列和列掩码。