Snowflake cloud data platform 雪花动态遮罩基础表:派生表未遮罩,视图变为空?
我有一个原始表,它有一个json数据的变量列。 有一些普通视图(非物质化视图),表是使用原始表中的json事件创建的 当角色为Snowflake cloud data platform 雪花动态遮罩基础表:派生表未遮罩,视图变为空?,snowflake-cloud-data-platform,snowflake-data-masking,Snowflake Cloud Data Platform,Snowflake Data Masking,我有一个原始表,它有一个json数据的变量列。 有一些普通视图(非物质化视图),表是使用原始表中的json事件创建的 当角色为bi_analyst时,在原始表的variant列上使用UDF应用掩蔽策略后,我发现了两个问题: 从基础表派生的表不使用bi_analyst角色屏蔽 使用基础表派生的视图在bi_分析师角色下变为空 有人知道为什么会这样吗?此动态掩蔽功能是否不支持基础表上的视图 我想做的是屏蔽底层数据,并且来自它的所有表和视图也用指定的角色屏蔽。 处理这些表很容易,因为我也可以对它们应用掩
bi_analyst
时,在原始表的variant列上使用UDF应用掩蔽策略后,我发现了两个问题:
bi_analyst
角色屏蔽李>
bi_分析师
角色下变为空李>
有人知道为什么会这样吗?此动态掩蔽功能是否不支持基础表上的视图
我想做的是屏蔽底层数据,并且来自它的所有表和视图也用指定的角色屏蔽。
处理这些表很容易,因为我也可以对它们应用掩蔽策略
但是,我不知道这些观点。我如何仍然使用角色访问视图,角色应该能够看到数据,但不能看到敏感列
UDF是:
-- JavaScript UDF to mask pii data --
use role ACCOUNTADMIN;
CREATE OR REPLACE FUNCTION full_address_masking(V variant)
RETURNS variant
LANGUAGE JAVASCRIPT
AS
$$
if ("detail" in V) {
if ("latitude" in V.detail) {
V.detail.latitude = "******";
}
if ("longitude" in V.detail) {
V.detail.longitude = "******";
}
if ("customerAddress" in V.detail) {
V.detail.customerAddress = "******";
}
}
return V;
$$;
屏蔽策略是:
-- Create a masking policy using JavaScript UDF --
create or replace masking policy json_address_mask as (val variant) returns variant ->
CASE
WHEN current_role() IN ('ACCOUNTADMIN') THEN val
WHEN current_role() IN ('BI_ANALYST') THEN full_address_masking(val)
ELSE full_address_masking(val)
END;
用于对原始数据设置屏蔽策略的sql命令为:
-- Set masking policy --
use role ACCOUNTADMIN;
alter table DB.PUBLIC.RAW_DATA
modify column EVERYTHING
set masking policy json_address_mask;
屏蔽策略应用于变量列所有内容
,其数据结构如下所示:
{
"detail": {
"customAddress": "******",
"id": 1,
"latitude": "******",
"longitude": "******"
},
"source": "AAA"
}
衍生表是:
create or replace table DB.SCHEMA_A.TABLE_A
as
select * from DB.PUBLIC.RAW_DATA
where everything:source='AAA';
grant select on table DB.schema_A.table_A to role bi_analyst;
一种观点是:
create or replace view DB.SCHEMA_A.VIEW_A as (
select
everything:account::string as account,
everything:detail:latitude::float as detail_latitude,
everything:detail:longitude::float as detail_longitude,
from
DB.PUBLIC.RAW_DATA
where
everything:source::string = 'AAA'
grant select on view DB.SCHEMA_A.VIEW_A to role bi_analyst;
结果是,RAW_DATA
被屏蔽,TABLE_A
根本不被屏蔽,VIEW_A
在使用BI_ANALYST
角色查询数据时返回0行。\35; 1-当您从具有屏蔽数据的表创建表时,您将在屏蔽表中获取创建新表的角色有权访问的数据。因此,在您的示例中,表_A具有未屏蔽的数据,因为它是由具有访问权限的角色创建的。屏蔽策略不会自动应用于新表
#2-至于#2,我认为您唯一的问题是示例中的JSON格式不正确,这就是为什么会得到空值。当我将此json修复为以下内容时,它可以使用与您发布的相同的函数和屏蔽策略正常工作:
{
"detail":{
"latitude": 132034034.00,
"longitude": 12393438583732,
"id": 1,
"customAddress" : "XXX Road, XXX city, UK"
},
"source": "AAA"
}
掩盖结果:
{
"detail": {
"customAddress": "XXX Road, XXX city, UK",
"id": 1,
"latitude": "******",
"longitude": "******"
},
"source": "AAA"
}
@Mike在他的回答中很好地解释了桌子未被掩盖的问题。解决方案可以是使用受屏蔽策略限制的角色创建派生表 视图的问题是关于屏蔽值“******”的类型,这是一种字符串类型,而字段
纬度
和经度
的实际类型是浮动的。
创建视图时,我仍然将纬度
和经度
字段强制转换为浮动类型:
create or replace view DB.SCHEMA_A.VIEW_A as (
select
everything:account::string as account,
everything:detail:latitude::float as detail_latitude,
everything:detail:longitude::float as detail_longitude,
from
DB.PUBLIC.RAW_DATA
where
everything:source::string = 'AAA'
将“******”强制转换为浮动有一个隐藏的错误,但雪花仍然继续并创建视图。但是,当我使用BI_ANALYST
角色查询数据时,它返回0行
因此,解决方法是将这些字段强制转换为变量类型:
create or replace view DB.SCHEMA_A.VIEW_A as (
select
everything:account::string as account,
everything:detail:latitude::variant as detail_latitude,
everything:detail:longitude::variant as detail_longitude,
from
DB.PUBLIC.RAW_DATA
where
everything:source::string = 'AAA'
这并不完美,因为它完全改变了视图的定义,没有一个角色可以获得数据的实际浮动/数字类型,甚至包括
accountadmin
,如果共享表结构、视图定义和数据屏蔽UDF,这将有助于应用屏蔽策略的UDF是什么?如果掩蔽策略正确应用于基表,则引用该表的所有视图也将被掩蔽。@demircioglu您好,我用代码和更多数据详细信息更新了问题,希望对了解我的issue@MikeWalton嗨,我刚刚更新了问题的更多细节。是的,我希望所有的视图都被屏蔽了,但是我真的不明白为什么它不工作。我的帖子中的json格式不正确,我现在已经更正了!我可以确认它在snowflakIt中的格式是正确的,因此表中没有隐藏您的解释是有意义的!但对于视图来说,情况并非如此,因为实际的json在实际的数据集中格式正确。这是对问题所在的数据类型的一个很好的理解。如果OP想要在视图上保持一个浮动,他们也可以只插入0.0
作为掩码值…或NULL
,这样也可以工作,而无需将数据类型更改为变量。