Snowflake中system$get_tag_on_current_column与is_role_in_session组合使用报错
解决方案
问题根源在于:当system$get_tag_on_current_column返回null时,'some_prefix_' || NULL会生成null值,而is_role_in_session函数不接受null作为参数。即便OR逻辑的第一个条件理论上会短路跳过第二个判断,Snowflake在解析掩码策略表达式时仍会检查所有函数参数的合法性,因此触发报错。
要实现「仅当列已分配标签时才评估标签值」的逻辑,可通过拆分CASE条件或提前捕获标签值两种方式规避null参数问题:
方式一:拆分CASE条件
先判断标签是否存在,仅当标签存在时再执行角色检查,从逻辑上避免is_role_in_session接收null参数:
create or replace masking policy test as (val string) returns string -> case -- 列未分配标签时,直接返回原数据 when system$get_tag_on_current_column('tag_db.tags.a') is null then val -- 列已分配标签,检查对应前缀角色是否在会话中 when is_role_in_session('some_prefix_' || system$get_tag_on_current_column('tag_db.tags.a')) then val -- 不符合上述条件则返回掩码值 else '**MASKED**' end;
方式二:使用LET语句提前捕获标签值
通过LET变量先存储标签值,让逻辑更简洁直观,同时确保仅当标签值非null时才调用is_role_in_session:
create or replace masking policy test as (val string) returns string -> let tag_value := system$get_tag_on_current_column('tag_db.tags.a') in case when tag_value is null OR is_role_in_session('some_prefix_' || tag_value) then val else '**MASKED**' end;
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

