Dieses Thema führt Sie durch die Schritte zum Erstellen einer grundlegenden Zusammenarbeit mit mehreren Parteien. Es zeigt, wie Sie Vorlagen und Datenangebote registrieren, wie Sie der ersten Version einer Zusammenarbeit Daten hinzufügen und wie Teilnehmer nach der Erstellung der Zusammenarbeit Ressourcen hinzufügen können. Außerdem wird demonstriert, wie Sie Abfragen unter Verwendung von Vorlagen und Datenressourcen in der Zusammenarbeit ausführen können.
Grundlegender Workflow für die Zusammenarbeit im Clean Room¶
Hier ist ein grundlegendes Szenario für die Zusammenarbeit mit mehreren Parteien im Clean Room:
Der Eigentümer der Zusammenarbeit kann alle Vorlagen oder Datenangebote registrieren, die in der anfänglichen Konfiguration der Zusammenarbeit vorhanden sein sollen.
Der Eigentümer bittet optional alle vorgesehenen Teilnehmenden, Vorlagen oder Datenangebote zu registrieren, die in der Erstkonfiguration der Zusammenarbeit angezeigt werden sollen. Die Teilnehmenden geben dann die Ressourcen-IDs der registrierten Objekte an den Eigentümer weiter.
Der Eigentümer erstellt eine Zusammenarbeit. Die Zusammenarbeit wird durch eine Zusammenarbeits-YAML-Spezifikation definiert, die die Teilnehmenden, deren Rollen und alle Ressourcen auflistet, die in der ersten Version der Zusammenarbeit vorhanden sein sollen.
Wenn eine Zusammenarbeit erstellt wird, wird der Satz von Teilnehmern und deren Zusammenarbeitsrollen festgelegt.
Zusätzliche Ressourcen können von Teilnehmern nach der Erstellung der Zusammenarbeit hinzugefügt werden, wenn ihre Zusammenarbeitsrolle dies zulässt.
Teilnehmer können dann optional :ref:` zusätzliche Ressourcen mit der Zusammenarbeit verknüpfen<label-dcr_collaboration_add_resources_to_collab>`, wie z. B. Vorlagen und Datenangebote, abhängig von ihren Rollen für die Zusammenarbeit. Zusätzliche Ressourcen können jederzeit zu einer Zusammenarbeit hinzugefügt werden.
Wenn Sie Ressourcen in einer Zusammenarbeit zur Verfügung stellen möchten, sobald diese erstellt wird, muss der Eigentümer der Zusammenarbeit diese Ressourcen registrieren und verknüpfen, bevor er die Zusammenarbeit erstellen, und die Ressourcen-IDs in die Zusammenarbeitsspezifikation aufnehmen.
Wenn der Eigentümer erwartet, dass Ressourcen von Teilnehmenden verwendet werden, kann der Eigentümer diese Benutzenden auch auffordern, ihre Ressourcen zu registrieren und dem Eigentümer die Ressourcen-IDs zu nennen, die in die Zusammenarbeitsspezifikation aufgenommen werden sollen. Der Eigentümer gibt in der Zusammenarbeitsspezifikation auch an, dass jetzt keine Ressourcen verknüpft sind, aber in Zukunft verknüpft werden können.
Der Eigentümer ruft dann INITIALIZE auf, um mit der Erstellung der Zusammenarbeit zu beginnen. Standardmäßig verbindet INITIALIZE auch automatisch den Eigentümer mit der Zusammenarbeit. Dies ist ein asynchroner Prozess, daher muss der Eigentümer GET_STATUS so lange aufgerufen, bis der Status JOINED lautet.
Der folgende -Ausschnitt zeigt das Erstellen und Beitreten zu einer Zusammenarbeit.
1CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.INITIALIZE( 2$$ 3api_version:2.0.0 4spec_type:collaboration 5name:my_first_collaboration 6owner:alice 7collaborator_identifier_aliases: 8alice:example_com.acct_abc 9bob:another_example.acct_xyz10analysis_runners:11bob:12data_providers:13alice:14data_offerings:[]-- alice has not provided data to bob, but can do so in the future.15bob:16data_offerings:[customers_v1]-- bob has registered a data offering and made it available to himself.17templates:[]-- No templates available yet for bob.18alice:19data_providers:20alice:21data_offerings:[]22bob:23data_offerings:[]24templates:[]25 $$,26'APP_WH'-- Use this warehouse for initialization.27);-- XSMALL or SMALL warehouses are recommended for initialization.28SETcollaboration_name='my_first_collaboration';2930-- INITIALIZE automatically joins the owner. Check status until JOINED.31CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.GET_STATUS($collaboration_name);3233-- Collaboration is visible here when it's joined.34CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_COLLABORATIONS();
Anmerkungen zum Skript:
Die Zusammenarbeit besteht aus zwei Teilnehmern mit den Aliassen alice und bob. Sie können eine vollständige Datenfreigabe-ID überall dort verwenden, wo Sie einen Alias verwenden, aber das ist viel weniger benutzerfreundlich.
alice ist der Eigentümer.
Beide, alice und bob sind Analysis Runner.
Beide, alice und bob sind Datenanbieter füreinander.
Wenn Sie ein Datenanbieter sind, müssen Sie das data_offerings-Feld hinzufügen. Dieses Feld kann ausgefüllt oder leer sein und bedeutet, dass es derzeit keine Datenangebote gibt, aber diese können später hinzugefügt werden.
alice stellt keine Daten für bob oder sich selbst zur Verfügung, kann dies aber später tun (Zeilen 14, 22).
bob hat bereits ein Datenangebot registriert und es sich selbst in der ersten Zusammenarbeit zur Verfügung gestellt (Zeile 16).
bob stellt keine Daten für alice zur Verfügung, kann dies aber später tun (Zeile 24).
Weder alice noch bob haben noch Vorlagen zur Verfügung, die aber später zugewiesen werden können (Zeilen 18, 25). Beachten Sie, dass das Feld templates für einen Analysis Runner optional ist. Wenn Sie dieses Feld während der Initialisierung weglassen, können Teilnehmer diesem Analysis Runner später immer noch Vorlagen zuweisen.
Mitarbeiter können je nach ihrer Rolle für die Zusammenarbeit Ressourcen mit einer Zusammenarbeit verknüpfen oder Ressourcen entfernen, die sie mit der Zusammenarbeit verknüpft haben. Es gibt zwei Schritte, um eine Ressource mit einer Zusammenarbeit zu verknüpfen:
Der Ressourceneigentümer erstellt eine Ressourcendefinitionsspezifikation für die Ressource und verwendet sie, um die Ressource in seinem Konto zu registrieren. Sie können die Ressource in der Standard-Registry Ihres Kontos registrieren, oder Sie können eine benutzerdefinierte Registry verwenden.
Ein Teilnehmender verknüpft die Ressource mit einer Zusammenarbeit. Ressourcen können in eine Zusammenarbeit eingebunden werden – entweder bei der Erstellung der Zusammenarbeit, indem die Ressourcen-ID fest in der YAML-Definition hinterlegt wird, die zur Erstellung verwendet wird, oder nach der Erstellung und dem Beitritt zur Zusammenarbeit, indem die entsprechende Prozedur aufgerufen wird, um die Ressource einzubinden.
Nachdem die Ressource mit verknüpft wurde, kann sie von den angegebenen Teilnehmenden verwendet werden. Einige Ressourcentypen, wie z. B. Templates, können von jedem Teilnehmenden eingebunden werden; andere Ressourcen, wie z. B. Datenangebote, können nur von Nutzern mit der Zusammenarbeitsrolle „Datenanbieter“ eingebunden werden. Beachten Sie jedoch, dass Sie einer Zusammenarbeit beitreten müssen, bevor die von Ihnen bereitgestellten Ressourcen für die Zusammenarbeit verfügbar werden.
Ressourcen stehen nur den Teilnehmenden zur Verfügung, die in der Zusammenarbeitsspezifikation vorgesehen sind.
Bemerkung
Aktualisierungen einer bestehenden Zusammenarbeit, wie z. B. das Verknüpfen oder das Entfernen von Ressourcen, sind asynchron und nehmen einige Zeit in Anspruch. Rufen Sie VIEW_UPDATE_REQUESTS auf, um den Status einer Aktualisierung anzuzeigen. Das Verwenden einer Ressource, bevor sie vollständig verfügbar ist, kann zu inkonsistentem Verhalten führen.
Ressourcen unterstützen die Versionierung. Das Erstellen einer neuen Ressource mit einer neuen Version entfernt jedoch nicht die vorherige Version aus der Zusammenarbeit. Ressourcen werden eindeutig benannt, indem der vom Benutzenden angegebene Name und die Version (und Alias bei Datenangeboten) kombiniert werden.
Um mehr über die Verwendung von Ressourcen für die Zusammenarbeit zu erfahren, besuchen Sie Ressourcen.
Sie müssen einer Zusammenarbeit beitreten, um Ressourcen gemeinsam zu nutzen und Analysen in der Zusammenarbeit auszuführen.
Der Erstellende tritt automatisch bei, wenn INITIALIZE aufgerufen wird, sofern auto_join_warehouse angegeben ist. Ist auto_join_warehouse nicht angegeben, ruft der Erstellende JOIN auf, nachdem INITIALIZE abgeschlossen wurde.
Nicht Erstellende rufen REVIEW und dann JOIN auf.
REVIEW gibt einen Überblick über die Zusammenarbeit und ihre Ressourcen zurück. Sie können REVIEW nur einmal aufrufen.
JOIN installiert den Clean Room für die Zusammenarbeit in Ihrem Konto und tritt der Zusammenarbeit bei.
Sowohl INITIALIZE als auch JOIN sind asynchrone Prozeduren, die einige Minuten dauern. Sie müssen GET_STATUS aufrufen, um zu sehen, wann jeder Schritt abgeschlossen ist.
Wichtig
Wenn sich die Cloudhosting-Region Ihres Kontos von der des Zusammenarbeitseigentümers unterscheidet, löst REVIEW zusätzliche asynchrone Einrichtungsschritte aus. Rufen Sie REVIEW wiederholt auf, bis eine Erfolgreich-Antwort zurückgegeben wird, die anzeigt, dass das Setup abgeschlossen ist.
Das Verknüpfen ist ein asynchroner Prozess. Rufen Sie GET_STATUS auf, um zu sehen, wann der Status als JOINED aufgeführt ist.
Wenn Sie die Rolle des Analysis Runners in einer Zusammenarbeit haben, können Sie Analysen auf Datenquellen ausführen, die für Sie in der Zusammenarbeit freigegeben sind.
Eine Zusammenarbeit unterstützt zwei Arten von Abfragen:
Vorlagenanalysen. Diese Abfragen führen eine Vorlage aus (eine vorlagenbasierte JinjaSQL-Anweisung), die mit der Zusammenarbeit verknüpft sind. Bei Vorlagen kann es sich entweder um Analysevorlagen handeln, die Ihnen Ergebnisse sofort zurückgeben, oder um Aktivierungsvorlagen, die Ergebnisse im Snowflake-Konto eines bestimmten Teilnehmers speichern.
Freiform SQL-Abfragen. Wenn von einem Datenanbieter zugelassen, können Sie mit SQL auf bestimmte Datenangebote zugreifen, wenn Sie sich mit Ihren Teilnehmer-Anmeldeinformationen angemeldet haben. Sie führen SQL-Abfragen direkt aus – ohne eine Zusammenarbeits-API-Prozedur aufzurufen –, indem Sie auf den vollständig qualifizierten Anzeigenamen zugreifen, der von der Zusammenarbeit bereitgestellt wird.
Der Analyseausführende trägt die Kosten für die Durchführung einer Analyse.
Die Zusammenarbeitsspezifikation bestimmt, ob Sie eine Vorlage ausführen, Ergebnisse aktivieren oder Freiform-SQL-Abfragen ausführen können. Ihre Möglichkeiten sowie die Daten und Vorlagen, die Sie verwenden können, sind in der Spezifikation für die Zusammenarbeit beschrieben.
Bemerkung
Spalten aus den Datenquellen haben möglicherweise neue Namen, wenn sie für die Vorlage oder den Benutzenden zugänglich sind. Unter Umbenennen der Quellspalte erfahren Sie mehr darüber, wie und wann Quellspalten umbenannt werden. Vorlagen und vom Benutzenden bereitgestellte Argumente (z. B. der Name einer Verknüpfungsspalte) sollten den endgültigen Namen und nicht den ursprünglichen Namen verwenden, wenn die Spalte umbenannt wird.
Erfahren Sie mehr über alle diese Analysetypen in den folgenden Abschnitten.
Um eine Analyse aus einer Vorlage auszuführen, zeigen Sie die Liste der Vorlagen am, die Sie ausführen können, zeigen Sie die Liste der Datenangebote an, die Sie verwenden können, und rufen Sie dann RUN mit Ihren Werten auf, entweder als einzelne Parameter oder als Analysespezifikation im YAML-Format:
Tabellen, die Sie im Feld source_tables in der Ausführungskonfiguration angeben, befüllen den source_table-Parameter in der Vorlage. Der my_table-Parameter der Vorlage wird nur befüllt bzw. verwendet, wenn Sie die Standard Edition von Snowflake mit Ihren eigenen Daten nutzen.
Bemerkung
Die Installation von Ressourcen ist asynchron. Wenn eine Vorlage gerade installiert wurde, kann es eine kurze Zeit dauern, bis sie ausführungsbereit ist. Wenn die Vorlage ein Code-Bundle enthält, kann es etwas länger dauern, bis die Vorlage verfügbar ist. Erfahren Sie, wie Sie feststellen können, ob ein Code-Bundle verfügbar ist.
Das folgende Beispiel listet Datenangebote und Vorlagen auf, auf die der Benutzer zugreifen kann, und führt anschließend eine Analyse mit der sales_join_template-Vorlage aus (von dem angenommen wird, dass es von VIEW_TEMPLATES aufgelistet wird), wobei fünf benannte Argumente an die Vorlage übergeben werden.
-- See which data offerings are available.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_DATA_OFFERINGS($collaboration_name);-- See which templates you can run.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_TEMPLATES($collaboration_name);-- Pass in the arguments in analysis YAML format.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.RUN($collaboration_name,$$api_version:2.0.0spec_type:analysisname:My_analysisdescription:Sales results Q2 2025template:sales_join_templatetemplate_configuration:view_mappings:source_tables:-user1_alias.data_offering_v1.table_1-user2_alias.another_data_offering_v1.table_2arguments:-- The template defines conv_purchase_id and the other four arguments.conv_purchase_id:PURCHASE_ID -- You must examine a template to see which arguments it supports.conv_purchase_amount:PURCHASE_AMOUNTpublisher_impression_id:IMPRESSION_IDpublisher_campaign_name:CAMPAIGN_NAMEpublisher_device_type:DEVICE_TYPE $$);
Aktivieren und Ausführen von Freiform-SQL-Abfragen für Ihre Daten¶
Ein Datenanbieter kann einer Analyse die Berechtigung gewähren, beliebige SQL-Abfragen auf ihre Datenangebote auszuführen. Das bedeutet, dass der Analysis Runner eine beliebige SQL-Abfrage direkt auf dem Datenangebot ausführen kann, statt eine Vorlage aufzurufen.
Weitere Informationen zu Freiform-SQL-Abfragen finden Sie unter SQL-Freiformabfragen.
Ausführen einer Analyse mit Ihren eigenen Daten, wenn Sie die Standard Edition verwenden¶
Wenn Sie die Standard Edition verwenden, können Sie eine Analyse mit der Standardmethode ausführen. Sie können jedoch keine Daten mit der Zusammenarbeit verknüpfen, um sie für andere Benutzer freizugeben. Die einzige Möglichkeit, eigene Datensets an eine Vorlage zu übergeben, ist die Verwendung der hier beschriebenen Technik.
So verwenden Sie Ihre eigenen Daten für eine Zusammenarbeit auf der Snowflake Standard Edition:
Registrieren Sie Ihr Datenangebot, indem Sie REGISTER_DATA_OFFERING aufrufen.
Rufen Sie LINK_LOCAL_DATA_OFFERING auf, um Ihre Daten mit der Zusammenarbeit zu verknüpfen, damit Sie sie verwenden können. Kein anderer Teilnehmende kann lokal verknüpfte Daten sehen oder darauf zugreifen.
Verwenden Sie die Datenangebots-ID, wenn Siel RUN aufrufen.
Wenn Sie die parametrisierte Version von RUN verwenden, übergeben Sie die Datenangebots-IDs an den local_template_view_names-Parameter weiter.
Wenn Sie die YAML-Version vonRUN verwenden, stellen Sie Ihre Datenangebots-IDs im local_view_mappings.my_tables-Abschnitt der Anforderung bereit
Wenn Sie die parametrisierte Version von RUN verwenden, übergeben Sie die Datenangebots-IDs an den local_template_view_names-Parameter weiter.
Tipp
local_template_view_names und``local_view_mappings.my_tables`` füllen den my_table-Parameter in der Vorlage aus.
Das folgende Beispiel zeigt, wie Sie eine Vorlage unter Verwendung der Ausführungsprozedurversion mit dem YAML-Format ausführen. Dieses Beispiel schließt das Feld my_tables ein, das durch Aufrufen von LINK_LOCAL_DATA_OFFERING ausgefüllt wird.
-- See what data offerings are available. Your own local data will be listed here as well.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_DATA_OFFERINGS($collaboration_name);-- Pass in the arguments in analysis YAML format.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.RUN($collaboration_name,$$api_version:2.0.0spec_type:analysisname:my_analysisdescription:Cross-purchase results for Q4 2025template:mytemplate_v1template_configuration:view_mappings:source_tables:-ADVERTISER1.ADVERTISER_DATA_V1.CUSTOMERS-PUBLISHER.ADVERTISER_DATA_V1.CUSTOMERSlocal_view_mappings:my_tables:-PARTNER.MY_DATA_V1.MY_CUSTOMERS# Populate my_table array with my own table.arguments:# Template arguments, as name: value pairsconv_purchase_id:PURCHASE_IDconv_purchase_amount:PURCHASE_AMOUNTpublisher_impression_id:IMPRESSION_IDpublisher_campaign_name:CAMPAIGN_NAMEpublisher_device_type:DEVICE_TYPE $$);
Wenn der Datenanbieter und die Zusammenarbeitsspezifikation dies zulassen, können Sie die Analyseergebnisse in Ihrem eigenen Snowflake-Konto oder im Snowflake-Konto eines bestimmten Teilnehmers speichern. Eine Vorlage aktiviert entweder die Ergebnisse oder gibt die Ergebnisse sofort zurück, nicht beides.
Nicht-Eigentümer verlassen eine Zusammenarbeit, indem sie LEAVE aufrufen. Alle von ihnen bereitgestellten Datenangebote werden aus der Zusammenarbeit entfernt. Sie können einer Zusammenarbeit nicht wieder beitreten, nachdem Sie sie verlassen haben.
Zusammenarbeitseigentümer können eine Zusammenarbeit nicht verlassen. Die Eigentümerschaft kann nicht übertragen werden. Ein Eigentümer einer Zusammenarbeit kann eine Zusammenarbeit für alle Teilnehmenden löschen, indem er TEARDOWN aufruft.
Beide Prozesse sind asynchron. Sie müssen GET_STATUS aufrufen, um den Status zu überwachen, und LEAVE oder TEARDOWN erneut aufrufen, wenn GET_STATUS den Status als LOCAL_DROP_PENDING anzeigt.
Die folgenden SQL-Beispiele zeigen, wie Sie eine grundlegende Zusammenarbeit erstellen und ausführen:
Beispiel für die Zusammenarbeit zwischen zwei Parteien¶
Das folgende Beispiel zeigt eine Zwei-Parteien-Zusammenarbeit: Eine Partei (mit dem Namen „alice“) ist die Erstellerin der Zusammenarbeit, Datenanbieterin für sich selbst und „bob“ sowie Analysis Runner. „bob“ ist Datenanbieter für sich selbst und „alice“ und fungiert ebenfalls als Analysis Runner.
Das Beispiel veranschaulicht die folgenden Aktionen:
Erstellen einer Zusammenarbeit
Registrieren von Vorlagen und Datenangeboten
Hinzufügen einer Vorlage und eines Datenangebots zum Zeitpunkt der Erstellung der Zusammenarbeit.
Beitreten zu einer Zusammenarbeit
Verknüpfen zusätzlicher Ressourcen mit einer bestehenden Zusammenarbeit
Ausführen einer Analyse
Um dieses Beispiel auszuführen, müssen Sie über zwei separate Konten mit installierten Snowflake Data Clean Rooms verfügen.
Sie können die Dateien entweder herunterladen und in Ihr Snowflake-Konto hochladen oder den Beispielcode kopieren und in die Arbeitsblätter von zwei separaten Konten einfügen, indem Sie die Snowsight verwenden.
Laden Sie die SQL-Quelldateien herunter, und laden Sie diese dann in zwei separate Konten hoch, für die Snowflake Data Clean Rooms installiert ist:
-- 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/overviewUSEWAREHOUSEAPP_WH;USEROLESAMOOHA_APP_ROLE;-- Secondary roles must be disabled to call link_data_offerings.USE SECONDARY ROLESNONE;CREATEDATABASEIFNOTEXISTSALICE_DB;CREATESCHEMAIFNOTEXISTSALICE_DB.ALICE_SCH;CREATEORREPLACETABLEALICE_DB.ALICE_SCH.ALICE_DATAASSELECT*FROMsamooha_sample_database.demo.customersLIMIT100;-- Register a data offering to use in the initial collaboration definition.CALLsamooha_by_snowflake_local_db.registry.register_data_offering($$api_version: 2.0.0spec_type: data_offeringversion: v1name:<alicedataofferingname>datasets:-alias: customer_listdata_object_fqn: ALICE_DB.ALICE_SCH.ALICE_DATAobject_class: customallowed_analyses: template_onlyschema_and_template_policies: hashed_email: category: join_standardcolumn_type: hashed_email_b64_encodedstatus: category: passthrough $$);-- Save the ID of the registered data offering. SETalice_data_offering_id='<data_offering_id>';CALLsamooha_by_snowflake_local_db.registry.view_registered_data_offerings();-- Register a template to use in the initial collaboration definition.CALLsamooha_by_snowflake_local_db.registry.register_template($$api_version: 2.0.0spec_type: templatename: alice_only_templateversion:<version_number>type: sql_analysisdescription: Atesttemplatetemplate: SELECTt1.status,COUNT(*)FROMIDENTIFIER({{source_table[0]}})ASt1JOINIDENTIFIER({{source_table[1]}})ASt2ONt1.hashed_email_b64_encoded=t2.hashed_email_b64_encodedGROUPBYt1.status;$$);-- Save the ID of the registered template.SETmy_template_id='<alice_only_template_id>';CALLsamooha_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();CALLsamooha_by_snowflake_local_db.collaboration.initialize($$api_version: 2.0.0spec_type: collaborationname: my_first_collaboration_1_0owner: alicecollaborator_identifier_aliases: alice:<myaccountdatasharingID>bob:<bobaccountdatasharingID>analysis_runners: bob: data_providers: alice: data_offerings:-id:<alicedataofferingID>bob: data_offerings:[]alice: data_providers: alice: data_offerings:-id:<alicedataofferingID>bob: data_offerings:[]templates:-id:<aliceonlytemplateID>$$,'APP_WH');SETcollaboration_name='<collaboration_name>';-- INITIALIZE automatically joins the owner. Check status until JOINED.CALLsamooha_by_snowflake_local_db.collaboration.get_status($collaboration_name);-- Collaboration is visible here when the owner has joined.CALLsamooha_by_snowflake_local_db.collaboration.view_collaborations();-- Auto-approve any template requests from other collaborators that affect you.CALLsamooha_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.CALLsamooha_by_snowflake_local_db.registry.register_template($$api_version: 2.0.0spec_type: templatename: both_use_templateversion: 2026_01_12_V1type: sql_analysisdescription: test_descriptiontemplate: select*fromidentifier({{source_table[0]}})limit5; $$);SETboth_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.CALLsamooha_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.CALLsamooha_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.CALLsamooha_by_snowflake_local_db.collaboration.view_collaborations()->>SELECT"COLLABORATION_SPEC"FROM$1WHERE"SOURCE_NAME"=$collaboration_name;-- SWITCH TO bob to add a data offering.-- Run an analysis.-- Tables are scoped as <data_offering_id>.<alias>.CALLsamooha_by_snowflake_local_db.collaboration.view_data_offerings($collaboration_name);SET$bob_data_offering='<bob data offering ID>';CALLsamooha_by_snowflake_local_db.collaboration.view_templates($collaboration_name);-- Run bob's template.-- Replace the placeholders with your variables.CALLsamooha_by_snowflake_local_db.collaboration.run($collaboration_name,$$api_version: 2.0.0spec_type: analysisdescription:<optionaldescriptionoftheanalysis>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.CALLsamooha_by_snowflake_local_db.collaboration.teardown($collaboration_name);CALLsamooha_by_snowflake_local_db.collaboration.get_status($collaboration_name);-- When get_status reports LOCAL_DROP_PENDING, call teardown again.CALLsamooha_by_snowflake_local_db.collaboration.teardown($collaboration_name);DROPDATABASEALICE_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/overviewUSEWAREHOUSEAPP_WH;USEROLESAMOOHA_APP_ROLE;-- Secondary roles can't be active when calling join or link_data_offering.USE SECONDARY ROLESNONE;-- Create sample data.CREATEDATABASEIFNOTEXISTSBOB_DB;CREATESCHEMAIFNOTEXISTSBOB_DB.BOB_SCH;CREATEORREPLACETABLEBOB_DB.BOB_SCH.BOB_DATAASSELECT*FROMsamooha_sample_database.demo.customers_2LIMIT100;-- See which collaborations you are invited to, or have joined.CALLsamooha_by_snowflake_local_db.collaboration.view_collaborations();-- Use SOURCE_NAME column value from the response to view_collaborations().SETcollaboration_name='<collaboration name>';-- Use OWNER_ACCOUNT column value from the response to view_collaborations().SETcollaborator_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.CALLsamooha_by_snowflake_local_db.collaboration.review($collaboration_name,$collaborator_data_sharing_id);CALLsamooha_by_snowflake_local_db.collaboration.join($collaboration_name);CALLsamooha_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.CALLsamooha_by_snowflake_local_db.registry.register_template($$api_version: 2.0.0spec_type: templatename: auto_approve_templateversion: V1type: sql_analysisdescription: test_descriptiontemplate: SELECT*FROMIDENTIFIER({{SOURCE_TABLE[0]}})LIMIT10; $$);SETauto_approve_template='<template_id>';CALLsamooha_by_snowflake_local_db.collaboration.add_template_request($collaboration_name,$auto_approve_template,['alice','bob']);CALLsamooha_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.CALLsamooha_by_snowflake_local_db.collaboration.view_update_requests($collaboration_name);CALLsamooha_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.CALLsamooha_by_snowflake_local_db.registry.register_data_offering($$api_version: 2.0.0spec_type: data_offeringversion: v3name: bob_datadatasets:-alias: my_customer_listdata_object_fqn: BOB_DB.BOB_SCH.BOB_DATAobject_class: customallowed_analyses: template_onlyschema_and_template_policies: hashed_email: category: join_standardcolumn_type: hashed_email_b64_encodedstatus: category: passthrough $$);SETmy_data_id='<data offering id>';-- Share the data offering with yourself and alice.CALLsamooha_by_snowflake_local_db.collaboration.link_data_offering($collaboration_name,$my_data_id,['alice','bob']);CALLsamooha_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.CALLsamooha_by_snowflake_local_db.collaboration.view_templates($collaboration_name);-- Run an analysis with your template.CALLsamooha_by_snowflake_local_db.collaboration.run($collaboration_name,$$api_version: 2.0.0spec_type: analysisdescription:<optionaldescriptionoftheanalysis>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.CALLsamooha_by_snowflake_local_db.collaboration.run($collaboration_name,$$api_version: 2.0.0spec_type: analysisdescription:<optionaldescriptionoftheanalysis>template:'<alice_only_template>'template_configuration: view_mappings: source_tables:-'<my_data_offering_view_name>'-'<bob_data_offering_view_name>' $$);-- Clean up resources.DROPDATABASEBOB_DB;
Dieses Beispiel zeigt, wie Sie eine Zusammenarbeit erstellen und verwenden, wenn Sie nur ein einziges Konto zum Testen haben.
Das Beispiel zeigt, wie Sie eine Zusammenarbeit mit einem Datenangebot und einer Vorlage erstellen, dann ein weiteres Datenangebot und eine Vorlage hinzufügen, nachdem die Zusammenarbeit erstellt wurde, und Analysen durchführen.
Sie können entweder die Datei herunterladen und in Ihr Snowflake-Konto hochladen oder den Beispielcode kopieren und in ein Arbeitsblatt einfügen, indem Sie Snowsight verwenden.
Laden Sie die Quell-SQL-Datei herunter, und laden Sie sie dann in ein Snowflake-Konto hoch, in dem|samooha-clean-room-plural| installiert ist:
-- ============================================================================-- Single-user Collaboration Clean Rooms demo-- ============================================================================-- This example demonstrates a basic Snowflake Data Clean Rooms collaboration-- using a single Snowflake account and a single role: SAMOOHA_APP_ROLE.-- One user acts as the owner, data provider, and analysis runner.---- The user creates two sample datasets, registers two data offerings and two-- templates, then creates a collaboration with one data offering and one template each.-- After the collaboration is created, the user links the remaining data offering and-- template, then runs an analysis with each template. Finally, the code-- cleans up all resources used.---- For more information, see:-- docs.snowflake.com/user-guide/cleanrooms/overview-- docs.snowflake.com/user-guide/cleanrooms/spec-reference-- ============================================================================-- ============================================================================-- SETUP: Create sample databases and data.-- ============================================================================USEROLESAMOOHA_APP_ROLE;USEWAREHOUSEAPP_WH;-- You can't use secondary roles with most collaboration procedures.USE SECONDARY ROLESNONE;CREATEDATABASEIFNOTEXISTSDEMO_DB;CREATESCHEMAIFNOTEXISTSDEMO_DB.DATA_SCH;-- Dataset 1: 300 rows from CUSTOMERS.CREATEORREPLACETABLEDEMO_DB.DATA_SCH.CUSTOMERS_1ASSELECTHASHED_EMAIL,STATUS,AGE_BANDFROMSAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERSLIMIT300;-- Dataset 2: 300 rows from CUSTOMERS_2.CREATEORREPLACETABLEDEMO_DB.DATA_SCH.CUSTOMERS_2ASSELECTHASHED_EMAIL,STATUS,AGE_BANDFROMSAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS_2LIMIT300;-- ============================================================================-- Register data offerings and templates.-- ============================================================================-- Register the first data offering.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.REGISTER_DATA_OFFERING($$api_version: 2.0.0spec_type: data_offeringversion: V1name: customers_1datasets:-alias: customers_1data_object_fqn: DEMO_DB.DATA_SCH.CUSTOMERS_1object_class: customallowed_analyses: template_onlyschema_and_template_policies: hashed_email: category: join_standardcolumn_type: hashed_email_b64_encodedstatus: category: passthroughage_band: category: passthrough $$);SETdata_offering_1_id='<data_offering_1_id>';-- Register the second data offering.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.REGISTER_DATA_OFFERING($$api_version: 2.0.0spec_type: data_offeringversion: V1name: customers_2datasets:-alias: customers_2data_object_fqn: DEMO_DB.DATA_SCH.CUSTOMERS_2object_class: customallowed_analyses: template_onlyschema_and_template_policies: hashed_email: category: join_standardcolumn_type: hashed_email_b64_encodedstatus: category: passthroughage_band: category: passthrough $$);SETdata_offering_2_id='<data_offering_2_id>';-- Register a template that joins two tables on hashed_email and returns-- a count of rows grouped by age_band.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.REGISTER_TEMPLATE($$api_version: 2.0.0spec_type: templatename: age_band_countversion: V1type: sql_analysisdescription: Joinstwotablesonhashed_emailandreturnsage_bandwithrowcounts.template: SELECTt1.age_band,COUNT(t1.age_band)ASage_band_countFROMIDENTIFIER({{source_table[0]}})ASt1JOINIDENTIFIER({{source_table[1]}})ASt2ONt1.hashed_email_b64_encoded=t2.hashed_email_b64_encodedGROUPBYt1.age_band;$$);SETage_band_template_id='<age_band_template_id>';-- Register a template that joins two tables on hashed_email and returns-- a count of rows grouped by status.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.REGISTER_TEMPLATE($$api_version: 2.0.0spec_type: templatename: status_countversion: V1type: sql_analysisdescription: Joinstwotablesonhashed_emailandreturnsstatuswithrowcounts.template: SELECTt1.status,COUNT(t1.status)ASstatus_countFROMIDENTIFIER({{source_table[0]}})ASt1JOINIDENTIFIER({{source_table[1]}})ASt2ONt1.hashed_email_b64_encoded=t2.hashed_email_b64_encodedGROUPBYt1.status;$$);SETstatus_template_id='<status_template_id>';-- Confirm that both data offerings and both templates are registered.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.VIEW_REGISTERED_DATA_OFFERINGS();CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.VIEW_REGISTERED_TEMPLATES();-- ============================================================================-- Create the collaboration with one data offering and one template.-- ============================================================================-- Replace <account_data_sharing_id> with:-- SELECT CURRENT_ORGANIZATION_NAME() || '.' || CURRENT_ACCOUNT_NAME();CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.INITIALIZE($$api_version: 2.0.0spec_type: collaborationname: single_user_demoowner: mecollaborator_identifier_aliases: me:<account_data_sharing_id>analysis_runners: me: data_providers: me: data_offerings:-id:<data_offering_1_id>templates:-id:<age_band_template_id> $$,'APP_WH');SETcollaboration_name='<collaboration_name>';-- Verify that the owner has joined. Repeat until status is JOINED.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.GET_STATUS($collaboration_name);-- ============================================================================-- Link the remaining data offering and template into the collaboration.-- ============================================================================-- Link the second data offering.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.LINK_DATA_OFFERING($collaboration_name,$data_offering_2_id,['me']);-- Add the status_count template to the collaboration.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.ADD_TEMPLATE_REQUEST($collaboration_name,$status_template_id,['me']);-- ============================================================================-- List resources and run analyses.-- ============================================================================-- List all data offerings in the collaboration.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_DATA_OFFERINGS($collaboration_name);-- List all templates in the collaboration.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_TEMPLATES($collaboration_name);-- Run the age_band_count template.-- Replace placeholders with the template name/version and view names from-- VIEW_TEMPLATES and VIEW_DATA_OFFERINGS.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.RUN($collaboration_name,$$api_version: 2.0.0spec_type: analysisdescription: Countmatchingrowsgroupedbyage_band.template:'<age_band_count_template_name_and_version>'template_configuration: view_mappings: source_tables:-'<data_offering_view_1>'-'<data_offering_view_2>' $$);-- Run the status_count template.-- Replace placeholders with the template name/version and view names from-- VIEW_TEMPLATES and VIEW_DATA_OFFERINGS.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.RUN($collaboration_name,$$api_version: 2.0.0spec_type: analysisdescription: Countmatchingrowsgroupedbystatus.template:'<status_count_template_name_and_version>'template_configuration: view_mappings: source_tables:-'<data_offering_view_1>'-'<data_offering_view_2>' $$);-- ============================================================================-- CLEANUP: Delete the collaboration, registered resources, and sample data.-- ============================================================================-- Teardown is a multi-step process. Call TEARDOWN, then wait for GET_STATUS-- to report LOCAL_DROP_PENDING, then call TEARDOWN again.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.TEARDOWN($collaboration_name);CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.GET_STATUS($collaboration_name);-- When GET_STATUS reports LOCAL_DROP_PENDING, call TEARDOWN again to complete.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.TEARDOWN($collaboration_name);-- Unregister the data offerings and templates from the default registry.CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.UNREGISTER_DATA_OFFERING($data_offering_1_id);CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.UNREGISTER_DATA_OFFERING($data_offering_2_id);CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.UNREGISTER_TEMPLATE($age_band_template_id);CALLSAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.UNREGISTER_TEMPLATE($status_template_id);-- Drop the sample database.DROPDATABASEIFEXISTSDEMO_DB;