tee / insights
LEARNING / SNOWFLAKE홈

Snowflake / 데이터 작업·운영

Snowflake 데이터 작업·운영 학습 가이드

권한 확인부터 데이터 수정, 복구, 적재, 자동 실행, 검증까지 하나의 흐름으로 배웁니다. 문법 암기보다 실행 전에 무엇을 확인하고, 실패 시 어떻게 복구하며, 재실행 뒤 무엇을 검증할지 익히는 데 초점을 둡니다.

독립적인 학습 자료입니다. Snowflake 공식 자격시험의 출제 범위나 문제를 재현하지 않습니다.

사양 확인 2026-10-08

다섯 영역을 하나의 작업으로 보기

다섯 영역은 서로 연결됩니다. 누가 어떤 대상을 바꿀 수 있는지 정하고, 변경 경계를 관리한 뒤 적재·재실행하고, 마지막에 결과를 검증합니다.

A

권한·기본 구조

Role, Database, Schema, Table, View와 세션 컨텍스트를 확인합니다.

B

데이터 수정

INSERT, UPDATE, DELETE, MERGE의 범위, 중복, 재실행을 판단합니다.

C

트랜잭션·복구

BEGIN / COMMIT / ROLLBACK과 Time Travel / UNDROP을 구분합니다.

D

적재·자동 실행

Stage, File Format, COPY INTO, Task, Stored Procedure를 연결합니다.

E

검증·운영

JOIN 단위, NULL, 지연 도착, 건수, 키, 값, 재처리를 확인합니다.

실행 전에 확인할 다섯 순서

데이터 변경 작업은 다음 순서로 읽으면 판단하기 쉽습니다.

StepCheck
1. ContextCURRENT_ROLE(), CURRENT_DATABASE(), CURRENT_SCHEMA()를 확인합니다.
2. Scope완전 수식 이름과 정확한 WHERE로 대상 객체와 행을 제한합니다.
3. Boundary여러 DML을 하나의 성공·실패 단위로 묶을지 정합니다.
4. Re-run같은 작업을 다시 실행해도 중복이나 이중 수정이 생기지 않는지 봅니다.
5. Validate성공 상태만 보지 말고 건수, 키, 값으로 결과를 확인합니다.

A. 권한과 대상 범위 확인

Snowflake 사용자는 Role을 통해 작업하고, Role에 부여된 Privilege로 객체에 접근합니다. SQL이 맞아도 권한이 부족하면 실행할 수 없습니다. 현재 Role, Database, Schema를 먼저 확인하면 다른 환경이나 같은 이름의 테이블을 잘못 수정할 위험을 줄일 수 있습니다.

SELECT
  CURRENT_ROLE(),
  CURRENT_DATABASE(),
  CURRENT_SCHEMA();

Schema 객체는 database.schema.object 형식으로 지정할 수 있습니다. 변경 SQL에서는 SALES_DB.CORE.ORDERS처럼 완전 수식 이름을 쓰면 현재 Database와 Schema에 대한 의존을 줄일 수 있습니다.

SELECT *
FROM SALES_DB.CORE.ORDERS;

읽기 전용이라면 Database·Schema의 USAGE, Table의 SELECT처럼 목적에 필요한 최소 권한만 부여하는 방식이 기본입니다. 더 강한 Role로 전환하기 전에 필요한 작업을 확인합니다.

B. 데이터를 안전하게 수정

INSERT는 행을 추가하고 UPDATE는 기존 행을 수정하며 DELETE는 행을 제거합니다. UPDATE와 DELETE에서 WHERE를 생략하면 모든 행이 대상이 됩니다. 같은 조건을 SELECT로 먼저 확인해 건수와 키를 검토합니다.

SELECT ORDER_ID, CUSTOMER_ID, STATUS
FROM SALES_DB.CORE.ORDERS
WHERE CUSTOMER_ID = 1001;

