了解 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 策略时,所有以前的值都将被删除。

    -- Sets a join policy on column HASHED_EMAIL.
    CALL samooha_by_snowflake_local_db.provider.set_join_policy(
      'my_provider_cleanroom',
      ['my_db.my_sch.T1:HASHED_EMAIL']);
    
    -- Replaces the previous join policy. Now the only column in the join policy is AGE_BND.
    CALL samooha_by_snowflake_local_db.provider.set_join_policy(
      'my_provider_cleanroom',
      ['my_db.my_sch.T1:AGE_BAND']);
    
  • 模板必须在模板中的适当位置检查策略。 只有当 Clean Room 策略被应用到模板中相应列的适当策略过滤器时,该策略才会被检查。如果设置了 Clean Room 策略来保护数据,则应检查模板,以确认模板是否按预期执行策略。以下模板会检查 col1 是否符合数据所有者的列策略:

    SELECT
      IDENTIFIER( {{ col1 | column_policy }} )
    FROM {{ source_table[0] }} AS c;
    

    以下模板 不会 检查 col1 是否有 Clean Room 策略:

    SELECT
      IDENTIFIER( {{ col1 }})
    FROM {{ source_table[0] }} AS c;
    

    Clean Room 为每种策略类型提供了不同的模板筛选器。不过,系统不会检查筛选器的语义,只会检查该列是否包含在该筛选器类型的策略中。例如,在以下代码片段中,尽管 col1 并未参与联接,系统仍会检查其联接策略。如果 col1 在数据所有者的联接策略中,查询可以成功执行;如果 col1 不在数据所有者的联接策略中,查询将被阻止。

    SELECT
      IDENTIFIER( {{ col1 | join_policy }})
    FROM {{ source_table[0] }} AS c;
    

备注

当模板的 JinjaSQL 被解析时,会进行列策略检查。使用这些检查可能无法找出含有通配符的查询,因此,设计分析模板时应慎重。如果某些列确实不应该被查询,可以考虑为源表创建一个视图来消除这些敏感列,并改为在该视图中建立链接。

Clean Room 中的 Snowflake 策略

当您将表链接到 Clean Room 时,源表上的任何 Snowflake 表策略将在 Clean Room 的链接表中强制执行,但这些策略不一定由 Clean Room API 或 UI 报告。例如,Snowflake 联接策略 将继续在 Clean Room 中强制执行,但是通过调用 consumer.view_provider_join_policyconsumer.view_join_policy 看不到该联接策略。因此,您应该从基础链接表中移除策略,创建等效的 Clean Room 策略(如果存在),或者将这些策略的存在情况明确告知协作者,这样他们的查询就不会失败或出现意外行为(“为什么我不能联接该列?”)。

对源表中 Snowflake 策略的任何更改都会自动传播到 Clean Room 中的链接视图。

Snowflake 隐私策略 禁止从受保护的表中创建视图,因此您无法链接具有隐私策略的表。

以下政策可以直接应用于 Clean Room:

联接策略

设置联接策略,以指示 Clean Room 中的 任何 模板都可以基于您数据中的哪些列进行联接。(相比之下,Snowflake 联接策略指定 必须 联接哪些列。)联接策略适用于 Clean Room 中的所有模板。

列不能同时存在于联接策略和列策略中,但列可以同时存在于联接策略和激活策略中。

实施联接策略

如果模板对某一列应用了 join_policyjoin_and_column_policy 筛选器,则会针对该列强制执行 Clean Room 联接策略。

如果模板检查列的联接策略,而 Clean Room 没有设置联接策略,或者列不在联接策略中,则查询将被阻止。

以下代码演示了如何以提供商或使用者的身份设置联接策略。请记住,策略仅对由其他账户运行的查询强制执行。

