对不同的数据类型使用相同的屏蔽策略

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”作为解决方法。你能举一个例子说明这会是什么样子吗?我似乎无法将其放在正确的位置以使其正常工作。

以上是关于对不同的数据类型使用相同的屏蔽策略的主要内容,如果未能解决你的问题,请参考以下文章

概述数据交换的构建策略

概述数据交换的构建策略

加入相同的字段,不同的数据类型

C语言中,不同的数据类型对数据的处理方式是不是相同?

如何使用相同的值但使用现有字段之一的不同数据类型来注释 Django Queryset?

不同维度类型的相同事实