UPDATE SALES_DB.CORE.ORDERS
SET STATUS = 'CANCELLED'
WHERE CUSTOMER_ID = 1001;
StatementPurposeSafety question
INSERT새 행 추가같은 입력이 두 번 들어갈 수 있는가.
UPDATE조건에 맞는 행 수정WHERE 범위가 너무 넓지 않은가.
DELETE조건에 맞는 행 삭제정확한 대상을 SELECT로 미리 볼 수 있는가.
MERGE일치 여부에 따라 수정·추가·삭제ON 키와 source 유일성이 명확한가.

MERGE는 source와 target의 일치 여부에 따라 UPDATE, INSERT, DELETE를 조합할 수 있습니다. MERGE만 사용한다고 source 중복이 자동으로 사라지지 않습니다. Business Key를 정하고 source가 그 키로 유일한지 확인합니다.

MERGE INTO SALES_DB.CORE.ORDERS AS t
USING LANDING_DB.RAW.ORDERS_STAGE AS s
  ON t.ORDER_ID = s.ORDER_ID
WHEN MATCHED THEN
  UPDATE SET t.STATUS = s.STATUS, t.AMOUNT = s.AMOUNT
WHEN NOT MATCHED THEN
  INSERT (ORDER_ID, CUSTOMER_ID, AMOUNT, STATUS)
  VALUES (s.ORDER_ID, s.CUSTOMER_ID, s.AMOUNT, s.STATUS);

NULL은 0이나 빈 문자열과 다릅니다. NULL 판정에는 IS NULL / IS NOT NULL을 사용합니다. 재실행할 때는 같은 입력을 다시 처리해도 원치 않는 중복이나 추가 변경이 생기지 않는 멱등성을 확인합니다.

C. 트랜잭션과 복구 구분

BEGIN은 명시적 트랜잭션을 시작하고 COMMIT은 확정하며 ROLLBACK은 그 트랜잭션의 변경을 취소합니다. 여러 DML을 하나의 성공·실패 단위로 묶을 때 사용합니다.

BEGIN TRANSACTION;

UPDATE SALES_DB.CORE.ORDERS
SET STATUS = 'CLOSED'
WHERE ORDER_DATE < '2026-01-01';

COMMIT;

Snowflake에서 DDL을 실행하면 진행 중인 트랜잭션이 암묵적으로 COMMIT되고, DDL은 별도 트랜잭션으로 처리됩니다. DDL은 ROLLBACK할 수 없습니다. DML과 DDL을 섞고 마지막 ROLLBACK으로 모두 되돌릴 수 있다고 가정하면 안 됩니다.

ROLLBACK은 현재 미확정 트랜잭션을 되돌립니다. 이미 확정된 변경이나 DROP된 객체의 복구는 별도 문제입니다. 보존 기간 안에서는 Time Travel로 과거 데이터를 조회하고, 지원되는 객체는 UNDROP으로 복원할 수 있습니다.

MechanismTargetUse
ROLLBACK현재 미확정 명시적 트랜잭션현재 작업 단위를 취소합니다.
Time Travel보존 기간 안의 과거 데이터과거 상태를 조회하거나 복구에 활용합니다.
UNDROP보존 기간 안의 지원되는 DROP 객체허용되는 경우 최근 DROP 객체를 복원합니다.

D. 파일 적재와 자동 실행 연결

파일 적재는 Stage → File Format → COPY INTO → Table 순서로 보면 이해하기 쉽습니다. Stage는 파일 위치, File Format은 CSV·JSON 등의 해석 방법, COPY INTO는 Table 적재를 담당합니다.

StageFile FormatCOPY INTOTableTask / Stored Procedure
COPY INTO SALES_DB.CORE.ORDERS
FROM @LANDING_DB.RAW.ORDER_STAGE
FILE_FORMAT = (
  FORMAT_NAME = 'LANDING_DB.RAW.ORDER_CSV'
);

