Snowflake Collaboration Data Clean Roomsの使用¶
このトピックでは、Collaboration Data Clean Roomsを使用するための上位レベルのガイドを提供します。また、コラボレーションの作成または参加に必要なすべての主要なステップの詳細も提供します。
要件¶
Snowflake Data Clean Roomsの最新バージョンに更新済み である必要があります。
所有者とデータプロバイダーはSnowflake Enterprise Editionを使用する必要があります。分析実行者はStandard Editionを使用できます。
コラボレーションを表示または管理するためには、Data Clean Rooms Collaboration API へのアクセスが必要です。詳細については、 DCR Collaboration API へのアクセスを管理する をご参照ください。
Collaboration API を使用する場合、環境内のセカンダリロールを無効にする必要があります。
USE SECONDARY ROLES NONE;
基本的なクリーンルームコラボレーションワークフロー¶
以下は、簡単なクリーンルームコラボレーションシナリオです。
コラボレーションの 所有者 は、オプションで、コラボレーションの初期構成に表示したいテンプレートやデータ提供を登録します。
所有者は、オプションで、意図したコラボレーターに対して、コラボレーションの初期構成に表示したいテンプレートやデータ提供を登録するよう依頼します。その後、コラボレーターは、登録したアイテムのリソース IDs を通知します。
次に、所有者 が コラボレーションを作成します。コラボレーションは、コラボレーター、そのロール、およびコラボレーションの初期バージョンに存在すべきすべてのリソースをリストしたコラボレーション YAML 仕様によって定義されます。
コラボレーションが作成されると、コラボレーターとそのロールのセットが固定され、コラボレーション定義にロールが含まれているコラボレーターのみが参加するよう招待されます。同様に、分析実行者のセットも固定されます。ただし、新しいデータをコラボレーションにリンクすることで、どのコラボレーターもデータプロバイダーになることができます。
コラボレーションに他のクラウドホスティングリージョンのユーザーが含まれている場合、そのユーザーがコラボレーションを確認して参加するには アカウントでクロスクラウド自動フルフィルメントを有効にする 必要があります。
所有者が作成したコラボレーションに参加すると、コラボレーションがアクティブ化します。これで、仕様内のすべてのコラボレーターがコラボレーションを表示して参加できるようになります。
コラボレーターは、コラボレーションを確認して参加します。
コラボレーターはオプションで、テンプレート、およびデータプロバイダーの場合はデータ提供などの リソースをコラボレーションに追加 できます。
分析実行者はコラボレーションで利用可能なデータ(およびオプションで非共有のローカルデータ)を使用して、コラボレーションで 割り当てられたテンプレートを実行 できます。分析のコストは分析実行者が負担します。テンプレートはクエリ結果を応答で返すか、呼び出し元または別のコラボレーターに対してアクティブ化 します。
次のセクションでは、これらの各手順の詳細について説明します。
コラボレーションの作成¶
コラボレーションを作成するには、コラボレーション仕様 を設計して、すべてのコラボレーターと それらのロール を定義します。コラボレーションの所有者は、オプションで、初期コラボレーションで利用できるようにしたい 他のリソースを登録およびリンク して、コラボレーション仕様にリソースを含めます。コラボレーターからのリソースの使用を予定している場合、所有者はそれらのユーザーにリソースを登録し、コラボレーション仕様に含めるリソース IDs を所有者に伝えるよう依頼することもできます。
次に、所有者は INITIALIZE を呼び出してコラボレーションの作成を開始します。デフォルトでは、INITIALIZEは所有者もコラボレーションに自動的に参加させます。これは非同期プロセスであるため、ステータスが JOINED になるまで 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: []
$$,
'APP_WH'
);
SET collaboration_name = '<collaboration_name>';
-- INITIALIZE automatically joins the owner. Check status until JOINED.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.GET_STATUS($collaboration_name);
-- Collaboration is visible here when it's joined.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_COLLABORATIONS();
コラボレーションへのリソースの追加¶
コラボレーターは、コラボレーションにリソースを追加したり、コラボレーションに追加したリソースを削除したりすることができます。コラボレーションにリソースを追加するには、2つのステップがあります。
リソースの所有者は追加するリソースの リソース定義仕様 を作成し、それを使用してリソースをアカウントに登録します。リソースはアカウントの デフォルトレジストリ に登録するか、または、カスタムレジストリを使用できます。
コラボレーターは、リソースをコラボレーションにリンクします。リソースがリンクされると、指定されたコラボレーターが使用できるようになります。テンプレートなど、一部のリソースタイプは、どのコラボレーターでもリンクできます。データ提供などのその他のリソースは、データプロバイダーのロールを持つユーザーのみがリンクできます。リソースは通常、コラボレーション仕様とリソース共有者によって定義された特定のコラボレーターのみが利用できます。
リソースは、コラボレーションの作成前または作成後にコラボレーションに追加できます。
リソースはバージョン管理をサポートしています。ただし、新しいバージョンを持つ新しいリソースを作成しても、以前のバージョンはコラボレーションから削除されません。
リソースには、ユーザーが提供する名前とバージョン(およびデータ提供の場合はエイリアス)を組み合わせることにより、一意の名前が付けられます。
コラボレーションには以下のリソースを追加できます。
テンプレート¶
テンプレートは指定されたコラボレーターが実行できる JinjaSQL クリーンルームテンプレートです。コラボレーターは誰でもテンプレートを登録し、コラボレーションにテンプレートを追加することができます。ただし、以下のステップに記載するように、影響を受けるすべてのコラボレーターがリクエストを承認する必要があります。自身のアカウントに登録されているテンプレートのみを追加または削除できます。
コラボレーションにテンプレートを追加するには:
コラボレーション用のテンプレートを設計し、テンプレート仕様 に埋め込みます。
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 の場合、拒否理由がリクエストレポートに表示されます。テンプレートがすべてのユーザーに承認されてからテンプレートが利用可能になるまでに少し時間がかかる場合があります。テンプレートが使用可能であることを確認するには、
view_templatesを呼び出します。
Tip
登録したテンプレートを確認するには、REGISTRY.VIEW_REGISTERED_TEMPLATES を呼び出します。
コラボレーションのテンプレートデザイン¶
コラボレーションテンプレートは クリーンルームテンプレート と同一ですが、いくつかの特別な考慮事項があります。
コラボレーションにリストされた共有テーブルは、テンプレートの
source_table変数の入力に使用されます。my_tableは、分析実行者がローカルの非共有データを使用する場合にのみ使用されます。テンプレートのmy_table変数を使用する場合、その変数に割り当てられたテーブルはコラボレーション内で共有されないことに注意してください。データソースの列は、テンプレートやユーザーに公開されると、新しい名前になる可能性があります。ソース列の名前がいつ、どのように変更されるかについて詳しくは、ソース列の名前変更 を参照してください。列の名前が変更された場合、テンプレートとユーザー指定の引数(参加列名など)では、元の名前ではなく変更後の名前を使用する必要があります。
コラボレーションのアクティベーションテンプレートは、名前が
activation_template_nameである必要はありません。その他すべて アクティベーションテンプレートの要件 は引き続き適用されます。
Snowflake Data Clean Roomsのカスタムテンプレート構文について詳しくは、カスタムクリーンルームテンプレートのリファレンス を参照してください。
データ提供¶
*データ提供*とは、コラボレーションの特定の分析実行者と共有される1つ以上のデータビューのセットのことです。データ提供は、コラボレーションにリストされているデータプロバイダーが追加できます。データ提供は、data offering ID.alias というスコープ形式で公開されます。ここで、ariasはデータ提供の特定のビューです。特定のコラボレーターとデータ提供を共有できるのは、コラボレーション仕様 でその分析実行者のデータプロバイダーとしてリストされている場合のみです。
データ提供は、データのライブビューであり、データ提供が作成または登録されたときのデータのスナップショットではありません。ソースデータに適用されるすべてのSnowflakeポリシーは、コラボレーションで有効です。
データ提供を登録すると、データ提供仕様 にリストされた各データソースのビューが作成されます。ビューには、データ提供仕様にリストされた列のみが含まれます。データ提供をコラボレーションにリンクすると、Snowflakeは コラボレーション仕様 に従って、そのデータ提供にアクセスできるすべての分析実行者にアクセス保護されたビューのコピーを作成します。基になるテーブルを移動、名前変更、またはアクセス許可を変更すると、データ提供は以前に登録されたリンクで使用できなくなります。
Snowflake Standard Editionを使用している場合、データ提供を他のコラボレーターと共有することはできませんが、自身のデータをクエリで使用 できます。
要件:
共有したいデータの OWNERSHIP が必要です。そうでないと、コラボレーションに参加しようとしたときに、「参照使用許可がありません」というエラーが表示されます。この問題の処理方法についての詳細。
コラボレーションの データプロバイダーロール が必要です。
データ提供は、次のステップでコラボレーションに追加されます。
データの データ提供仕様 を作成します。
REGISTRY.REGISTER_DATA_OFFERINGを呼び出してデータ提供を登録します。データ提供 ID が返されます。このステップにより、データ提供を、アクセス可能なコラボレーションにリンク*できるようになります*。同じデータ提供 ID を使用してデータ提供を複数のコラボレーションと共有できます。
次のステップは、コラボレーションが作成されているかどうかによって異なります。
コラボレーションがまだ作成されていない場合、データプロバイダーは、コラボレーション定義 に追加するデータ提供 ID をコラボレーション作成者に提供します。データ提供がコラボレーション定義に追加されると、データプロバイダーがコラボレーションに参加した後、コラボレーションのすべてのユーザーにそのデータ提供が表示されます。
コラボレーションがすでに作成済みである場合、データプロバイダーはコラボレーションに参加し、データ提供 ID、コラボレーション名、およびデータ共有者を指定して
COLLABORATION.LINK_DATA_OFFERINGを呼び出します。データ提供がすべてのユーザーによって承認された後、データ提供が使用可能になるまでに少し時間がかかる場合があります。データが使用可能になったかどうかを確認するには、view_data_offeringsを呼び出します。
コラボレーションからデータリソースを削除するには、
unlink_data_offeringを呼び出します。
各データ提供は、1つ以上のテーブルまたはビューを表します。個々のテーブルには、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 として参照します。
データ提供は、データ提供を登録したユーザーがコラボレーションに参加するまで、コラボレーションでは表示されません。
Tip
共有するデータの OWNERSHIP がない場合、データ提供するコラボレーションに参加したり、データ提供をリンクしたりしようとすると、エラーが発生します。エラーメッセージには、ACCOUNTADMIN がコラボレーションにデータアクセスを付与するために実行が必要な SQL コマンドに関する情報が提供されています。ACCOUNTADMIN が コマンドを実行すると、ユーザーがコラボレーションに参加できるようになります。詳細情報。
クエリを実行するとき、分析実行者はデータ提供を ID によって COLLABORATION.RUN の source_tables パラメーターに渡します。
登録済みデータ提供を表示するには、VIEW_REGISTERED_DATA_OFFERINGS を呼び出します。
データへの利用ポリシーの適用¶
参加または集計ポリシーなどのSnowflake列ポリシーを共有データに適用するには、2つの方法があります。
ソースデータにポリシーを適用します。 ソースデータに適用されたポリシーが、コラボレーションで公開されるデータセットに適用されます。ポリシーをユーザーに確実に伝えてください。
自由形式のクエリで使用するときに、データ提供にポリシーを適用します。 データ提供で自由形式のクエリを許可する場合は、データの自由形式のクエリで強制する列ポリシーを指定できます。データ提供仕様で、自由形式クエリの列ポリシーを指定します。これらのポリシーは、ソーステーブルに設定されている既存の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];
コラボレーションへの参加¶
コラボレーションに貢献したリソースをコラボレーションで利用可能にしたり、コラボレーションで分析を実行可能にしたりするには、コラボレーションに参加する必要があります。
INITIALIZEを呼び出すと、*作成者*は自動的に参加します(``auto_join_warehouse``が指定されている場合を除く)。自動参加が無効になっている場合、作成者は別途JOINを呼び出します。
非作成者 は REVIEW と JOIN を呼び出します。
重要
アカウントがコラボレーション所有者と異なるクラウドホスティングリージョンにある場合:
アカウントでクロスクラウド自動フルフィルメントが有効になっていない 場合、
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_name);
-- See which templates you can run.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_TEMPLATES($collaboration_name);
-- Pass in the arguments in analysis YAML format.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.RUN(
$collaboration_name,
$$
api_version: 2.0.0
spec_type: analysis
name: My_analysis
description: Sales results Q2 2025
template: sales_join_template
template_configuration:
view_mappings:
source_tables:
- user1_alias.data_offering_v1.table1
- user2_alias.another_data_offering_v1.table_2
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 権限を持つ分析実行者ロールを付与されている必要があります。
データプロバイダーのステップ¶
コラボレーターがコマンドラインからデータセットをクエリできるようにするには、データセットの説明で、:codenowrap: を 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_name);
+-------------------------------+------------------------+------------------------------+------------------------------+---------------------------------------+ | 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 | alias_name.test_data_offering_v0.customers| +-------------------------------+------------------------+------------------------------+------------------------------+---------------------------------------+
これで、コラボレーターが自由形式の SQL クエリを使用して、FREEFORM_SQL_VIEW_NAME 列にリストされているテーブルをクエリできるようになります。
SELECT * FROM alias_name.test_data_offering_v0.customers;
テーブルに適用されるすべてのポリシーが強制されます。
Standard Editionの使用時に、自分のデータを使用して分析を実行する¶
Standard Editionを使用している場合は、標準の方法 で分析を実行できます。ただし、コラボレーションの説明に自分のデータを追加して、他のユーザーと共有することはできません。
Standard Editionユーザーとして、コラボレーションで自分のデータを使用するには:
データ提供を登録するために、
REGISTRY.REGISTER_DATA_OFFERINGを呼び出します。列名を指定する必要があります。COLLABORATION.LINK_LOCAL_DATA_OFFERINGを呼び出します。COLLABORATION.VIEW_DATA_OFFERINGSを呼び出したとき、自分の提供は自分のみに表示されます。他のコラボレーターのリストには表示されません。COLLABORATION.RUNを呼び出すとき、local_template_view_namesパラメーターで、または分析 YAML で渡す場合は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_name);
-- Pass in the arguments in analysis YAML format.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.RUN(
$collaboration_name,
$$
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 ロールを使用していない場合、つまり、アクセス管理プロシージャ によって管理されるロールを使用している場合、自分が分析実行者でありコラボレーション仕様に activation_destinations が含まれるコラボレーションに参加するには REGISTERDATAOFFERING 権限が必要です。
クエリの結果をアクティブ化するには:
適切な仕様で、すべてのアクティベーション列に以下のプロパティが設定されていることを確認してください。
アクティブ化列を持つテーブルの データ提供仕様 で、その列を
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: user1.2025_orders.sales templates: - id: activation_template_v0 activation_destinations: snowflake_collaborators: - publisher_1 ....
分析仕様 は、
snowflake_collaboratorおよびsegment_name値を含むactivationセクションを含み、カスタムテンプレートのコラボレーションガイドライン を呼び出す必要があります。標準の分析テンプレートを実行しても、結果をアクティブ化することはできません。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: join_column: ip_address advertiser_activation_column: purchase_amount publisher_activation_column: device_type activation: snowflake_collaborator: publisher_1 segment_name: q1_2025
注釈
activation_policyフィルターが適用されたテンプレート内のすべての列は、データ提供仕様内でactivation_allowed値が TRUE に設定されている必要があります。以下の例は、分析実行者が提供した2つの列にアクティベーションポリシーが適用されたテンプレートを示しています。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ですぐに利用可能になります。クエリ結果の表示方法について詳しくは、最後のステップを参照してください。他のコラボレーターに対してアクティブ化する場合:
コラボレーターは SHARED のステータスが返されるまで
VIEW_ACTIVATIONSを呼び出します。別のアカウントにアクティブ化すると、大きな結果セットの場合はかなりの時間がかかることがあります。これは、データをコラボレーターのアカウントに転送して復号化する必要があるためです。アクティベーションのステータスが 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 を再び呼び出す必要があります。
クロスクラウド自動フルフィルメントの有効化¶
コラボレーション所有者と同じクラウドホストリージョンにいない場合、コラボレーションに参加するには、アカウントで クロスクラウド自動フルフィルメント </collaboration/provider-listings-auto-fulfillment>`(LAF)を有効にする必要があります。別のクラウドリージョンでのコラボレーションをレビューしようとしているときにアカウントで LAF が有効になっていないか、適切な権限がない場合は、コラボレーションに対して ``REVIEW` を呼び出すとエラーが表示されます。
注釈
コラボレーションでクロスクラウドの自動フルフィルメントが使用されている場合:
データは、そのデータにアクセスできる各コラボレーターのアカウントに複製されます。
データは、所有者がデータ提供にアクセスできるかどうかに関係なく、所有者のリージョンにも複製されます。ただし、データにアクセスできるかどうかは、データ提供の共有ルールによって決定されます。
自分のクラウドホストリージョンを特定するには、SELECT CURRENT_REGION(); を実行します。
自分のアカウントでクロスクラウド自動フルフィルメントを有効にするには
組織管理者が SYSTEM$ENABLE_GLOBAL_DATA_SHARING_FOR_ACCOUNT を呼び出してアカウントの LAF を有効にする必要があります。詳細については、 自動フルフィルメントの権限を管理する をご参照ください。
LAF コラボレーションをレビューまたは参加するための適切な権限を取得するには、SAMOOHA_APP_ROLE を使用するか、または MANAGELISTINGAUTOFULFILLMENT アカウントレベル権限 が付与されたロールを使用します。
別のクラウドホストリージョンにいるコラボレーターには、複製の頻度 のため追加のデータラグが発生します。複製の頻度はCollaboration Data Clean Roomではまだ設定できません。
例:二者間のコラボレーション¶
次の例は、二者間のコラボレーションを示しています。1人目(「alice」という名前)は、コラボレーションの作成者であり、自身とbobのデータプロバイダーであり、分析実行者です。2人目(「bob」という名前)は、自分自身とaliceのデータプロバイダーであり、分析実行者です。
次の例は、次のアクションを示しています。
コラボレーションの作成。
テンプレートとデータ提供の登録。
コラボレーション作成時のテンプレートとデータ提供の追加。
コラボレーションへの参加。
既存のコラボレーションへのテンプレートとリソースの追加。
分析の実行。
この例を実行するには、Snowflake Data Clean Rooms がインストールされた2つの別々のアカウントが必要です。
ファイルをダウンロードしてSnowflakeアカウントにアップロードするか、Snowsight を使用してサンプルコードを2つの別々のアカウントのワークシートにコピーして貼り付けることができます。
ソース SQL ファイルをダウンロードした後、Snowflake Data Clean Rooms がインストールされた2つの別々のアカウントにアップロードします。
ダウンロード:
コラボレーション所有者「alice」ワークシート </samples/clean-rooms/demo-collaboration-hub-alice.sql>ダウンロード:
コラボレーションメンバー「bob」ワークシート </samples/clean-rooms/demo-collaboration-hub-bob.sql>
-- 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.
-- This scenario involves two collaborators: bob and alice
-- bob and alice each submits one data source
-- bob and alice are data providers for themselves and each other
-- bob submits one template that only alice can use
-- alice submits one template that they can both use, and one template that only alice can use
-- 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.
USE SECONDARY ROLES NONE;
CREATE DATABASE IF NOT EXISTS ALICE_DB;
CREATE SCHEMA IF NOT EXISTS ALICE_DB.ALICE_SCH;
CREATE OR REPLACE TABLE ALICE_DB.ALICE_SCH.ALICE_DATA AS SELECT * FROM samooha_sample_database.demo.customers LIMIT 100;
-- 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 offering name>
datasets:
- alias: customer_list
data_object_fqn: ALICE_DB.ALICE_SCH.ALICE_DATA
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 alice_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_only_template
version: <version_number>
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_b64_encoded = t2.hashed_email_b64_encoded
GROUP BY t1.status;
$$);
-- Save the ID of the registered template.
SET my_template_id = '<alice_only_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_1_0
owner: alice
collaborator_identifier_aliases:
alice: <my account data sharing ID>
bob: <bob account data sharing ID>
analysis_runners:
bob:
data_providers:
alice:
data_offerings:
- id: <alice data offering ID>
bob:
data_offerings: []
alice:
data_providers:
alice:
data_offerings:
- id: <alice data offering ID>
bob:
data_offerings: []
templates:
- id: <alice only template ID>
$$,
'APP_WH'
);
SET collaboration_name = '<collaboration_name>';
-- INITIALIZE automatically joins the owner. Check status until JOINED.
CALL samooha_by_snowflake_local_db.collaboration.get_status($collaboration_name);
-- Collaboration is visible here when the owner has joined.
CALL samooha_by_snowflake_local_db.collaboration.view_collaborations();
-- Auto-approve any template requests from other collaborators that affect you.
CALL samooha_by_snowflake_local_db.collaboration.enable_template_auto_approval(
$collaboration_name
);
-- SWITCH TO collaborator to join the collaboration and add a template
-- The template will be auto-approved.
-- Create a new template.
CALL samooha_by_snowflake_local_db.registry.register_template(
$$
api_version: 2.0.0
spec_type: template
name: both_use_template
version: 2026_01_12_V1
type: sql_analysis
description: test_description
template:
select * from identifier({{ source_table[0] }}) limit 5;
$$
);
SET both_use_template = '<template ID>';
-- Ask to add the template to the collaboration. You must ask bob, because you're
-- including bob in the sharing list. When you share a template with yourself,
-- you auto-approve it.
CALL samooha_by_snowflake_local_db.collaboration.add_template_request(
$collaboration_name,
$both_use_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_name);
-- 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_name;
-- SWITCH TO bob to add a data offering.
-- Run an analysis.
-- Tables are scoped as <data_offering_id>.<alias>.
CALL samooha_by_snowflake_local_db.collaboration.view_data_offerings(
$collaboration_name
);
SET $bob_data_offering = '<bob data offering ID>';
CALL samooha_by_snowflake_local_db.collaboration.view_templates(
$collaboration_name
);
-- Run bob's template.
-- Replace the placeholders with your variables.
CALL samooha_by_snowflake_local_db.collaboration.run(
$collaboration_name,
$$
api_version: 2.0.0
spec_type: analysis
description: <optional description of the analysis>
template: '<alice_only_template>'
template_configuration:
view_mappings:
source_tables:
- '<alice_data_offering_view_name>'
- '<bob_data_offering_view_name>'
$$
);
-- Multi-step cleanup process to delete the collaborations.
-- Doesn't delete registered resources.
CALL samooha_by_snowflake_local_db.collaboration.teardown($collaboration_name);
CALL samooha_by_snowflake_local_db.collaboration.get_status($collaboration_name);
-- When get_status reports LOCAL_DROP_PENDING, call teardown again.
CALL samooha_by_snowflake_local_db.collaboration.teardown($collaboration_name);
DROP DATABASE ALICE_DB;
-- 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 sample data.
CREATE DATABASE IF NOT EXISTS BOB_DB;
CREATE SCHEMA IF NOT EXISTS BOB_DB.BOB_SCH;
CREATE OR REPLACE TABLE BOB_DB.BOB_SCH.BOB_DATA AS SELECT * FROM samooha_sample_database.demo.customers_2 LIMIT 100;
-- 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_name = '<collaboration name>';
-- 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_name, $collaborator_data_sharing_id);
CALL samooha_by_snowflake_local_db.collaboration.join($collaboration_name);
CALL samooha_by_snowflake_local_db.collaboration.get_status($collaboration_name);
-- Demonstrate the auto-approve flow.
-- Alice enabled auto-approve on her account, so this request will
-- be auto-approved, and the template will be added immediately.
-- Create a template.
CALL samooha_by_snowflake_local_db.registry.register_template(
$$
api_version: 2.0.0
spec_type: template
name: auto_approve_template
version: V1
type: sql_analysis
description: test_description
template:
SELECT * FROM IDENTIFIER({{ SOURCE_TABLE[0] }}) LIMIT 10;
$$
);
SET auto_approve_template = '<template_id>';
CALL samooha_by_snowflake_local_db.collaboration.add_template_request($collaboration_name, $auto_approve_template, ['alice', 'bob']);
CALL samooha_by_snowflake_local_db.collaboration.view_update_requests($collaboration_name);
-- 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_name);
CALL samooha_by_snowflake_local_db.collaboration.approve_update_request(
$collaboration_name,
'<request_ID>'
);
-- SWITCH TO bob to see the request status.
-- 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: v3
name: bob_data
datasets:
- alias: my_customer_list
data_object_fqn: BOB_DB.BOB_SCH.BOB_DATA
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
$$
);
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_name,
$my_data_id,
['alice', 'bob']
);
CALL samooha_by_snowflake_local_db.collaboration.view_data_offerings(
$collaboration_name
);
-- View templates that you can use in this collaboration. You can run only templates that list you in the
-- SHARED_WITH column.
CALL samooha_by_snowflake_local_db.collaboration.view_templates($collaboration_name);
-- Run an analysis with your template.
CALL samooha_by_snowflake_local_db.collaboration.run(
$collaboration_name,
$$
api_version: 2.0.0
spec_type: analysis
description: <optional description of the analysis>
template: '<both_use_template>'
template_configuration:
view_mappings:
source_tables:
- '<my_data_offering_view_name>'
- '<bob_data_offering_view_name>'
$$
);
-- SWITCH TO other account to run an analysis.
-- Try running an analysis using alice-only template.
-- This will fail, because you aren't listed as an analysis
-- runner for this template.
CALL samooha_by_snowflake_local_db.collaboration.run(
$collaboration_name,
$$
api_version: 2.0.0
spec_type: analysis
description: <optional description of the analysis>
template: '<alice_only_template>'
template_configuration:
view_mappings:
source_tables:
- '<my_data_offering_view_name>'
- '<bob_data_offering_view_name>'
$$
);
-- Clean up resources.
DROP DATABASE BOB_DB;