保留我之前的答案,以防它仍然有用。
我能想到的另一种解决方法是使用变体数据,然后在其之上创建一个视图。
- 准备 JSON 格式的数据:
create or replace table member_json (member_id varchar, data variant);
insert into member_json
select
'A', parse_json('{"member_id": "A", "name" : "member_a"}')
union
select
'B', parse_json('{"member_id": "B", "name" : "member_b"}')
union
select
'C', parse_json('{"member_id": "C", "name" : "member_c"}')
;
create or replace table member_to_be_masked(member_id varchar);
insert into member_to_be_masked values ('B');
数据如下:
select * from member_json;
+-----------+----------------------+
| MEMBER_ID | DATA |
|-----------+----------------------|
| A | { |
| | "member_id": "A", |
| | "name": "member_a" |
| | } |
| B | { |
| | "member_id": "B", |
| | "name": "member_b" |
| | } |
| C | { |
| | "member_id": "C", |
| | "name": "member_c" |
| | } |
+-----------+----------------------+
select * from member_to_be_masked;
+-----------+
| MEMBER_ID |
|-----------|
| B |
+-----------+
- 创建一个 JS UDF:
create or replace function json_mask(mask boolean, v variant)
returns variant
language javascript
as
$$
if (MASK) {
V["member_id"] = '******'
V["name"] = '******';
}
return V;
$$;
- 使用 UDF 创建屏蔽策略:
create or replace masking policy member_mask
as (val variant)
returns variant ->
case
when exists
(
select
member_id
from
member_to_be_masked
where member_id = val['member_id']
)
then json_mask(true, val)
else val
end;
- 将策略应用到 member_json 表:
alter table if exists member_json
modify column data
set masking policy member_mask;
- 查询表会看到成员 B 被屏蔽:
select * from member_json;
+-----------+--------------------------+
| MEMBER_ID | DATA |
|-----------+--------------------------|
| A | { |
| | "member_id": "A", |
| | "name": "member_a" |
| | } |
| B | { |
| | "member_id": "******", |
| | "name": "******" |
| | } |
| C | { |
| | "member_id": "C", |
| | "name": "member_c" |
| | } |
+-----------+--------------------------+
- 在其上创建一个视图:
create or replace view member_view
as
select
data:"member_id" as member_id,
data:"name" as name
from member_json;
- 查询视图也会看到被屏蔽的数据:
select * from member_view;
+-----------+------------+
| MEMBER_ID | NAME |
|-----------+------------|
| "A" | "member_a" |
| "******" | "******" |
| "C" | "member_c" |
+-----------+------------+
不确定这是否有助于您的案例使用。