자동 실행에서 Task는 '언제 실행할지', Stored Procedure는 '무엇을 어떻게 처리할지'를 묶는 데 사용할 수 있습니다. Task가 Stored Procedure를 호출하고 내부에서 MERGE와 검증을 수행하는 구성도 가능합니다.

E. 건수·키·값으로 검증

JOIN 뒤 행이 늘어났다고 바로 오류는 아닙니다. ORDERS가 주문당 1행이고 ORDER_ITEMS가 상품당 1행이면 1:N JOIN에서 주문이 상품 수만큼 반복되는 것이 자연스럽습니다. 각 Table의 한 행이 무엇을 뜻하는지 먼저 확인합니다.

COUNT(*)는 행을 세지만 COUNT(column)은 해당 열이 NULL인 행을 제외합니다. source와 target 건수가 같아도 키나 값이 다를 수 있으므로 건수만으로 검증을 끝내면 안 됩니다.

SELECT COUNT(*) AS row_count,
       COUNT(AMOUNT) AS amount_count
FROM SALES_DB.CORE.ORDERS;

SELECT ORDER_ID, COUNT(*) AS duplicate_count
FROM SALES_DB.CORE.ORDERS
GROUP BY ORDER_ID
HAVING COUNT(*) > 1;

지연 도착 데이터는 업무·이벤트 시각과 적재 시각을 구분합니다. 늦은 데이터를 잡기 위해 처리 구간을 겹친다면 재실행 시 중복되지 않는 설계와 함께 사용합니다.

LevelWhat to check
1. 건수COUNT(*)로 큰 누락이나 증가를 확인합니다.
2. 키Business Key의 누락, 추가, 중복을 확인합니다.
3. 값SUM, MIN, MAX와 중요 열을 비교합니다.

이해 확인

답을 열기 전에 대상 범위, 트랜잭션 경계, 재실행, 검증 순서로 생각해 보세요.

01고객 1001의 주문만 취소하려는데 UPDATE에 WHERE가 없습니다. 문제는 무엇입니까?

모든 행이 대상이 됩니다. SELECT로 의도한 조건을 먼저 확인한 뒤 정확한 WHERE로 제한합니다.

02COUNT(AMOUNT)는 95이고 COUNT(*)는 100입니다. 먼저 무엇을 확인합니까?

AMOUNT가 NULL인 행이 5개일 수 있습니다. COUNT(column)은 NULL을 세지 않습니다.

03같은 Stage 입력을 재처리합니다. INSERT SELECT만으로 안전합니까?

항상 안전하지 않습니다. 같은 행이 다시 들어갈 수 있으므로 Business Key, 중복 제거, 적절한 MERGE를 설계합니다.

04BEGIN 후 UPDATE, CREATE TABLE, ROLLBACK을 실행했습니다. UPDATE가 반드시 취소됩니까?

그렇게 보장할 수 없습니다. Snowflake의 DDL은 진행 중인 트랜잭션을 암묵적으로 COMMIT합니다.

05MERGE가 ORDER_ID로 일치시키는데 source에 같은 ORDER_ID가 여러 개 있습니다. 무엇을 확인합니까?

한 target 행이 여러 source 행과 경쟁하지 않도록 Business Key 단위로 source를 유일하게 만듭니다.

06source와 target이 모두 10,000행입니다. 성공이라고 할 수 있습니까?

아닙니다. 누락·중복 키와 중요 값도 함께 확인해야 합니다.

마지막 확인 목록

각 상황에서 객체, 권한, 행 범위, 트랜잭션 경계, 재실행, 검증을 순서대로 확인합니다. SQL 문법을 알아도 대상을 제한하지 못하면 안전한 작업이 아닙니다.

OBJECTPRIVILEGEWHERETRANSACTIONRE-RUNVALIDATE

공식 자료

여기서 설명한 동작은 Snowflake 공식 문서로 확인했습니다. 보존 기간과 권한 구성처럼 계정 설정에 따라 달라지는 값은 실제 환경도 확인하세요.