Clean Room에서 사용자 정의 함수를 업로드하고 실행해요.

Clean Room에서 사용자 정의 함수를 업로드하고 실행해요.


지원 종료 공지

레거시 Provider 및 Consumer Data Clean Rooms는 지원이 중단됩니다. 날짜와 마이그레이션 안내는 지원 종료 타임라인을 참조하세요.


출처: 문서

본문


Overview

여러분은 커스텀 Python UDF와 UDTF를 clean room에 업로드하고 템플릿에서 실행하여 복잡한 데이터 작업을 수행할 수 있어요. 이러한 작업에는 쿼리 내에서 머신러닝이나 맞춤형 데이터 조작이 포함되며, 단일 단계 또는 multi-step flow의 일부로 수행할 수 있어요. Python은 커스텀 UDF에서 지원되는 유일한 코딩 언어예요.

업로드한 코드는 approved bundle of Python packages와 Snowpark API의 패키지를 가져와서 사용할 수 있어요.

clean room의 템플릿은 템플릿을 추가한 계정이 업로드한 코드를 호출할 수 있어요. 업로드된 코드는 보거나 다운로드할 수 없어요. Snowflake는 코드를 설치하기 전에 보안 문제가 있는지 업로드된 코드를 검사해요.

역할에 따라 clean room에 코드를 업로드하는 다양한 메커니즘이 있어요:

Providers

  • Inline code upload: clean room의 기본 컴퓨팅 리소스를 사용하여 코드를 업로드하고, 표준 Python 패키지 번들(Snowpark API 포함)만 사용해야 한다면 인라인 코드를 업로드해야 해요.

  • Snowpark Container Services running within a clean room: 환경을 더 세밀하게 제어해야 하는 경우(예: 추가 컴퓨팅 또는 사용자 지정 라이브러리 지정) clean room 내에서 컨테이너를 실행할 수 있어요.

Consumers

  • Inline upload with template: 소비자는 코드가 번들된 템플릿을 업로드하고 실행할 수 있어요. 코드는 템플릿에 바인딩되며 clean room 공급자의 승인을 받아야 해요.

이 항목에서는 공급자 또는 소비자로서 커스텀 Python UDF와 UDTF를 업로드하고 실행하는 방법을 보여줘요.

팁

clean room에서 자신만의 Python UDF를 개발하는 방법에 대한 배경 정보는 다음 항목을 참조하세요:

업로드된 코드의 진입점

업로드된 코드 번들 각각은 서로를 호출하는 여러 함수를 정의할 수 있지만, 번들은 하나의 핸들러 함수만 노출해요. 이 핸들러 함수는 clean room을 사용하는 누구나 만들거나 실행한 템플릿에서 호출할 수 있어요. 코드가 내부 테이블을 생성하는 경우, Using internal tables for multistep workflows에 설명된 대로 해당 테이블에 액세스할 수 있어요.

예를 들어, 두 개의 숫자 매개변수를 받는 simple_add라는 함수를 업로드했다면, 여기에 표시된 것처럼 템플릿에서 호출할 수 있어요. 함수는 항상 cleanroom 범위를 사용하여 참조돼요. 예를 들어, 템플릿은 simple_add를 다음과 같이 호출할 수 있어요:

SELECT cleanroom.simple_add({{ price | sqlsafe | int }}, {{ tax | sqlsafe | int }}) ...

팁

공급자가 위 코드를 실행하려면, 집계 함수나 커스텀 함수를 사용하는 모든 SELECT 열에 별칭(alias)을 지정해야 해요. 결과 테이블이 내부적으로 생성되기 때문이에요:

SELECT
  cleanroom.simple_add(
    {{ price | sqlsafe | int }}, {{ tax | sqlsafe | int }}
    ) AS TOTAL_ITEM_COST
...

단일 패키지에 여러 함수를 업로드할 수 있고, 단일 패키지 내의 함수는 서로를 호출할 수 있지만, 다른 패키지의 함수는 호출할 수 없어요. (단, 핸들러 함수는 호출할 수 있어요.) 예를 들어, 각각 핸들러 함수와 두 개의 헬퍼 함수가 있는 두 패키지를 업로드하는 clean room이 있다고 가정해 보세요:

업로드된 Python 패키지 두 개가 있는 clean room







