다이나믹 테이블을 다른 계정과 공유하기
다이나믹 테이블을 다른 계정과 공유하기
프로바이더는 share를 통해 SELECT를 부여해 다이나믹 테이블을 공유합니다. 소비자는 그 테이블을 직접 조회하거나 그 위에 자신의 파이프라인을 구축할 수 있어요. 이 페이지는 두 워크플로우를 모두 다룹니다.
전체 문법 레퍼런스는 CREATE SHARE를 참고하세요.
출처: Snowflake 문서
본문
프로바이더 워크플로우: 다이나믹 테이블 공유
다이나믹 테이블을 공유하려면 share를 만들고, 필요한 데이터베이스·스키마 권한을 부여한 다음, 다이나믹 테이블에 SELECT를 부여하면 됩니다.
공유 전에 변경 추적 활성화
소비자는 공유 객체에서 변경 추적을 활성화할 수 없으므로, 프로바이더는 각 base table을 share에 추가하기 전에 ALTER TABLE <name> SET CHANGE_TRACKING = TRUE를 실행해야 합니다.
다이나믹 테이블을 share에 부여
다음 예시는 하나의 다이나믹 테이블을 한 소비자 계정과 공유합니다:
-- share를 만들고 필요한 권한을 부여
CREATE SHARE analytics_share;
GRANT USAGE ON DATABASE analytics_db TO SHARE analytics_share;
GRANT USAGE ON SCHEMA analytics_db.public TO SHARE analytics_share;
GRANT SELECT ON DYNAMIC TABLE analytics_db.public.dt_orders_daily TO SHARE analytics_share;
-- 스키마의 모든 다이나믹 테이블을 공유하려면 ALL DYNAMIC TABLES를 대신 사용:
-- GRANT SELECT ON ALL DYNAMIC TABLES IN SCHEMA analytics_db.public TO SHARE analytics_share;
-- 소비자 계정 추가 (여러 계정은 쉼표로 구분)
ALTER SHARE analytics_share ADD ACCOUNTS = consumer_org.consumer_account;
리전 및 클라우드 간 공유
- 같은 리전: Direct Share를 사용하세요 (Data sharing and collaboration in Snowflake).
- 크로스 리전 또는 크로스 클라우드: share 또는 애플리케이션 패키지를 리스팅에 추가하고 Cross-Cloud Auto-Fulfillment를 설정하세요 (Create and publish a listing).
- Native Apps: 애플리케이션 패키지에 다이나믹 테이블을 추가하세요 (Share data content in a Snowflake Native App).
소비자 워크플로우: 공유된 다이나믹 테이블 조회
소비자 계정은 공유된 다이나믹 테이블을 다른 공유 객체처럼 조회할 수 있어요. 프로바이더의 리프레시 스케줄이 계속 실행되고, 소비자는 최신 리프레시된 데이터를 봅니다.
share에서 데이터베이스 생성
CREATE DATABASE shared_analytics FROM SHARE provider_org.provider_account.analytics_share;
GRANT IMPORTED PRIVILEGES ON DATABASE shared_analytics TO ROLE analyst_role;
공유된 다이나믹 테이블 조회
SELECT order_day, region, order_count, daily_revenue
FROM shared_analytics.public.dt_orders_daily
ORDER BY order_day DESC
LIMIT 5;
+------------+---------+-------------+---------------+
| ORDER_DAY | REGION | ORDER_COUNT | DAILY_REVENUE |
|------------+---------+-------------+---------------|
| 2025-01-16 | EU-West | 1 | 62.50 |
| 2025-01-15 | US-West | 2 | 149.97 |
| 2025-01-15 | US-East | 1 | 49.99 |
+------------+---------+-------------+---------------+
참고: share 경계는 파이프라인 경계입니다. 소비자 테이블과 프로바이더 테이블은 독립적으로 리프레시되며, 계정 간 조정된 스케줄링이나 target lag 전파는 없어요.
소비자 워크플로우: 공유 데이터 위에 파이프라인 구축
소비자는 공유 데이터 위에 다이나믹 테이블을 만들 수 있어요. 패턴은 프로바이더가 base table, 다이나믹 테이블, 뷰 중 무엇을 공유했는지에 따라 달라집니다.
공유된 base table 위에
프로바이더가 공유 전에 base table에서 변경 추적을 활성화했다면, 소비자는 직접 다이나믹 테이블을 만들 수 있어요. 이는 프로바이더가 변경 추적된 base table 위에서 뷰 의존성에 다이나믹 테이블이 없는 뷰(secure 또는 non-secure)를 공유할 때도 동작합니다.
CREATE OR REPLACE DYNAMIC TABLE dt_consumer_summary
TARGET_LAG = '1 hour'
WAREHOUSE = transform_wh
AS
SELECT
order_date::DATE AS order_day,
COUNT(*) AS total_orders,
SUM(quantity * unit_price) AS total_revenue
FROM shared_analytics.public.raw_orders
GROUP BY ALL;
공유된 다이나믹 테이블 위에
소비자가 공유된 다이나믹 테이블 위에 다이나믹 테이블을 만들면, share 경계가 두 파이프라인을 분리합니다. 리프레시(증가분 포함)는 계정 간 조정 없이 독립적으로 실행돼요.
CREATE OR REPLACE DYNAMIC TABLE dt_regional_report
TARGET_LAG = '30 minutes'
WAREHOUSE = transform_wh
AS
SELECT * FROM shared_analytics.public.dt_orders_daily
WHERE region = 'US-West';
소비자의 target lag는 프로바이더의 것과 독립적입니다. 소비자 다이나믹 테이블은 각 리프레시에서 프로바이더의 최신 사용 가능 데이터를 봅니다. share 경계를 넘는 스냅샷 격리는 없어요.
share 경계를 넘는 모니터링: 프로바이더 데이터가 stale해도 리프레시 이력은 SUCCEEDED로 표시됩니다. 프로바이더의 리프레시 상태를 직접 모니터링할 수 없어요. 예상치 못한 갱신을 감지하려면: 몇 번의 리프레시 주기 동안 결과가 동일하다면 프로바이더가 리프레시를 중단했을 수 있습니다.
다이나믹 테이블을 참조하는 공유 뷰 위에
프로바이더가 의존성에 다이나믹 테이블을 포함하는 뷰(secure 또는 non-secure)를 공유하면, 그 뷰를 DYNAMIC_TABLE_REFRESH_BOUNDARY()로 감싸세요:
Snowflake는 다른 계정에서 온 뷰의 다이나믹 테이블 의존성에 대해 리프레시 스케줄을 조정할 수 없습니다. 래퍼는 Snowflake가 그 뷰를 독립적으로 리프레시되는 입력으로 취급하도록 지시합니다.
CREATE OR REPLACE DYNAMIC TABLE dt_from_shared_view
TARGET_LAG = '1 hour'
WAREHOUSE = transform_wh
AS
SELECT * FROM DYNAMIC_TABLE_REFRESH_BOUNDARY(shared_analytics.public.v_daily_metrics);
경계 래퍼 없이는 문장이 실패합니다. 공유 뷰가 다이나믹 테이블에 의존하는지 확실하지 않다면, DYNAMIC_TABLE_REFRESH_BOUNDARY()로 감싸는 것은 항상 안전합니다. 이 함수는 뷰의 의존성에 다이나믹 테이블이 없을 때는 아무 효과가 없어요.
파이프라인 경계에 대한 전체 설명(같은 계정 시나리오 포함)은 Decouple pipelines with DYNAMIC_TABLE_REFRESH_BOUNDARY()를 참고하세요.
지원되는 공유 패턴
| 프로바이더가 공유 | 소비자가 조회 가능? | 소비자가 그 위에 다이나믹 테이블 구축 가능? |
|---|---|---|
| 다이나믹 테이블 | 예 | 예 |
| base table (변경 추적 활성화) | 예 | 예 |
| 뷰 (뷰 의존성에 다이나믹 테이블 없음) | 예 | 예 (뷰의 base table에서 변경 추적이 활성화된 경우) |
| 뷰 (뷰 의존성에 다이나믹 테이블 있음) | 예 | 예 (뷰를 DYNAMIC_TABLE_REFRESH_BOUNDARY()로 감싸야 함) |
에러: 변경 추적이 활성화되지 않음
프로바이더가 base table을 공유하기 전에 변경 추적을 활성화하지 않았다면, 소비자는 다이나믹 테이블을 만들 때 이 에러를 봅니다:
CREATE OR REPLACE DYNAMIC TABLE dt_consumer_summary
TARGET_LAG = '1 hour'
WAREHOUSE = transform_wh
AS
SELECT * FROM shared_analytics.public.raw_orders;
091930 (2F003): SQL compilation error:
Change tracking is not enabled or has been missing for the time
range requested on table 'SHARED_ANALYTICS.PUBLIC.RAW_ORDERS'.
수정하려면 프로바이더에게 base table에서 ALTER TABLE <name> SET CHANGE_TRACKING = TRUE를 실행해 달라고 요청하세요.
더 알아보기 (Learn more)
- Monitor dynamic tables — 공유 후 리프레시 상태 추적
- Manage dynamic tables — 공유된 다이나믹 테이블 suspend/resume
- Troubleshoot dynamic table refresh issues — 공유된 다이나믹 테이블 리프레시 중단 시 해결