【发布时间】:2021-06-04 04:55:10
【问题描述】:
我发现,如果屏蔽列是谓词或 JOIN 的一部分,则针对具有屏蔽策略的表的查询将根据角色返回不同的结果。
以下查询将不返回任何数据:
use role NO_READ_ROLE;
select *
from customer_table
where ssn = '***-**-0102';
但是如果使用的角色应用了掩码,它会返回结果集。
对于以下查询,仅当角色为 FULL READ(未屏蔽)时才返回结果集:
select *
from customer_table
where ssn = '100-10-0102';
同样,如果我们在掩码列上进行自联接,则返回的结果将取决于所使用的角色。
select c1.customer_id
, c2.first_name
, c1.ssn
, c2.ph_no
, c1.email
from customer_table c1
inner join customer_table c2
on c1.ssn = c2.ssn;
我曾希望/期望优化器将谓词和 JOIN 运算符一视同仁,而不管屏蔽策略的影响。相反,被屏蔽的列似乎也被屏蔽为查询计划的一部分。
根据上述发现,一个好的经验法则似乎是不要将屏蔽列用作谓词和/或 JOIN 的一部分,除非所使用的角色对列具有不受限制的读取访问权限。
在使用屏蔽列作为查询 JOIN 或 WHERE 子句的一部分时,是否有人有任何其他指导?
参考:
在运行时,Snowflake 会重写查询以将屏蔽策略表达式应用于屏蔽策略中指定的列。无论在 SQL 表达式中的何处引用该列,都将屏蔽策略应用于该列,包括:
- 投影。
- JOIN 谓词。
- WHERE 子句谓词。
- ORDER BY 和 GROUP BY 子句。
谢谢,
【问题讨论】:
标签: snowflake-cloud-data-platform dynamic-data-masking