패키지 1 패키지 2
Handler function A Helper function A1 Helper function A2 Handler function B Helper function B1 Helper function B2
  • 어느 쪽(공급자 또는 소비자)이 업로드한 코드든, 어느 쪽이 제출한 템플릿에서 실행될 수 있어요.

  • 템플릿은 함수 A 또는 함수 B를 호출할 수 있지만, A1, A2, B1, B2는 호출할 수 없어요.

  • 함수 A는 함수 B를 호출할 수 있고, 그 반대도 가능해요.

  • 함수 A는 B1이나 B2를 호출할 수 없고, 함수 B는 A1이나 A2를 호출할 수 없어요.

  • A1은 A2를 호출할 수 있고 그 반대도 가능해요. A1과 A2는 B를 호출할 수 있어요. A1과 A2는 B1이나 B2를 호출할 수 없어요.

  • B1은 B2를 호출할 수 있고 그 반대도 가능해요. B1과 B2는 A를 호출할 수 있어요. B1과 B2는 A1이나 A2를 호출할 수 없어요.

커스텀 함수 업데이트 또는 삭제

업로드한 기존 함수나 템플릿을 업로드하거나 덮어쓸 수는 있지만, 기존 함수나 템플릿을 삭제할 수는 없어요. 함수를 "제거"하는 유일한 방법은 항상 성공하는, 이름과 시그니처가 정확히 동일한 더미 함수를 만드는 것이에요.

이전에 업로드한 함수와 동일한 시그니처로 함수를 업로드하면 기존 함수를 덮어써요. 여기서 시그니처란 외부 핸들러의 대소문자를 구분하지 않는 함수 이름과 모든 인수의 데이터 타입을 동일한 순서로 포함한 것을 의미해요. 인수 이름은 시그니처에 포함되지 않아요. 다른 계정이 업로드한 함수는 덮어쓸 수 없어요.


함수를 업데이트할 때는 시그니처가 일치해야 하므로 기존 함수의 시그니처는 변경할 수 없어요. foo(name VARIANT age INTEGER) 함수를 업로드한 다음 foo(name VARIANT age FLOAT) 함수를 업로드하면 인수 유형이 다르기 때문에 두 번째 함수가 첫 번째 함수에 추가로 clean room에 등록돼요.

공급자가 제출한 코드

공급자가 제출한 함수는 인라인 코드로 업로드하거나 Snowflake stage에서 업로드할 수 있어요. 두 가지 방법 모두 여기에서 다룰게요.

업로드한 코드는 승인된 Python 패키지 세트의 패키지를 기본적으로 가져와서 사용할 수 있어요. 기본 패키지가 아닌 패키지가 필요하다면 clean room의 Snowpark Container Services를 사용해서 코드를 호스팅해야 해요.

업로드된 공급자 코드는 본인이 업로드한 코드라도 볼 수 없어요. 따라서 clean room에 업로드하는 내용과 정확히 동일한 사본을 꼭 보관해 두세요.

개요

공급자가 clean room에 코드를 추가하는 방법을 큰 흐름으로 보면 다음과 같아요.

공급자가 평소와 같은 방식으로 clean room을 만들고 구성해요.

공급자는 provider.load_python_into_cleanroom을 호출하여 번들을 업로드해요. 이 프로시저 안에서 직접 코드를 인라인으로 업로드하거나, 코드 파일을 stage에 업로드한 다음 해당 프로시저에 stage 위치를 제공할 수 있어요.

각 번들에는 여러 함수가 포함될 수 있지만, 업로드마다 하나의 핸들러 함수만 노출돼요. 여러 함수를 템플릿에 노출하려면 각 핸들러를 별도로 업로드하거나 대량 업로드(아래에서 설명)를 하면 돼요.

clean room이 외부에 노출되는 경우, 코드가 clean room에 설치되기 전에 보안 검사가 실행돼요. 기본 버전을 올리기 전에 provider.view_cleanroom_scan_status를 호출하여 보안 검사를 통과했는지 확인해야 해요.

업로드가 성공할 때마다 clean room의 새 패치 버전이 생성돼요. 그런 다음 provider.set_default_release_directive를 새 패치 번호로 호출하여 기본 버전을 올려야 해요.

코드의 핸들러를 호출하는 사용자 지정 템플릿을 만들고 업로드해요. 템플릿은 cleanroom 범위를 사용하여 핸들러 함수를 호출해야 해요. 즉, cleanroom.my_function(...) 형식이에요.

소비자는 다른 템플릿과 동일한 방식으로 템플릿을 실행해요.

팁

