对不同的数据类型使用相同的屏蔽策略
Posted
技术标签:
【中文标题】对不同的数据类型使用相同的屏蔽策略【英文标题】:Using same masking policy for different data types 【发布时间】:2020-11-10 10:05:26 【问题描述】:对于一个项目,我必须在多个列上设置屏蔽策略。这些列具有不同的数据类型(例如,varchar、date、number...)。是否可以对这些不同的列使用相同的屏蔽策略?
到目前为止,您可以在此处看到我的屏蔽策略,但这仅适用于 varchar 类型。我为每种数据类型创建了不同的屏蔽策略,但如果可能,我想使用 1 个屏蔽策略。
create or replace masking policy name_mask as (val varchar) returns varchar ->
case
when current_role() in ('ROLE_1') then val
when current_role() in ('ROLE_2') then md5(val)
else '*********'
end;
需要注意的是,在设置此屏蔽策略之前,我不会知道列的数据类型。屏蔽策略应该适用于每种数据类型。
【问题讨论】:
返回'***'
的屏蔽策略仅适用于字符串 - 因为它返回一个字符串。您将如何将其应用于数字列?
我可以返回 NULL 值而不是 '****',这应该适用于每种类型的值。但问题是您必须在屏蔽策略的第一行定义数据类型('create or replace masking policy name_mask as (val varchar) returns varchar')。我希望有办法解决这个问题,所以我的屏蔽策略适用于每种数据类型。
【参考方案1】:
在当前实施的屏蔽政策下这是不可能的。
定义屏蔽策略时,需要声明返回类型。返回的类型需要与它所应用的列的类型相匹配:
目前,Snowflake 不支持屏蔽策略中的不同输入和输出数据类型,例如定义屏蔽策略以针对时间戳并返回字符串(例如 MASKED);输入和输出数据类型必须匹配。 https://docs.snowflake.com/en/sql-reference/sql/create-masking-policy.html
这是一个有趣的功能请求!
【讨论】:
在 Snowflake 上,它说使用“CAST”作为解决方法。你能举一个例子说明这会是什么样子吗?我似乎无法将其放在正确的位置以使其正常工作。以上是关于对不同的数据类型使用相同的屏蔽策略的主要内容,如果未能解决你的问题,请参考以下文章