我有一个原始表,其中包含 json 数据的变体列。有一些普通视图(不是物化视图)和表是使用原始表中的 json 事件创建的。
当角色为 时,在原始表的变量列上使用 UDF 应用屏蔽策略后bi_analyst
,我发现了两个问题:
- 从基础表派生的表不被
bi_analyst
角色屏蔽; - 使用基础表派生的视图因
bi_analyst
角色变为空;
有谁知道为什么会这样?这个动态屏蔽功能不支持基础表上的视图吗?
我想做的是屏蔽底层数据,并且来自它的所有表和视图也被指定的角色屏蔽。处理这些表很容易,因为我也可以对它们应用屏蔽策略。
但是,我对这些观点一无所知。我如何仍然可以访问具有该角色的视图,该角色应该能够看到数据但不能看到敏感列?
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;
屏蔽策略应用于变量列EVERYTHING
,其数据结构如下所示:
{
"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
数据时返回0行。BI_ANALYST