소비자가 사용자 지정 코드가 포함된 clean room을 설치할 때 마운트 오류가 발생한다면, 이는 코드에 구문 오류가 있음을 나타낼 수 있어요.

이 흐름을 보여주는 코드 예시는 공급자가 작성한 코드 예시 섹션에서 찾을 수 있어요.

버전 관리에 관한 중요 참고 사항

공급자가 함수를 업로드할 때마다 clean room 패치 번호가 증가해요(패치 번호는 최대 99개로 제한돼요). 따라서 개발 중 버전 업데이트를 줄이려면 코드를 clean room에 추가하기 전에 철저히 테스트하고 디버그하는 것이 좋아요.

생성되는 패치 수를 줄이기 위해 단일 대량 업로드에서 여러 패키지를 한 번에 업로드할 수 있어요. 하지만 대량 업로드는 업로드에 보안 검사 문제가 있을 때 디버그하기가 더 어려울 수 있어요. 문제를 일으킨 파일이 오류 응답에 보고되지 않기 때문이에요.

패치 번호를 업데이트하는 경우 clean room UI를 사용하는 고객은 변경 사항을 보려면 페이지를 새로 고쳐야 할 수 있어요. API를 사용하는 고객은 변경 사항을 즉시 볼 수 있지만, 사용 가능한 리소스에 따라 지연이 발생할 수 있어요. clean room 버전 관리에 대해 자세히 알아보기.

공급자가 작성한 인라인 함수 업로드

provider.load_python_into_cleanroom의 code 매개변수에 코드를 인라인으로 업로드할 수 있어요. 간단한 함수를 인라인으로 업로드하는 예시는 다음과 같아요.

CALL samooha_by_snowflake_local_db.provider.load_python_into_cleanroom(
$cleanroom_name,
'simple_add',                         -- Name used to call the UDF from a template.
['first INTEGER', 'second INTEGER'],  -- Arguments of the UDF, specified as '<variable_name> <SQL type>' pairs.
['numpy', 'pandas'],                  -- Packages imported by the UDF.
'INTEGER',                            -- SQL return type of UDF.
'add_two',                            -- Handler function in your code called when external name is called.
$$
import numpy as np   # Not used, but you can load supported packages.
import pandas as pd

def add_two(first, second):
    return first + second
$$
);

호출 템플릿은 cleanroom.simple_add를 호출하여 이 함수를 실행해요. 공급자 예시에서 인라인 코드를 업로드하는 방법을 보여줘요.

stage에서 공급자가 작성한 함수 업로드

Python 파일을 clean room stage에 업로드하고 provider.load_python_into_cleanroom을 호출할 때 해당 stage를 참조할 수 있어요. stage에서 코드를 로드하면 로컬 시스템의 편집기에서 코드를 개발할 수 있고, 인라인으로 로드할 때 발생하는 복사/붙여넣기 오류를 피할 수 있으며, 소스 코드의 버전 관리도 더 잘 할 수 있어요. 단일 프로시저 호출에서 여러 파일을 업로드할 수 있지만, 업로드마다 하나의 핸들러 함수만 노출된다는 점에 유의해 주세요.



load_python_into_cleanroom을 호출하면 stage에서 clean room으로 코드가 로드돼요. 이후 stage의 코드가 변경되어도 clean room에는 반영되지 않아요.

UDF를 stage에 업로드하려면 다음 단계를 따라 하세요.

  1. .py 파일을 만들고 Snowsight stage에 업로드할 수 있는 위치에 준비하세요.

  2. clean room의 stage 이름을 확인하려면 provider.get_stage_for_python_files를 호출하세요. 지정된 stage를 사용해야 하며, 직접 만든 임의의 stage는 사용할 수 없어요.

  3. .py 파일을 clean room의 stage에 업로드하세요. several ways to do this에 설명된 것처럼 CLI, Snowsight, 또는 언어별 드라이버를 사용하는 등 여러 방법이 있어요.

  4. provider.load_python_into_cleanroom을 stage 위치, 핸들러, 외부 이름, 인자, 반환 유형과 함께 호출하세요. 이제 clean room의 템플릿에서 해당 함수를 호출할 수 있어요.

다음 예제 코드는 stage에서 clean room으로 코드를 로드하는 방법을 보여줘요.

-- Save the following code as reverser.py:
--import numpy as np
--def main(some_string):
--  '''Return the reverse of a string plus a random number 1-10'''
--  return some_string[::-1] + str(np.random.randint(1,10))

