使用 Snowflake Collaboration Data Clean Room¶
本主题提供了使用 Collaboration Data Clean Room 的高级指南。它还详细介绍了创建或参与协作所需的所有关键步骤。
基本 Clean Room 协作工作流程¶
以下是简单的 Clean Room 协作场景:
协作 所有者 可以选择注册他们希望在协作的初始配置中显示的任何模板或数据产品。
所有者可以选择要求任何预期协作者注册他们希望在协作的初始配置中显示的任何模板或数据产品。然后,协作者提供他们注册的任何项目的资源 IDs。
然后,所有者 创建协作。协作由协作 YAML 规范定义,列出协作者及其角色,以及协作初始版本中应存在的所有资源。
创建协作时,协作者及其角色的集合是固定的:仅具有协作定义中指定角色的协作者会受邀加入。同样,分析运行者的集合也是固定的。但是,通过将新数据链接到协作,任何协作者也都可以成为数据提供商。
如果协作包括其他云托管区域的用户,他们必须 为其账户启用 Cross-Cloud Auto-Fulfillment,然后才能查看和加入协作。
所有者加入他们创建的协作,从而使协作处于活动状态。现在,规范中的任何协作者都可以看到和加入协作。
协作者 查看并加入协作。
然后,协作者可以选择 将资源添加到协作,例如模板,如果是数据提供商,则为数据产品。
然后,分析运行者可以在协作中 运行为他们分配的任何模板,使用他们在协作中可用的任何数据(以及可选的非共享本地数据)。分析运行者承担分析成本。模板可以在响应中返回查询结果,也可以 将结果激活并传递给调用方或其他协作者。
以下部分介绍每个步骤的详细信息。
创建协作¶
要创建协作,您需要设计 协作规范,定义所有协作者 及其角色。协作所有者可以选择 注册并链接他们希望在初始协作中提供的任何其他资源,并将这些资源包含在协作规范中。如果所有者希望使用协作者提供的资源,则所有者还可以提示这些用户注册其资源,并向所有者提供资源 IDs 以包含在协作规范中。
然后,所有者调用 INITIALIZE 以开始创建协作。这是一个异步过程,因此他们必须调用 GET_STATUS,直到状态为 CREATED。
然后,所有者必须通过调用 JOIN 来加入他们的协作。联接也是一个异步过程,因此所有者必须调用 GET_STATUS 以跟踪联接进度。当协作状态为 JOINED 时,协作将处于活动状态,并且所有协作者都可以查看并加入协作。在所有者加入协作之前,任何协作者都无法查看或加入协作。
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.INITIALIZE(
$$
api_version: 2.0.0
spec_type: collaboration
name: my_first_collaboration
owner: alice
collaborator_identifier_aliases:
alice: example_com.acct_abc
bob: another_example.acct_xyz
analysis_runners:
bob:
data_providers:
alice:
data_offerings: []
bob:
data_offerings: []
alice:
data_providers:
alice:
data_offerings: []
bob:
data_offerings: []
templates: []
$$
);
SET collaboration_id = '<collaboration_id>';
-- Creating a collaboration is asynchronous. Check to see when collaboration is CREATED.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.GET_STATUS($collaboration_id);
-- Collaboration is visible here when it's created.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_COLLABORATIONS();
-- Join the collaboration you created.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.JOIN($collaboration_id);
-- Joining a collaboration is asynchronous. Call get_status until the status is JOINED.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.GET_STATUS($collaboration_id);
将资源添加到协作¶
任何协作者都可以将资源添加到协作中,也可以移除已添加到协作中的资源。
在创建协作之前或之后都可以将资源添加到协作中。
资源支持版本控制;但是,使用新版本创建新资源不会将以前的版本从协作中移除。
资源通过组合用户提供的名称和版本(以及数据产品的别名)进行唯一命名。
您可以将以下资源添加到协作中:
模板¶
模板是可由指定协作者运行的 JinjaSQL Clean Room 模板。只要所有受影响的协作者都批准了请求,任何协作者都可以注册模板并将其添加到协作中,如以下步骤所述。您只能添加或移除您的账户已注册的模板。
要将模板添加到协作,请执行以下操作:
调用
REGISTRY.REGISTER_TEMPLATE,这样会返回一个模板 ID。添加模板。过程取决于协作是否已存在:
要在创建协作之前添加模板, 请向协作所有者提供模板 ID,该所有者会将其添加到 协作规范,定义谁可以运行模板。
alice: data_providers: bob: data_offerings: [] templates: - id: bob_template_v1 # Alice can run this template, seemingly registered by bob.
要将模板添加到现有协作中, 您必须向受模板影响的所有协作者请求权限。请执行以下步骤,将模板添加到现有协作:
调用
REGISTER_TEMPLATE以在您的账户中注册模板,使其可以添加到协作中。使用模板 ID 调用
ADD_TEMPLATE_REQUEST以启动审批流程,以便为特定用户将模板添加到特定协作。受资源影响的所有协作者在调用
VIEW_UPDATE_REQUESTS时都会看到请求。看到状态为 PENDING 的请求的协作者应该调用
APPROVE_UPDATE_REQUEST或REJECT_UPDATE_REQUEST。如果有任何协作者拒绝请求,则更新请求都将被拒。
协作者无法之后将批准更改为拒绝,或将拒绝更改为批准。
当请求状态为 APPROVED 时,模板可供模板添加请求中指定的用户使用。如果请求状态为 REJECTED,则拒绝方提供的任何原因在请求报告中均可见。
小技巧
要查看您注册了哪些模板,请调用 REGISTRY.VIEW_REGISTERED_TEMPLATES。
协作的模板设计¶
协作模板与 Clean Room 模板 相同,但有一些特殊注意事项:
协作中列出的共享表用于填充模板的
source_table变量。my_table仅当分析运行者想要使用本地非共享数据时使用。如果您在模板中使用my_table的变量,请注意,分配给该变量的表不会与协作共享。数据源中的列在向模板或用户公开时可能会有新名称。请参阅 源列重命名,了解如何以及何时重命名源列。如果重命名了列,模板和用户提供的实参(例如联接列名称)应使用最终名称,而不是原始名称。
协作中的激活模板无需命名为
activation_template_name。所有其他 激活模板要求 仍然适用。
有关 Snowflake Data Clean Room 中自定义模板语法的信息,请参阅 自定义 Clean Room 模板参考。
数据产品¶
数据产品 是协作中与特定分析运行者共享的一个或多个数据视图。协作中列出的任何数据提供商都可以添加数据产品。数据产品以限定范围的格式 data offering ID.alias 公开,其中别名是数据产品中的特定视图。仅当 协作规范 中将您列为该分析运行者的数据提供商时,您才能与指定的协作者共享数据产品。
数据产品是数据的实时视图,而不是创建或注册数据产品时的数据快照。应用于源数据的任何 Snowflake 策略在协作中都处于活动状态。
注册数据产品时,Snowflake 会为 数据产品规范 中列出的每个数据源创建视图。该视图仅包括数据产品规范中列出的列。当您将数据产品链接至协作时,Snowflake 会根据 协作规范 创建该视图的副本,并对可访问该数据产品的任何分析运行者实施访问保护。如果您移动、重命名或更改基础表的访问权限,则数据产品将无法通过任何以前注册的链接使用。
如果您使用的是 Snowflake Standard Edition,则无法与其他协作者共享数据产品,但可以 在查询中使用您自己的数据。
备注
您必须对您要共享的任何数据拥有 OWNERSHIP。否则,当您尝试加入协作时,您会收到“missing reference usage grant”错误。了解如何处理此问题。
您可以调用 unlink_data_offering,从协作中移除数据资源。
要将数据产品添加到协作,请按照以下步骤操作:
数据所有者通过调用
REGISTRY.REGISTER_DATA_OFFERING注册数据产品,返回数据产品 ID。此步骤使数据产品 可以 链接到您可以访问的任何协作。您可以使用相同的数据产品 ID 与多个协作共享数据产品。
下一步取决于是否已创建协作:
如果尚未创建协作, 数据提供商将向协作创建者提供数据产品 ID,以添加到 协作定义。将数据产品添加到协作定义时,在数据提供商加入协作后,协作中的任何人都可以看到该数据产品。
如果已创建协作, 数据提供商会加入协作并调用
COLLABORATION.LINK_DATA_OFFERING,提供数据产品 ID、协作名称,以及数据共享对象。
每个数据产品代表一个或多个表或视图。使用语法 collaborator alias.data offering ID.dataset alias 访问单个表,其中数据产品 ID 是用户提供的名称和版本值的组合,别名是产品中的单个表。注册数据产品时,将名称、版本和别名视为范围界定系统。
例如,您可以注册以下销售数据的数据产品,其中每个表对应一个 US 州:
api_version: 2.0.0
spec_type: data_offering
version: v0
name: examplecorp_sales_by_state
datasets:
- alias: AL
data_object_fqn: mydb.mysch.al_data
- alias: NY
data_object_fqn: mydb.mysch.ny_data
- alias: CA
data_object_fqn: mydb.mysch.ca_data
然后,分析运行者会以 data offering id.AL、data offering id.NY 或 data offering id.CA 引用这些表。
在注册数据产品的用户加入协作之前,数据产品在协作中不可见。
小技巧
如果您对共享的数据没有 OWNERSHIP,当您尝试加入协作或链接数据产品时,您将会收到错误消息。错误消息提供有关 ACCOUNTADMIN 必须运行的 SQL 命令的信息,以授予对协作的数据访问权限。ACCOUNTADMIN 运行该命令后,您将能够加入协作。查看更多信息。
运行查询时,分析运行者会按 ID 将数据产品传递给 COLLABORATION.RUN 的 source_tables 参数。
要查看您注册的数据产品,请调用 VIEW_REGISTERED_DATA_OFFERINGS。
将使用策略应用于数据¶
有两种方法可以将 Snowflake 列策略(例如联接或聚合策略)应用于共享数据:
在源数据上应用策略。 应用于源数据的任何策略都会在协作公开的数据集中强制执行。确保将策略传达给用户。
在自由格式查询中使用时,将策略应用于数据产品。 如果您允许对数据产品进行自由格式查询,则可以指定要对数据的自由格式查询强制执行的列策略。在数据产品描述中指定自由格式查询的列策略。这些策略叠加在源表上任何现有 Snowflake 策略之上。
将策略应用于源数据¶
应用于源数据的任何 Snowflake 策略也适用于协作中的数据产品视图。
如果您将 Snowflake 策略应用于源数据,请务必让您的协作者了解这些策略,以免他们在不知不觉中尝试运行对不可联接列进行联接的查询,或者在应该进行分组时不进行分组的查询。您可以在数据产品的 description 字段中提及任何 Snowflake 策略。
在数据产品上应用策略(仅限自由格式查询使用)¶
您可以将 Snowflake 策略应用于共享数据中的 自由格式查询,而无需将其应用于源数据。这些策略会在通过自由格式查询访问您的数据时生效,且会与直接应用于源表的任何 Snowflake 策略叠加执行。
要为数据添加自由格式的 SQL 策略,请执行以下步骤:
将以下信息添加到数据产品定义中:
设置
allowed_analyses: template_and_freeform_sql。在数据产品描述的数据集定义中添加
freeform_sql_policies部分。在
freeform_sql_policies下面添加适当的策略类型部分,列出您创建的 Snowflake 策略,以及要为这些策略应用的协作列。
协作者在调用 COLLABORATION.VIEW_DATA_OFFERINGS 时会看到应用于数据的策略类型。
您可以对多个表的多个列重复使用同一个策略。
示例:
CREATE OR REPLACE AGGREGATION POLICY my_db.public.my_agg_policy AS ()
RETURNS AGGREGATION_CONSTRAINT ->
AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 5);
# Tell data clean rooms to set your aggregation policy on the hashed_email column of
# the data offering
api_version: 2.0.0
version: 1
name: my_favorite_dataset
datasets:
- alias: test_freeform_restricted_agg
data_object_fqn: samooha_provider_sample_database.audience_overlap.customers
allowed_analyses: template_and_freeform_sql
object_class: custom
freeform_sql_policies:
aggregation_policy:
name: my_db.public.my_agg_policy
entity_keys:
- hashed_email
...
源列重命名¶
向模板或自由格式 SQL 调用方公开的列名由 category 和 column_type 值确定,这些值在 数据产品定义 中定义列。列重命名遵循以下准则:
如果列的
category为join_custom或passthrough,则公开原始列名。如果
category为join_standard,则列被重命名为column_type值。如果
category为timestamp,列在数据产品中被重命名为timestamp。
例如,如果源表中的列名为 user_email_address,则此列向模板或自由格式 SQL 公开的方式取决于数据产品定义中的定义方式:
如果列类别为
join_standard并且column_type存在:... Snippet from data offering yaml ... schema_and_template_policies: user_email_address: category: join_standard column_type: hashed_email_sha256
然后
column_type值用于查询和模板:SELECT HASHED_EMAIL_SHA256 FROM source_table[0];
如果列类别为
join_custom:... Snippet from data offering yaml ... schema_and_template_policies: user_email_address: category: join_custom column_type: hashed_email_sha256
然后,在查询和模板中使用原始源列名称:
-- column_type is ignored for join_custom columns. SELECT user_email_address FROM source_table[0];
加入协作¶
您必须加入协作,才能使您为该协作提供的任何资源在协作中可用,或能够在该协作中运行分析。
创建者 仅调用
COLLABORATION.JOIN。非创建者 调用
COLLABORATION.REVIEW,然后调用COLLABORATION.JOIN。重要
如果您的账户与协作所有者的账户位于不同的云托管区域:
如果 您的账户未启用 Cross-Cloud Auto-Fulfillment,则
REVIEW请求将失败。REVIEW会触发额外的异步设置步骤。重复调用REVIEW,直到返回成功响应,表示设置已完成。
联接是一个异步过程;调用 GET_STATUS 以查看您的状态何时列为 JOINED.
运行分析¶
要运行分析,您可以在查询中运行模板,也可以对协作数据运行自由格式的 SQL 查询。您必须是协作中指定的 分析运行者,才能运行分析。协作规范决定了您是否可以运行模板、激活结果或运行自由格式的 SQL 查询。协作规范中描述了您的功能以及可供您使用的数据和模板。
分析运行者承担分析的运行成本。
从模板运行分析¶
要从模板运行分析,请查看您可以运行的模板列表,查看您可以使用的数据产品列表,然后调用 COLLABORATION.RUN,将您的值作为单个参数或作为 YAML 格式的分析规范:
-- See which data offerings are available.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_DATA_OFFERINGS($collaboration_id);
-- See which templates you can run.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_TEMPLATES($collaboration_id);
-- Pass in the arguments in analysis YAML format.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.RUN(
$collaboration_id,
$$
api_version: 2.0.0
spec_type: analysis
name: My_analysis
description: Sales results Q2 2025
template: 12345
template_configuration:
view_mappings:
source_tables:
- {{table_1_name}}
- {{table_2_name}}
arguments:
conv_purchase_id: PURCHASE_ID
conv_purchase_amount: PURCHASE_AMOUNT
publisher_impression_id: IMPRESSION_ID
publisher_campaign_name: CAMPAIGN_NAME
publisher_device_type: DEVICE_TYPE
$$ );
对数据启用并运行自由格式的 SQL 查询¶
数据提供商支持分析运行者对其协作数据产品运行 SQL 查询。您必须是协作的成员,并被授予分析运行者角色,对数据产品具有自由格式的 SQL 权限,能够对该数据运行自由格式的 SQL 查询。
数据提供商步骤¶
要支持协作者从命令行查询数据集,请在数据产品描述的数据集描述中设置 allowed_analyses: template_and_freeform_sql。加入协作的用户可以对他们可访问的数据集运行自由格式的 SQL 查询。
以下 YAML 定义数据集,允许自由格式的查询:
api_version: 2.0.0
version: 1
name: my_favorite_dataset
datasets:
- alias: test_freeform_restricted_agg
data_object_fqn: samooha_provider_sample_database.audience_overlap.customers
object_class: custom
allowed_analyses: template_and_freeform_sql
...
分析运行者步骤¶
要查看哪些数据集支持自由格式查询,在加入协作后,分析运行者会运行
COLLABORATION.VIEW_DATA_OFFERINGS。结果中的 FREEFORM_SQL_VIEW_NAME 列显示可以使用自由格式 SQL 访问的表以及要在 SQL 查询中使用的表名称。CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_DATA_OFFERINGS($collaboration_id);
+-------------------------------+------------------------+------------------------------+------------------------------+---------------------------------------+ | template_view_name | template_join_columns | analysis_allowed_columns | activation_allowed_columns | freeform_sql_view_name | +-------------------------------+------------------------+------------------------------+------------------------------+---------------------------------------+ | useralias.data_offering_alias | ip_address | email, name, age | SSN | SOMETESTVIEW1234.FREEFORM_SQL.dataset1| +-------------------------------+------------------------+------------------------------+------------------------------+---------------------------------------+
然后,协作者可以使用自由格式的 SQL 查询来查询 FREEFORM_SQL_VIEW_NAME 列:
SELECT * FROM SOMETESTVIEW1234.FREEFORM_SQL.dataset1;
强制实施应用于表的所有策略。
使用 Standard Edition 时,使用自己的数据运行分析¶
如果您使用 Standard Edition,则可以 以标准方式 运行分析。但是,您无法将数据添加到协作描述并与其他用户共享。
要以 Standard Edition 用户身份在协作中使用自己的数据,请执行以下操作:
要注册数据产品,请调用
REGISTRY.REGISTER_DATA_OFFERING。您必须指定列名称。调用
COLLABORATION.LINK_LOCAL_DATA_OFFERING。在调用
COLLABORATION.VIEW_DATA_OFFERINGS时,只有您可以看到您的产品;其他协作者不会看到您列出的数据源。如果传入分析 YAML,则在调用
COLLABORATION.RUN时,请在local_template_view_names参数或local_view_mappings.my_tables字段中使用数据产品 ID。local_template_view_names和local_view_mappings.my_tables填充模板中的my_table参数。
以下示例展示了如何使用运行过程的 YAML 格式版本。此示例包括 my_tables 字段,该字段通过调用 LINK_LOCAL_DATA_OFFERING 填充。
-- See what data offerings are available. Your own local data will be listed here as well.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_DATA_OFFERINGS($collaboration_id);
-- Pass in the arguments in analysis YAML format.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.RUN(
$collaboration_id,
$$
api_version: 2.0.0
spec_type: analysis
name: my_analysis
description: Cross-purchase results for Q4 2025
template: mytemplate_v1
template_configuration:
view_mappings:
source_tables:
- ADVERTISER1.ADVERTISER_DATA_V1.CUSTOMERS
- PUBLISHER.ADVERTISER_DATA_V1.CUSTOMERS
local_view_mappings:
my_tables:
- PARTNER.MY_DATA_V1.MY_CUSTOMERS # Populate my_table array with my own table.
arguments: # Template arguments, as name: value pairs
conv_purchase_id: PURCHASE_ID
conv_purchase_amount: PURCHASE_AMOUNT
publisher_impression_id: IMPRESSION_ID
publisher_campaign_name: CAMPAIGN_NAME
publisher_device_type: DEVICE_TYPE
$$ );
激活查询结果¶
备注
如果您没有使用 SAMOOHA_APP_ROLE 角色,也就是说,您正在使用由 访问管理过程 管理的角色,则您必须拥有 REGISTER DATA OFFERING 权限,才能您作为分析运行者的任何协作,并且协作规范包括 activation_destinations 字段。
激活查询结果:
确保所有激活列在相应规范中设置了以下属性:
对于具有已激活列的表,数据产品规范 必须为该列设置
activation_allowed: TRUE:api_version: 2.0.0 spec_type: data_offering name: 2025_orders version: 2025_01_01_v1 description: Activating Cleveland sales results for 2025 datasets: - alias: customers data_object_fqn: db1.schema1.orders allowed_analyses: template_only object_class: custom schema_and_template_policies: email: category: join_standard column_type: hashed_email_sha256 activation_allowed: TRUE purchase_amount: category: passthrough activation_allowed: TRUE
协作规范 必须为分析运行者提供
activation_destinations值。数据产品规范将激活限制为指定的分析运行者和模板。api_version: 2.0.0 spec_type: collaboration name: simple_activation_collaboration description: Demonstrates a basic activation collaborator_identifier_aliases: advertiser_1: some_complex_identifier publisher_1: another_complex_identifier owner: publisher_1 analysis_runners: advertiser_1: data_providers: advertiser_1: data_offerings: - id: customer_list publisher_1: data_offerings: - id: 2025_orders_1234 templates: - id: activation_template_1234 activation_destinations: snowflake_collaborators: - publisher_1 ....
分析规范 必须包括
collaborator_name和segment_name实参,并调用 激活模板,遵循 自定义模板的协作准则。您无法通过运行标准分析模板来激活结果。api_version: 2.0.0 spec_type: analysis name: my_analysis description: Description of the analysis template: my_activation_template template_configuration: view_mappings: source_tables: - alias1.schema1.table1 - alias2.schema2.table2 arguments: collaborator_name: publisher_1 segment_name: q1_2025 join_column: ip_address advertiser_activation_column: purchase_amount publisher_activation_column: device_type
备注
模板已应用
activation_policy筛选器的任何列都必须在数据产品规范中将activation_allowed值设置为 TRUE。以下示例显示了一个模板,该模板已将激活策略应用于分析运行者提供的两列:BEGIN CREATE OR REPLACE TABLE cleanroom.activation_data_analysis_results AS SELECT count(*) AS ITEM_COUNT, c.status, c.age_band FROM IDENTIFIER({{ my_table[0] }}) AS c JOIN IDENTIFIER({{ source_table[0] }}) AS p ON {{ c_join_col | sqlsafe | activation_policy }} = {{ p_join_col | sqlsafe | activation_policy }} GROUP BY c.status, c.age_band ORDER BY c.age_band; RETURN 'analysis_results'; END;
分析运行者调用
RUN以运行分析。如果自行激活,结果将立即在表
consumers_database.ACTIVATION_RESULTS.CONSUMER_DIRECT_ACTIVATION_SUMMARY中的调用方账户中提供。要了解如何查看查询结果,请参阅最后一步。如果激活至其他协作者:
协作者调用
VIEW_ACTIVATIONS,直到它返回状态 SHARED。对于大型结果集,激活至其他账户可能需要相当长的时间,因为数据必须传输到协作者的账户并解密。当激活状态为 SHARED 时,协作者调用
PROCESS_ACTIVATION,将结果发送到他们的账户。对PROCESS_ACTIVATION的响应包括表和段名称。这会将激活状态设置为 PROCESSED。
要检索查询结果,请运行以下命令 SQL 命令,提供结果表名称和(可选)用于筛选结果的段名称:
SELECT * FROM <results_table_name> [WHERE segment = <segment_name>];
退出或删除协作¶
非所有者通过调用
COLLABORATION.LEAVE来退出协作。他们提供的任何数据产品都将从协作中移除。退出协作后,您无法重新加入协作。协作所有者无法退出协作;所有权无法转让。协作所有者可以通过调用
COLLABORATION.TEARDOWN,为所有协作者删除协作。
这两个过程都是异步过程。您必须调用 GET_STATUS 以监控状态,并在 GET_STATUS 将状态显示为 LOCAL_DROP_PENDING 时,再次调用 LEAVE 或 TEARDOWN。
启用 Cross-Cloud Auto-Fulfillment¶
如果您与协作所有者不在同一云托管区域,则必须为您的账户启用 Cross-Cloud Auto-Fulfillment (LAF),您才能加入协作。如果您尝试在另一个云区域中查看协作,并且未为您的账户启用 LAF,或者您没有适当的权限,您在对协作调用 REVIEW 时会收到错误。
备注
在协作中使用 Cross-Cloud Auto-Fulfillment 时:
数据将复制到可访问该数据的每个协作者的账户。
数据也会复制到所有者所在的区域,无论他们是否可以访问数据产品。但是,他们访问数据的能力由数据产品的共享规则决定。
您可以通过运行 SELECT CURRENT_REGION(); 来确定您自己的云区域
在账户中启用 Cross-Cloud Auto-Fulfillment:
组织管理员必须调用 SYSTEM$ENABLE_GLOBAL_DATA_SHARING_FOR_ACCOUNT,对您的账户启用 LAF。有关更多信息,请参阅 管理自动履行权限。
要有适当的权限来查看或加入 LAF 协作,请使用 SAMOOHA_APP_ROLE,或使用被授予 MANAGE LISTING AUTO FULFILLMENT 账户级权限 的角色。
由于 复制频率,位于不同云托管区域的协作者将遇到一些额外的数据滞后。在 Collaboration Data Clean Room 中,复制频率尚不可配置。
示例:双方协作¶
以下示例演示双方协作,其中一方(名为“alice”)是协作创建者、她自己和 bob 的数据提供商以及分析运行者。另一方(名为“bob”)是他自己和 alice 的数据提供商,也是分析运行者。
该示例演示以下操作:
创建协作。
注册模板和数据产品。
在协作创建时添加模板和数据产品。
加入协作。
向现有协作添加模板和资源。
运行分析。
要运行此示例,您必须拥有两个已安装 Snowflake Data Clean Rooms 的不同账户。
您可以下载文件并将其上传到您的 Snowflake 账户,也可以使用 Snowsight 将示例代码复制并粘贴到两个单独账户的工作表中。
下载源 SQL 文件,然后将它们上传到两个已安装 Snowflake Data Clean Rooms 的独立账户:
-- Basic Snowflake Collaboration Data Clean Rooms example.
-- This file represents user "alice" in a two-collaborator clean room example.
-- Run this worksheet in a Snowflake account with access to the latest version of
-- Snowflake Data Clean Rooms.
-- This file demonstrates the following actions:
-- * How to register a template and a dataset
-- * How to create a collaboration with pre-registered resources.
-- * How to add a template to a collaboration that has already been created, and the
-- template approval flow.
-- * How to run an analysis.
-- For more information, read docs.snowflake.com/user-guide/cleanrooms/v2/using
USE WAREHOUSE APP_WH;
USE ROLE SAMOOHA_APP_ROLE;
-- Secondary roles must be disabled to call link_data_offerings and join.
USE SECONDARY ROLES NONE;
-- Register a data offering to use in the initial collaboration definition.
CALL samooha_by_snowflake_local_db.registry.register_data_offering(
$$
api_version: 2.0.0
spec_type: data_offering
version: v1
name: alice_data
datasets:
- alias: customer_list
data_object_fqn: SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS
object_class: custom
allowed_analyses: template_only
schema_and_template_policies:
hashed_email:
category: join_standard
column_type: hashed_email_b64_encoded
status:
category: passthrough
$$
);
-- Save the ID of the registered data offering.
SET my_data_offering_id = '<data_offering_id>';
CALL samooha_by_snowflake_local_db.registry.view_registered_data_offerings();
-- Register a template to use in the initial collaboration definition.
CALL samooha_by_snowflake_local_db.registry.register_template(
$$
api_version: 2.0.0
spec_type: template
name: alice_test_template
version: 2026_01_12_V1
type: sql_analysis
description: A test template
template:
SELECT t1.status, COUNT(*)
FROM IDENTIFIER( {{ source_table[0] }} ) AS t1
JOIN IDENTIFIER( {{ source_table[1] }} ) AS t2
ON t1.hashed_email = t2.hashed_email
GROUP BY t1.status;
$$);
-- Save the ID of the registered template.
SET my_template_id = '<template_id>';
CALL samooha_by_snowflake_local_db.registry.view_registered_templates();
-- Create a collaboration with the previously registered template and data offering.
-- The collaboration supports two collaborators, with aliases alice (this account) and bob.
-- Owner: alice
-- Analysis runners:
-- * alice, using her own data, and the template you created and registered earlier.
-- * bob, with no listed templates or data.
-- Data providers:
-- * alice and bob, for alice
-- * alice and bob, for bob
-- Resources added: The template and data offering alice registered earlier.
-- You will add more templates and data offerings to these users later. Only these
-- users are invited to the collaboration, and no additional users can be added later.
-- Replace the <...> placeholders with the appropriate values.
-- Account data sharing IDs are -- SELECT CURRENT_ORGANIZATION_NAME() || '.' || CURRENT_ACCOUNT_NAME();
CALL samooha_by_snowflake_local_db.collaboration.initialize(
$$
api_version: 2.0.0
spec_type: collaboration
name: my_first_collaboration
owner: alice
collaborator_identifier_aliases:
alice: <my account data sharing ID>
bob: <other account data sharing ID>
analysis_runners:
bob:
data_providers:
alice:
data_offerings: []
bob:
data_offerings: []
alice:
data_providers:
alice:
data_offerings:
- id: <data offering ID>
bob:
data_offerings: []
templates:
- id: <template ID>
$$
);
SET collaboration_id = '<collaboration_id>';
-- Creating a collaboration is asynchronous. Check to see when collaboration is CREATED.
CALL samooha_by_snowflake_local_db.collaboration.get_status($collaboration_id);
-- Collaboration is visible here when it's created.
CALL samooha_by_snowflake_local_db.collaboration.view_collaborations();
-- Join the collaboration that you created.
CALL samooha_by_snowflake_local_db.collaboration.join($collaboration_id);
-- Joining a collaboration is asynchronous. Call get_status until the status is JOINED.
CALL samooha_by_snowflake_local_db.collaboration.get_status($collaboration_id);
-- Auto-approve any template requests from other collaborators that affect you.
CALL samooha_by_snowflake_local_db.collaboration.enable_template_auto_approval(
$collaboration_id
);
-- SWITCH TO collaborator to join the collaboration and add a template.
-- Create a new template.
CALL samooha_by_snowflake_local_db.registry.register_template(
$$
api_version: 2.0.0
spec_type: template
name: limit_5_template
version: 2026_01_12_V1
type: sql_analysis
description: test_description
template:
select * from identifier({{ source_table[0] }}) limit 5;
$$
);
SET limit_5_template = '<template ID>';
-- Ask bob if they want to use your new template.
CALL samooha_by_snowflake_local_db.collaboration.add_template_request(
$collaboration_id,
$limit_5_template,
['alice', 'bob'] -- List of collaborators who can use this template.
);
-- SWITCH TO bob to approve the request. Request wasn't approved automatically
-- because bob didn't enable auto-approve.
-- See if bob approved the request.
CALL samooha_by_snowflake_local_db.collaboration.view_update_requests($collaboration_id);
-- See what the collaboration spec looks like now, after all the resource updates.
-- Collaboration updates are asynchronous, so if all changes that you made aren't present,
-- wait a minute or two, and then try again.
CALL samooha_by_snowflake_local_db.collaboration.view_collaborations() ->>
SELECT "COLLABORATION_SPEC" FROM $1 WHERE "SOURCE_NAME" = $collaboration_id;
-- Run an analysis.
-- Tables are scoped as <data_offering_id>.<alias>.
CALL samooha_by_snowflake_local_db.collaboration.view_data_offerings(
$collaboration_id
);
SET $bob_offering = '<bob data offering ID>';
CALL samooha_by_snowflake_local_db.collaboration.view_templates(
$collaboration_id
);
CALL samooha_by_snowflake_local_db.collaboration.run(
$collaboration_id,
$my_template_id,
[ -- Populate the source_table template variable.
'alice.' || $my_data_offering_id || '.customer_list', -- Specify which view in the data offering to use.
'bob.' || $bob_offering || '.my_customer_list'
],
[],
{}
);
-- Multi-step cleanup process to delete the collaborations.
-- Doesn't delete registered resources.
CALL samooha_by_snowflake_local_db.collaboration.teardown($collaboration_id);
CALL samooha_by_snowflake_local_db.collaboration.get_status($collaboration_id);
-- When get_status reports LOCAL_DROP_PENDING, call teardown again.
CALL samooha_by_snowflake_local_db.collaboration.teardown($collaboration_id);
-- Basic Snowflake Collaboration Data Clean Rooms example.
-- This file represents user "bob" in a two-collaborator clean room example.
-- Run this worksheet in a Snowflake account with access to the latest version of
-- Snowflake Data Clean Rooms.
-- This file demonstrates the following actions:
-- * Joining a collaboration
-- * Registering and adding a template and a data offering to an existing collaboration.
-- * Running an analysis.
-- For more information, read docs.snowflake.com/user-guide/cleanrooms/v2/using
USE WAREHOUSE APP_WH;
USE ROLE SAMOOHA_APP_ROLE;
-- Secondary roles can't be active when calling join or link_data_offering.
USE SECONDARY ROLES NONE;
-- Create a template.
CALL samooha_by_snowflake_local_db.registry.register_template(
$$
api_version: 2.0.0
spec_type: template
name: limit_10_template
version: 2026_01_12_V1
type: sql_analysis
description: test_description
template:
SELECT * FROM IDENTIFIER({{ SOURCE_TABLE[0] }}) LIMIT 10;
$$
);
SET limit_10_template = 'limit_10_template_2026_01_12_V1'; --'<template_id>';
-- See which collaborations you are invited to, or have joined.
CALL samooha_by_snowflake_local_db.collaboration.view_collaborations();
-- Use SOURCE_NAME column value from the response to view_collaborations().
SET collaboration_id = '<collaboration_id>';
-- Use OWNER_ACCOUNT column value from the response to view_collaborations().
SET collaborator_data_sharing_id = '<collaborator_id>';
-- Review and join the collaboration.
-- Joining is asynchronous, so you must call get_status until the status is JOINED before
-- you can perform actions on the collaboration.
CALL samooha_by_snowflake_local_db.collaboration.review($collaboration_id, $collaborator_data_sharing_id);
CALL samooha_by_snowflake_local_db.collaboration.join($collaboration_id);
CALL samooha_by_snowflake_local_db.collaboration.get_status($collaboration_id);
-- Offer to share a template with alice but not yourself.
-- Alice enabled auto-approve on her account, so this request will
-- be auto-approved, and the template will be added immediately.
CALL samooha_by_snowflake_local_db.collaboration.add_template_request($collaboration_id, $limit_10_template, ['alice']);
CALL samooha_by_snowflake_local_db.collaboration.view_update_requests($collaboration_id);
-- View templates that you can use in this collaboration. Notice that you can only see your own templates because
-- the initial collaboration spec permitted the other template only to alice, not to you (bob).
CALL samooha_by_snowflake_local_db.collaboration.view_templates($collaboration_id);
-- SWITCH TO other account and request adding a template, and then come back to approve the request.
-- You haven't enabled template auto-approve, so you must approve the request before the template is added.
CALL samooha_by_snowflake_local_db.collaboration.view_update_requests($collaboration_id);
CALL samooha_by_snowflake_local_db.collaboration.approve_update_request(
$collaboration_id,
'<request_ID>'
);
-- Register your own data offering.
CALL samooha_by_snowflake_local_db.registry.register_data_offering(
$$
api_version: 2.0.0
spec_type: data_offering
version: v1
name: bob_data
datasets:
- alias: my_customer_list
data_object_fqn: SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS_2
object_class: custom
allowed_analyses: template_only
schema_and_template_policies:
hashed_email:
category: join_custom
status:
category: passthrough
$$
);
SET my_data_id = '<data offering id>';
-- Share the data offering with yourself and alice.
CALL samooha_by_snowflake_local_db.collaboration.link_data_offering(
$collaboration_id,
$my_data_id,
['alice', 'bob']
);
-- Run an analysis with your template.
CALL samooha_by_snowflake_local_db.collaboration.run(
$collaboration_id,
$limit_10_template,
[
$my_data_id || '.my_customer_list',
],
[], -- No local data needed.
{} -- No template arguments needed.
);
-- SWITCH TO other account to run an analysis.
-- Try running an analysis using the template that you shared with alice but not yourself.
-- This will fail, because you aren't listed as an analysis
-- runner for this template.
CALL samooha_by_snowflake_local_db.collaboration.run(
$collaboration_id,
$limit_10_template,
[
$my_data_id || '.my_customer_list'
],
[],
{}
);