我能够使用以下内容为顶级键的json列创建数据屏蔽策略,但无法弄清楚json的更深层次。有人这样做吗?
CREATE OR REPLACE MASKING POLICY json_mask_test AS
(val variant) returns variant ->
CASE
WHEN invoker_role()='ADMIN' THEN val
ELSE object_insert(
object_insert(
object_insert(val, 'pii_field', '***', true),
'address','***', true),
'lastName','***', true)
END
如果object_insert
是在json字段上创建屏蔽策略的唯一方法,则看起来它仅限于顶级密钥。
我在使用On Variant Data的示例
此外,当密钥在原始字段中不存在时,此策略还会将密钥插入json字段。为了能够消除这种情况,将是可取的。
编辑:
我在上面的示例中使用了这个json
{"regular_field": "regular data", "pii_field": "pii data"}
我试图在json中屏蔽LastNames,如下所示:
'{"root":[{"employees":[
{"firstName":"John", "lastName":"Doe"},
{"firstName":"Anna", "lastName":"Smith"},
{"firstName":"Peter", "lastName":"Jones"}
]}]}'
答案 0 :(得分:0)
在上述情况下,我们创建了用于平整json字段以供使用的视图。
为满足要求,可以将屏蔽策略应用于视图。
视图定义:
CREATE OR REPLACE VIEW v_json_mask AS
SELECT n.value:firstName::string firstName, n.value:lastName::string lastName
FROM json_test,
lateral flatten (input => v:root) r,
lateral flatten (input => r.value) e,
lateral flatten (input => e.value) n
我为姓氏屏蔽创建了另一种屏蔽策略并将其应用于视图
CREATE OR REPLACE MASKING POLICY lastName_mask AS
(lastName text) returns text ->
CASE
WHEN invoker_role()='ADMIN' THEN lastName
ELSE '*masked*'
END;
ALTER VIEW v_json_mask MODIFY COLUMN lastName SET MASKING POLICY lastName_mask;
以{mask}未指定的任何角色运行SELECT * FROM v_json_mask
FIRSTNAME LASTNAME
John *masked*
Anna *masked*
Peter *masked*
答案 1 :(得分:0)
这也有效,并且是在Snowflake创建数据屏蔽策略之前屏蔽数据的推荐做法。只需使用RBAC来控制对JSON表的访问并使用安全视图即可。
CREATE OR REPLACE SECURE VIEW v_json_mask AS
SELECT n.value:firstName::string firstName,
CASE WHEN current_role()='ADMIN' THEN n.value:lastName::string
ELSE '*masked*'
END as lastName
FROM json_test,
lateral flatten (input => v:root) r,
lateral flatten (input => r.value) e,
lateral flatten (input => e.value) n