-- Get the stage for your clean room.
CALL samooha_by_snowflake_local_db.provider.get_stage_for_python_files($cleanroom_name);

-- Save the file to the stage. Here is how to do it by using the Snowflake CLI
PUT file://~/reverser.py <STAGE_NAME> overwrite=True auto_compress=False;

-- Load the code from the stage into the clean room.
CALL samooha_by_snowflake_local_db.provider.load_python_into_cleanroom(
    $cleanroom_name,
    'reverse', -- Name used to call the function
    ['some_string  STRING'], -- Arguments and SQL types
    ['numpy'],               -- Any required packages
    ['/reverser.py'],        -- Relative path to file on stage
    'STRING',                -- Return type
    'reverser.main'          -- <FILE_NAME>.<FUNCTION_NAME>
);

-- Uploading code, even from a stage, increases the patch number.
CALL samooha_by_snowflake_local_db.provider.set_default_release_directive(
  $cleanroom_name, 'V1_0', <NEW_PATCH_NUMBER>);

-- Upload a template that calls the function.
CALL samooha_by_snowflake_local_db.provider.add_custom_sql_template(
    $cleanroom_name,
    $udf_template_name,
    $$
    SELECT
      p.status,
      cleanroom.reverse(p.status)
    FROM SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS AS p
    LIMIT 100;
    $$
);

-- Switch to the consumer account and run the template to see the results.

provider examples는 stage에서 코드를 업로드하는 예시를 보여줘요.

업로드된 코드의 구문 오류 또는 검사 실패 문제 해결

구문 오류로 인해 실패하는 함수를 업로드하거나 보안 검사가 실패하면 게시할 수 없는 패치가 생성될 수 있어요. 따라서 업로드 전에 코드에 구문 오류가 없는지 철저히 테스트해야 해요.

다음 SQL 명령을 실행하면 패키지 목록과 검토 상태를 확인할 수 있어요. 표시된 위치에 clean room ID를 입력하세요. SHOW VERSIONS IN APPLICATION PACKAGE samooha_cleanroom_*cleanroom_id*;

보안 검사

외부 clean room에서 새 패치 버전을 생성하는 작업(예: 제공자가 Python을 clean room에 업로드하는 경우)이 있으면 보안 검사가 실행돼요. (이 페이지에서 설명하는 소비자 제출 코드는 보안 검사를 트리거하지 않아요.) 내부 clean room은 보안 검사를 실행하지 않지만, 내부 clean room을 외부 clean room으로 변경하면 해당 패치에 대한 보안 검사가 트리거돼요. clean room 패치는 검사가 완료될 때까지 외부에 게시할 수 없어요.

Snowflake Data Clean Rooms는 Snowflake Native App security scan framework을 사용해요. 보안 검사 오류를 방지하려면 native app security best practices를 따르세요.

마지막 보안 검사가 완료되기 전에도 추가로 패치를 생성하는 작업을 수행할 수 있어요. 하지만 clean room의 최신 버전을 제공하려면 기본 릴리스 지시문을 업데이트하기 전에 provider.view_cleanroom_scan_status가 성공을 표시할 때까지 기다려야 해요.

단일 패치에서 여러 Python 함수 업로드(대량 업로드)

clean room에 여러 Python 패키지를 업로드하려면 prepare_python_for_cleanroom을 여러 번 호출한 다음 load_prepared_python_into_cleanroom을 한 번 호출하여 검사, 업로드, 단일 패치 생성을 수행할 수 있어요. 다음 예제는 대량 업로드를 사용하여 UDF와 UDTF를 업로드하는 방법을 보여줘요.

---- Add custom inline UDF ----
CALL samooha_by_snowflake_local_db.provider.prepare_python_for_cleanroom(
    $cleanroom_name,
    'get_next_status',  -- Name of the UDF. Can be different from the handler.
    ['status VARCHAR'], -- Arguments of the UDF, specified as (variable name, SQL type).
    ['numpy'],          -- Packages needed by UDF.
    [],                 -- When providing the code inline, this is an empty array.
    'VARCHAR',          -- Return type of UDF.
    'get_next_status',  -- Handler.
    $$
import numpy as np
def get_next_status(status):
  """Return the next higher status, or a random status
  if no matching status found or at the top of the list."""

  statuses = ['MEMBER', 'SILVER', 'GOLD', 'PLATINUM', 'DIAMOND']
  try:
    return statuses[statuses.index(status.upper()) + 1]
  except:
    return 'NO MATCH'
    $$
);