-- Set join policies on two columns in a clean room where you are a provider.
CALL samooha_by_snowflake_local_db.provider.set_join_policy(
  'my_provider_cleanroom',
  ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:HASHED_EMAIL', 'MYDB.MYSCH.EXPOSURES:HASHED_EMAIL']);

-- Set join policies on two columns in a clean room where you are a consumer.
CALL samooha_by_snowflake_local_db.consumer.set_join_policy(
  'my_consumer_cleanroom',
  ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:HASHED_EMAIL', 'MYDB.MYSCH.EXPOSURES:HASHED_EMAIL']);

以下程序用于在代码中查看或管理联接策略:

  • consumer.set_join_policy

  • consumer.view_provider_join_policy

  • consumer.view_join_policy

  • provider.view_join_policy

  • provider.set_join_policy

列策略

设置列策略,以指示哪些列可以投影到 特定 模板的分析结果中。列策略应用于特定 Clean Room 中的特定模板。

一列不能同时采用联接策略和列策略。一列可以同时采用激活策略和列策略。

实施列策略

只有当模板使用 column_policyjoin_and_column_policy 筛选器时,才会对列强制执行 Clean Room 列策略。

如果 Clean Room 检查列的列策略,而该列不在列策略中,或者 Clean Room 没有列策略,则查询将被阻止。

以下代码展示了当通过 prod_overlap_analysis 模板访问时,如何为三列设置列策略。该示例展示了如何以提供商和使用者的身份设置策略。请记住,策略仅对由其他账户运行的查询强制执行。

-- Set column policy check on prod_overlap_analysis template in a clean room where
-- you are a provider.
call samooha_by_snowflake_local_db.provider.set_column_policy(
  'my_provider_cleanroom',
  ['prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:STATUS',
   'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:AGE_BAND',
   'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:DAYS_ACTIVE']);

-- Set column policy check on prod_overlap_analysis template in a clean room where
-- you are a consumer.
call samooha_by_snowflake_local_db.consumer.set_column_policy(
  'my_consumer_cleanroom',
  ['prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:STATUS',
   'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:AGE_BAND',
   'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:DAYS_ACTIVE']);

以下程序用于在代码中查看或管理列策略:

  • consumer.set_column_policy

  • consumer.view_column_policy

  • consumer.view_provider_column_policy

  • provider.set_column_policy

  • provider.view_column_policy

激活策略

设置激活策略,以指示哪些列可以通过激活模板激活。激活将查询结果保存到提供商或使用者的 Snowflake 账户中的表中,或保存到第三方激活连接器中。

列可以是激活策略以及任何其他策略的一部分。

实施激活策略

如果模板允许激活,则可以在 Clean Room UI 中设置激活策略。

激活策略是为特定模板中的特定列设置的。

只有当模板为列应用 activation_policy 筛选器时,才会对列强制执行激活策略。

以下代码演示了如何设置激活策略,以允许在 Clean Room 中激活 HASHED_EMAIL 和 REGION_CODE 列。此策略影响 Clean Room 中的所有用户和所有激活模板。提供商和使用者在 Clean Room 中有同样的程序。调用反映您在 Clean Room 中的角色的程序。

-- Set activation policy check on prod_overlap_analysis template in a clean room where you are a provider
call samooha_by_snowflake_local_db.provider.set_activation_policy('my_cleanroom', [
    'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:HASHED_EMAIL',
    'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:REGION_CODE' ]);

-- Set activation policy check on prod_overlap_analysis template in a clean room where you are a consumer
call samooha_by_snowflake_local_db.consumer.set_activation_policy('my_cleanroom', [
    'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE_NAME.DEMO.CUSTOMERS:HASHED_EMAIL',
    'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE_NAME.DEMO.CUSTOMERS:REGION_CODE' ]);

以下模板会检查调用方传递给 col1 的值是否在其激活策略中。如果激活策略按之前的示例设置,那就意味着只能激活 HASHED_EMAILREGION_CODE 列。

BEGIN
  CREATE OR REPLACE TABLE cleanroom.activation_data_analysis_results AS
    SELECT {{ col1 | sqlsafe | activation_policy }}
    FROM IDENTIFIER({{ my_table[0] }}) AS c
    RETURN 'analysis_results';
END;

以下程序用于在代码中管理激活策略:

  • consumer.set_activation_policy

  • provider.set_activation_policy

聚合策略

聚合策略要求对表的所有查询都包含聚合(GROUP BY、COUNT 和其他函数),还要指定每个结果组的最小行数,否则结果中将省略该组。

Clean Room 不自行实施聚合策略;要对链接数据应用聚合约束,要么对源表应用 聚合策略,要么在模板中实施聚合约束。

一些 Snowflake 提供的模板使用为用户或模板设置的 thresholdthreshold_value 参数。这些值可以在 Clean Room UI 中修改,也可以通过调用 provider.add_consumersprovider/consumer.set_privacy 进行修改。如果已为使用者设置,您可以 在模板中访问这些值