了解 Snowflake Data Clean Room 策略¶
Clean Room 可以实施数据策略,以控制协作者使用数据的方式。除此之外,还有针对与 Clean Room 关联的基础表所设置的 Snowflake 表策略。
Clean Room 中的每个协作者可以根据自己的数据制定策略。您的策略仅在其他用户请求后执行,不会针对您自己的请求执行。例如,如果您的联接策略只允许针对列 A 进行联接,那么其他用户就只能以列 A 为联接条件,而您可以针对自己的任意列运行联接。
Clean Room 策略可以使用 Clean Room API 或 UI 来设置。
要实施策略检查,必须满足以下条件:
数据所有者必须在其 Clean Room 中设置策略。 您可以使用 API 或 UI 设置策略。每种策略类型都是单独设置的。Clean Room 原生实施列策略、行策略和激活策略。Clean Room 策略不可累加: 当您设置 Clean Room 策略时,所有以前的值都将被删除。
模板必须在模板中的适当位置检查策略。 只有当 Clean Room 策略被应用到模板中相应列的适当策略过滤器时,该策略才会被检查。如果设置了 Clean Room 策略来保护数据,则应检查模板,以确认模板是否按预期执行策略。以下模板会检查 col1 是否符合数据所有者的列策略:
以下模板 不会 检查
col1是否有 Clean Room 策略:Clean Room 为每种策略类型提供了不同的模板筛选器。不过,系统不会检查筛选器的语义,只会检查该列是否包含在该筛选器类型的策略中。例如,在以下代码片段中,尽管
col1并未参与联接,系统仍会检查其联接策略。如果col1在数据所有者的联接策略中,查询可以成功执行;如果col1不在数据所有者的联接策略中,查询将被阻止。
备注
当模板的 JinjaSQL 被解析时,会进行列策略检查。使用这些检查可能无法找出含有通配符的查询,因此,设计分析模板时应慎重。如果某些列确实不应该被查询,可以考虑为源表创建一个视图来消除这些敏感列,并改为在该视图中建立链接。
Clean Room 中的 Snowflake 策略¶
当您将表链接到 Clean Room 时,源表上的任何 Snowflake 表策略将在 Clean Room 的链接表中强制执行,但这些策略不一定由 Clean Room API 或 UI 报告。例如,Snowflake 联接策略 将继续在 Clean Room 中强制执行,但是通过调用 consumer.view_provider_join_policy 或 consumer.view_join_policy 看不到该联接策略。因此,您应该从基础链接表中移除策略,创建等效的 Clean Room 策略(如果存在),或者将这些策略的存在情况明确告知协作者,这样他们的查询就不会失败或出现意外行为(“为什么我不能联接该列?”)。
对源表中 Snowflake 策略的任何更改都会自动传播到 Clean Room 中的链接视图。
Snowflake 隐私策略 禁止从受保护的表中创建视图,因此您无法链接具有隐私策略的表。
以下政策可以直接应用于 Clean Room:
联接策略¶
设置联接策略,以指示 Clean Room 中的 任何 模板都可以基于您数据中的哪些列进行联接。(相比之下,Snowflake 联接策略指定 必须 联接哪些列。)联接策略适用于 Clean Room 中的所有模板。
列不能同时存在于联接策略和列策略中,但列可以同时存在于联接策略和激活策略中。
实施联接策略¶
如果模板对某一列应用了 join_policy 或 join_and_column_policy 筛选器,则会针对该列强制执行 Clean Room 联接策略。
如果模板检查列的联接策略,而 Clean Room 没有设置联接策略,或者列不在联接策略中,则查询将被阻止。
以下代码演示了如何以提供商或使用者的身份设置联接策略。请记住,策略仅对由其他账户运行的查询强制执行。
以下程序用于在代码中查看或管理联接策略:
consumer.set_join_policyconsumer.view_provider_join_policyconsumer.view_join_policyprovider.view_join_policyprovider.set_join_policy
列策略¶
设置列策略,以指示哪些列可以投影到 特定 模板的分析结果中。列策略应用于特定 Clean Room 中的特定模板。
一列不能同时采用联接策略和列策略。一列可以同时采用激活策略和列策略。
实施列策略¶
只有当模板使用 column_policy 或 join_and_column_policy 筛选器时,才会对列强制执行 Clean Room 列策略。
如果 Clean Room 检查列的列策略,而该列不在列策略中,或者 Clean Room 没有列策略,则查询将被阻止。
以下代码展示了当通过 prod_overlap_analysis 模板访问时,如何为三列设置列策略。该示例展示了如何以提供商和使用者的身份设置策略。请记住,策略仅对由其他账户运行的查询强制执行。
以下程序用于在代码中查看或管理列策略:
consumer.set_column_policyconsumer.view_column_policyconsumer.view_provider_column_policyprovider.set_column_policyprovider.view_column_policy
激活策略¶
设置激活策略,以指示哪些列可以通过激活模板激活。激活将查询结果保存到提供商或使用者的 Snowflake 账户中的表中,或保存到第三方激活连接器中。
列可以是激活策略以及任何其他策略的一部分。
实施激活策略¶
如果模板允许激活,则可以在 Clean Room UI 中设置激活策略。
激活策略是为特定模板中的特定列设置的。
只有当模板为列应用 activation_policy 筛选器时,才会对列强制执行激活策略。
以下代码演示了如何设置激活策略,以允许在 Clean Room 中激活 HASHED_EMAIL 和 REGION_CODE 列。此策略影响 Clean Room 中的所有用户和所有激活模板。提供商和使用者在 Clean Room 中有同样的程序。调用反映您在 Clean Room 中的角色的程序。
以下模板会检查调用方传递给 col1 的值是否在其激活策略中。如果激活策略按之前的示例设置,那就意味着只能激活 HASHED_EMAIL 和 REGION_CODE 列。
以下程序用于在代码中管理激活策略:
consumer.set_activation_policyprovider.set_activation_policy
聚合策略¶
聚合策略要求对表的所有查询都包含聚合(GROUP BY、COUNT 和其他函数),还要指定每个结果组的最小行数,否则结果中将省略该组。
Clean Room 不自行实施聚合策略;要对链接数据应用聚合约束,要么对源表应用 聚合策略,要么在模板中实施聚合约束。
一些 Snowflake 提供的模板使用为用户或模板设置的 threshold 和 threshold_value 参数。这些值可以在 Clean Room UI 中修改,也可以通过调用 provider.add_consumers 或 provider/consumer.set_privacy 进行修改。如果已为使用者设置,您可以 在模板中访问这些值。