---- Add custom inline UDTF. ----
CALL samooha_by_snowflake_local_db.provider.prepare_python_for_cleanroom(
    $cleanroom_name,
    'get_info',  -- Name of the UDTF. Can be different from the handler.
    ['hashed_email VARCHAR', 'days_active INT', 'status VARCHAR', 'income VARCHAR'],   -- Name/Type arguments of the UDTF.
    ['numpy'],         -- Packages used by UDTF.
    [],                -- When providing the code inline, this is an empty array.
    'TABLE(hashed_email VARCHAR, months_active INT, level VARCHAR)',  -- Return type of UDTF.
    'GetSomeVals',     -- Handler class name.
$$
class GetSomeVals:
  def __init__(self):
    self.month_days = 30

  def process(self, hashed_email, days_active, status, income):
    '''Change days into rough months, and also return whether we
    think the user's membership status is lower, higher, or equal to
    what is expected, based on their income.'''

    months_active = days_active // self.month_days
    brackets = ['0-50K', '50K-100K', '100K-250K', '250K+']
    statuses = ['MEMBER', 'SILVER', 'GOLD', 'PLATINUM']
    if(statuses.index(status) < brackets.index(income)):
      level = 'low'
    elif(statuses.index(status) > brackets.index(income)):
      level = 'high'
    else:
      level = 'equal'

    yield(hashed_email, months_active, level)
$$
);

-- Upload all stored procedures.
-- Note the new patch number returned by this procedure. Keep this number for later use.
CALL samooha_by_snowflake_local_db.provider.load_prepared_python_into_cleanroom($cleanroom_name);

-- Set the release directive specified by the last load_python_into_cleanroom call.
CALL samooha_by_snowflake_local_db.provider.set_default_release_directive($cleanroom_name, 'V1_0', <PATCH_NUMBER>);

제공자 작성 코드 예시

다음 예시는 제공자가 작성한 UDF와 UDTF를 clean room에 추가하는 방법을 보여줘요.

다음 예시를 다운로드한 후 Snowflake 계정에 워크시트 파일로 업로드하세요. 제공자와 소비자 각각에 clean rooms API가 설치된 별도의 계정이 필요해요. 샘플 파일에 표시된 대로 정보를 교체하세요. See instructions to upload a SQL worksheet into your Snowflake account를 참고하세요.

소비자 제출 코드

소비자가 업로드한 코드는 consumer template upload flow를 사용하여 사용자 지정 템플릿과 함께 번들로 묶여 업로드돼요. 업로드된 코드는 clean room의 모든 템플릿에서 호출할 수 있어요.

소비자로서 코드를 업로드하려면 custom template syntax를 이해해야 해요.

소비자가 업로드한 코드는 제공자가 업로드 권한을 요청할 때 제공자에게 보일 수 있어요. 또한 제공자나 소비자가 템플릿을 검토할 때 소비자 코드가 표시돼요.

사용자 지정 소비자 코드를 업로드하는 단계는 다음과 같아요.

제공자는 표준 방식으로 clean room을 만든 다음 소비자를 초대해요.

소비자는 표준 방식으로 clean room을 설치하고 구성해요.



소비자는 cleanroom 네임스페이스 내에서 UDF 또는 UDTF를 호출하는 템플릿을 준비합니다. 예를 들어, 소비자 정의 calculate_tax 함수를 호출하려면 간단한 템플릿은 다음과 같은 코드 조각처럼 보일 수 있습니다.

SELECT {{ cleanroom.calculate_tax(p.cost) }} AS Tax FROM my_db.my_sch.sales AS p;

소비자는 자신의 Python 코드를 준비합니다. 나중에 추가 이스케이프가 필요하지 않도록 코드에서 작은따옴표(' ') 대신 큰따옴표(" ")를 사용하는 것이 좋습니다. 코드는 these supported Python libraries를 참조할 수 있습니다.

소비자는 자신의 Python 코드를 consumer.generate_python_request_template에 전달합니다. 이 프로시저는 사용자 지정 JinjaSQL 템플릿을 위한 자리 표시자가 포함된 저장 프로시저로 Python 코드를 반환합니다. 템플릿에는 $$를 여러 줄 구분 기호로 사용하는 여러 줄 문자열이 몇 개 있습니다.

