Este tópico aborda as etapas para criar uma colaboração básica de várias partes. Ele demonstra como registrar modelos e ofertas de dados, como adicionar dados à versão inicial de uma colaboração e como os colaboradores podem adicionar recursos após a criação da colaboração. Ele também demonstra como executar consultas usando modelos e recursos de dados na colaboração.
Fluxo de trabalho básico de colaboração de sala limpa¶
Veja a seguir um cenário básico de colaboração de sala limpa de várias partes:
O proprietário da colaboração registra modelos ou ofertas de dados que deseja que apareçam na configuração inicial da colaboração.
O proprietário pode pedir que qualquer colaborador pretendido registre os modelos ou as ofertas de dados que deseja que apareçam na configuração inicial da colaboração. Sendo assim, os colaboradores fornecem para o proprietário os IDs dos recurso dos itens registrados.
O proprietário cria uma colaboração. A colaboração é definida por uma especificação YAML que lista os colaboradores, suas funções e todos os recursos que devem estar presentes na versão inicial da colaboração.
Quando uma colaboração é criada, o conjunto de colaboradores e suas funções de colaboração é fixo.
Os colaboradores podem adicionar mais recursos após a criação da colaboração, se a função de colaboração deles permitir isso.
Depois disso, os colaboradores poderão vincular recursos adicionais à colaboração, como modelos e ofertas de dados, dependendo das funções de colaboração deles. É possível adicionar mais recursos a uma colaboração a qualquer momento.
Se você quiser disponibilizar recursos em uma colaboração assim que ela for criada, o proprietário da colaboração registra e vincula os recursos antes de criar a colaboração e inclui os IDs dos recursos na especificação.
Se o proprietário pretende usar recursos de colaboradores, ele também pode solicitar que esses usuários registrem seus recursos e forneçam ao proprietário os IDs dos recursos para incluir na especificação da colaboração. O proprietário também indica na especificação da colaboração o local onde não há nenhum recurso vinculado agora, mas que poderá haver no futuro.
Depois disso, o proprietário chama INITIALIZE para começar a criar a colaboração. Por padrão, INITIALIZE também adiciona automaticamente o proprietário à colaboração. Este é um processo assíncrono, portanto o proprietário deve chamar GET_STATUS até que o status seja JOINED.
O trecho a seguir demonstra como criar e ingressar em uma colaboração.
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();
Observações sobre o script:
A colaboração consiste em dois colaboradores, com os aliases alice e bob. Você poderá usar um ID completo de compartilhamento de dados sempre que usar um alias, mas isso não é muito prático.
alice é a proprietária.
Ambos alice e bob são executores de análise.
Ambos alice e bob são provedores de dados um do outro.
Se você é provedor de dados, deve incluir o campo data_offerings. Esse campo pode estar preenchido ou vazio, indicando que não há ofertas de dados agora, mas que elas poderão ser adicionadas posteriormente.
alice não está fornecendo dados para bob nem para si mesma, mas poderá fazer isso mais tarde (linhas 14, 22).
bob já registrou uma oferta de dados e a forneceu a si mesmo na colaboração inicial (linha 16).
bob não está fornecendo dados para alice, mas poderá fazer isso mais tarde (linha 24).
Nem alice nem bob ainda tem modelos disponíveis, mas poderão ter mais tarde (linhas 18, 25). Observe que o campo templates é opcional para um executor de análise. Se você omitir esse campo durante a inicialização, os colaboradores ainda poderão atribuir modelos a esse executor de análise posteriormente.
Os colaboradores podem vincular recursos a uma colaboração ou remover recursos que vincularam à colaboração, de acordo com a função de colaboração deles. Há duas etapas para vincular um recurso a uma colaboração:
O proprietário do recurso cria uma especificação de definição do recurso e a utiliza para registrar o recurso em sua conta. É possível registrar o recurso no registro padrão da sua conta ou usar um registro personalizado.
Um colaborador vincula o recurso a uma colaboração. Os recursos podem ser vinculados a uma colaboração quando ela é criada codificando o ID do recurso na definição YAML usada para criar a colaboração ou, depois que a colaboração é criada e ingressada, chamando o procedimento apropriado para vincular o recurso à colaboração.
Depois que o recurso for vinculado, ele poderá ser usado pelos colaboradores designados. Alguns tipos de recursos, como modelos, podem ser vinculados por qualquer colaborador; outros recursos, como ofertas de dados, podem ser vinculados somente por usuários com a função de colaboração de provedor de dados. No entanto, observe que você deve ingressar em uma colaboração para que os recursos com os quais você contribuiu fiquem disponíveis para ela.
Os recursos estão disponíveis apenas para os colaboradores designados por uma especificação de colaboração.
Nota
As atualizações em uma colaboração existente, como vincular ou remover recursos, são assíncronas e levam algum tempo para serem concluídas. Chame VIEW_UPDATE_REQUESTS para ver o status de uma atualização. Usar um recurso antes que ele esteja totalmente disponível pode resultar em comportamento inconsistente.
Os recursos oferecem suporte a controle de versão; no entanto, criar um novo recurso com uma nova versão não remove a versão anterior da colaboração. Os recursos são nomeados de forma exclusiva combinando o nome e a versão fornecidos pelo usuário (e o alias, no caso de ofertas de dados).
Para saber mais sobre o uso de recursos na sua colaboração, consulte Recursos.
Você deve ingressar em uma colaboração para compartilhar recursos e executar análises nela.
O criador ingressa automaticamente ao chamar INITIALIZE se auto_join_warehouse foi fornecido. Se auto_join_warehouse não foi fornecido, o criador chama JOIN depois que INITIALIZE é concluído.
Os não criadores chamam REVIEW e, depois, JOIN.
REVIEW retorna uma visão geral da colaboração e seus recursos. Você pode chamar REVIEW apenas uma vez.
JOIN instala a sala limpa de colaboração em sua conta e ingressa na colaboração.
Ambos INITIALIZE e JOIN são procedimentos assíncronos que levam vários minutos para serem concluídos. Você deve chamar GET_STATUS para ver quando cada etapa é concluída.
Importante
Se a região de hospedagem em nuvem da sua conta for diferente da do proprietário da colaboração, REVIEW acionará etapas adicionais de configuração assíncrona. Chame REVIEW várias vezes até retornar uma resposta bem-sucedida, indicando que a configuração foi concluída.
A ingressão é um processo assíncrono. Chame GET_STATUS para ver quando o status aparece como JOINED.
Se você tiver a função de executor de análise em uma colaboração, poderá executar análises em fontes de dados compartilhadas com você na colaboração.
As colaborações oferecem suporte a dois tipos de consultas:
Análises de modelo. Essas consultas executam um modelo (uma instrução JinjaSQL modelada) vinculado à colaboração. Os modelos podem ser de análise, que retornam resultados imediatamente para você, ou de ativação, que salvam os resultados na conta Snowflake de um participante designado.
Consultas SQL de forma livre. Se permitido por um provedor de dados, você poderá acessar ofertas de dados especificadas usando SQL quando fizer login com suas credenciais de colaborador. Você executa as consultas SQL diretamente, sem chamar um procedimento da Collaboration API, acessando o nome da exibição totalmente qualificado exposto pela de colaboração.
O executor de análise arca com o custo da execução de uma análise.
A especificação da colaboração determina se você pode executar um modelo, ativar resultados ou fazer consultas SQL de forma livre. Suas capacidades, assim como os dados e os modelos disponíveis para você usar, estão descritos na especificação da colaboração.
Nota
As colunas das fontes de dados podem ter novos nomes quando expostas ao modelo ou usuário. Consulte Renomeação da coluna de origem para saber como e quando as colunas de origem são renomeadas. Modelos e argumentos fornecidos pelo usuário (como um nome de coluna de junção) deverão usar o nome final, não o nome original, se a coluna for renomeada.
Saiba mais sobre todos esses tipos de análise nas seções a seguir.
Para executar uma análise com base em um modelo, visualize a lista de modelos que você pode executar, visualize a lista de ofertas de dados que você pode usar e chame RUN com seus valores, seja como parâmetros individuais ou como uma especificação da análise no formato YAML.
As tabelas que você passa para o campo source_tables na configuração de execução preenchem o parâmetro source_table no modelo. O parâmetro my_table do modelo não é preenchido ou usado, a menos que você use o Snowflake Standard Edition com seus próprios dados.
Nota
A instalação de recursos é assíncrona. Se um modelo acabou de ser instalado, pode levar algum tempo para ficar disponível para execução. Se o modelo incluir um pacote de código, poderá levar mais tempo para que o modelo fique disponível. Veja como determinar quando um pacote de código está disponível.
O exemplo a seguir lista as ofertas de dados e os modelos que o usuário pode acessar e, em seguida, executa uma análise usando o modelo sales_join_template (que já se presume ser listado por VIEW_TEMPLATES), passando cinco argumentos nomeados para o modelo.
-- 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 $$);
Habilitar e executar consultas SQL de forma livre nos dados¶
Um provedor de dados pode conceder permissão ao executor de análise para executar consultas SQL arbitrárias em suas ofertas de dados. Isso significa que o executor da análise pode executar uma consulta SQL arbitrária diretamente na oferta de dados, em vez de chamar um modelo.
Executar uma análise com seus próprios dados ao usar a Standard Edition¶
Se você usa a Standard Edition, pode executar uma análise da maneira padrão. Entretanto, não é possível vincular dados à colaboração para compartilhar com outros usuários. A única maneira de passar seus próprios conjuntos de dados para um modelo é usando a técnica descrita aqui.
Para usar seus próprios dados em uma colaboração no Snowflake Standard Edition:
Registre sua oferta de dados chamando REGISTER_DATA_OFFERING.
Chame LINK_LOCAL_DATA_OFFERING para vincular seus dados à colaboração para você usar. Nenhum outro colaborador pode ver ou acessar dados vinculados localmente.
Use o ID da oferta de dados quando você chamar RUN.
Se você usa a versão parametrizada de RUN, passe os IDs das ofertas de dados para o parâmetro local_template_view_names.
Se você usa a versão YAML de RUN, forneça os IDs das ofertas de dados na estrofe local_view_mappings.my_tables da solicitação.
Se você usa a versão parametrizada de RUN, passe as IDs das ofertas de dados para o parâmetro local_template_view_names.
Dica
local_template_view_names e``local_view_mappings.my_tables`` preenchem o parâmetro my_table no modelo.
O exemplo a seguir mostra como executar um modelo usando a versão de formato YAML do procedimento de execução. Este exemplo inclui o campo my_tables, que é preenchido com a chamada de LINK_LOCAL_DATA_OFFERING.
-- 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 $$);
Se o provedor de dados e a especificação da colaboração permitirem, você poderá salvar os resultados da análise em sua própria conta Snowflake ou na conta Snowflake de um colaborador designado. Um modelo ativa os resultados ou retorna os resultados imediatamente, não ambos.
Para sair de uma colaboração, os não proprietários chamam LEAVE. Todas as ofertas de dados fornecidas por eles serão removidas da colaboração. Não é possível reingressar em uma colaboração depois que você sai dela.
Os proprietários da colaboração não podem sair de uma colaboração porque a propriedade não pode ser transferida. Um proprietário de colaboração pode descartar uma colaboração para todos os colaboradores chamando TEARDOWN.
Ambos os processos são assíncronos. Você deve chamar GET_STATUS para monitorar o status e chamar LEAVE ou TEARDOWN novamente quando GET_STATUS mostra o status como LOCAL_DROP_PENDING.
O exemplo a seguir demonstra uma colaboração de duas partes, em que uma parte (chamada «alice») é criadora da colaboração, provedora de dados para si mesma e para «bob» e executora de análise. «Bob» é provedor de dados para si mesmo e para «alice», e também é executor de análise.
O exemplo demonstra as seguintes ações:
Criar uma colaboração
Registrar modelos e ofertas de dados
Vincular um modelo e uma oferta de dados no momento da criação da colaboração
Ingressar em uma colaboração
Vincular recursos adicionais a uma colaboração existente.
Executar uma análise
Para executar este exemplo, você deve ter duas contas separadas com o Snowflake Data Clean Rooms instalado.
Você pode baixar os arquivos e carregá-los em sua conta Snowflake ou copiar e colar o código de exemplo em planilhas em duas contas separadas usando o Snowsight.
Baixe os arquivos SQL de origem e carregue-os em duas contas separadas que tenham o Snowflake Data Clean Rooms instalado:
-- 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;
Este exemplo demonstra como criar e usar uma colaboração se você tem apenas uma conta para teste.
O exemplo demonstra a criação de uma colaboração com uma oferta de dados e um modelo, depois a adição de outra oferta de dados e modelo após a criação da colaboração e a execução de análises.
Você pode baixar o arquivo e carregá-lo em sua conta Snowflake ou copiar e colar o código de exemplo em uma planilha usando o Snowsight.
Baixe o arquivo SQL de origem e carregue-o em uma conta Snowflake que tenha o Snowflake Data Clean Rooms instalado:
-- ============================================================================-- 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;