소비자는 generate_python_request_template의 출력에서 템플릿 자리 표시자를 자신의 JinjaSQL 템플릿으로 바꿉니다.

결합된 템플릿에서는 작은따옴표를 다음과 같이 이스케이프하세요: \'. 이는 clean room에 업로드할 때 전체 여러 줄 프로시저 문자열의 가장 바깥쪽 구분 기호로 작은따옴표가 사용되기 때문입니다. 다음은 소비자 Python 코드와 사용자 지정 템플릿이 포함된 저장 프로시저의 예로, 문자 이스케이프가 적용되어 있습니다:

BEGIN

CREATE OR REPLACE FUNCTION CLEANROOM.custom_compare(min_status STRING, max_status STRING, this_status STRING)
RETURNS boolean
LANGUAGE PYTHON
RUNTIME_VERSION = 3.10
PACKAGES = (\'numpy\')

HANDLER = \'custom_compare\'
AS $$
import numpy as np

def custom_compare(min_status:str, max_status:str, this_status:str):
  statuses = [\'MEMBER\', \'SILVER\', \'GOLD\', \'PLATINUM\']
  return ((statuses.index(this_status) >= statuses.index(min_status)) &
          (statuses.index(this_status) <= statuses.index(max_status)))
$$;

-- Custom template
LET SQL_TEXT varchar := $$
SELECT
  c.status,
  c.hashed_email
FROM IDENTIFIER( {{ my_table[0] }} ) as c
WHERE cleanroom.custom_compare({{ min_status }}, {{ max_status }}, c.status);
$$;

LET RES resultset := (EXECUTE IMMEDIATE :SQL_TEXT);
RETURN TABLE(RES);

END;

소비자는 결합된 템플릿으로 consumer.create_template_request를 호출합니다. template_definition 인수의 저장 프로시저에 제공하는 코드 주위에는 이중 달러 기호 구분 기호($$...$$) 대신 작은따옴표(' ')를 사용하세요. 예를 들어:

CALL samooha_by_snowflake_local_db.consumer.create_template_request(
  $cleanroom_name,
  $template_name,
  '
BEGIN

-- First, define the Python UDF.
CREATE OR REPLACE FUNCTION CLEANROOM.custom_compare(min_status STRING, max_status STRING, this_status STRING)
RETURNS boolean
LANGUAGE PYTHON
RUNTIME_VERSION = 3.10
PACKAGES = (\'numpy\')

HANDLER = \'custom_compare\'
AS $$
import numpy as np

def custom_compare(min_status:str, max_status:str, this_status:str):
  statuses = [\'MEMBER\', \'SILVER\', \'GOLD\', \'PLATINUM\']
  return ((statuses.index(this_status) >= statuses.index(min_status)) &
          (statuses.index(this_status) <= statuses.index(max_status)))
$$;

-- Then define and execute the SQL query.
LET SQL_TEXT varchar := $$
SELECT
  c.status,
  c.hashed_email
FROM IDENTIFIER( {{ my_table[0] }} ) as c
WHERE cleanroom.custom_compare({{ min_status }}, {{ max_status }}, c.status);
$$;

-- Execute the query and then return the result.
LET RES resultset := (EXECUTE IMMEDIATE :SQL_TEXT);
RETURN TABLE(RES);

END;
');

소비자와 공급자는 표준 consumer-defined template flow를 계속 진행합니다:

  1. 공급자는 템플릿 요청(provider.list_pending_template_requests)을 확인한 다음 approve_template_request를 호출하여 승인합니다. 요청에서 공급자는 템플릿과 번들 코드를 볼 수 있습니다.

  2. 소비자는 요청 상태(consumer.list_template_requests)를 확인하고, 상태가 APPROVED이면 템플릿(consumer.run_analysis)을 실행합니다.

소비자 코드 업로드는 보안 검사를 트리거하지 않으며 clean room 패치 번호에 영향을 주지 않습니다.

소비자 작성 코드 예제

다음 예제에서는 clean room에 공급자 작성 UDF를 추가하는 방법을 보여줍니다.

다음 예제를 다운로드한 다음 Snowflake 계정에 워크시트 파일로 업로드하세요. 공급자와 소비자 각각 별도의 계정이 필요하며, 각 계정에 clean rooms API가 설치되어 있어야 합니다. 샘플 파일에 명시된 대로 정보를 교체하세요. See instructions to upload a SQL worksheet into your Snowflake account.

더 알아보기 (Learn more)