Secure Data Sharing(보안 데이터 공유) 는 내 계정의 데이터베이스 객체를 다른 Snowflake 계정과 공유하는 기능이다.
핵심은 계정 레벨의 SHARE 객체를 통해 공유가 이루어진다는 점이다. SHARE는 데이터 제공자(Data Provider) 가 생성하며, 두 가지 핵심 구성으로 이루어진다.
| 구성 요소 | 설명 |
|---|---|
| Grants on database objects | 공유할 객체에 대한 권한 부여 |
| Consumer account definitions | 공유 대상 소비자 계정 정의 |
🔑 가장 중요한 개념: Secure Data Sharing에서는 실제 데이터가 복사·전송되지 않는다.
모든 공유는 Snowflake의 services layer(서비스 계층)와 metadata store(메타데이터 저장소) 를 통해 이루어진다.
→ 소비자 계정은 별도의 스토리지 비용이 발생하지 않는다.
데이터 제공자가 공유할 수 있는 객체는 다음과 같다.
📌 암기 포인트: 공유 가능한 객체는 대부분 "Secure" 가 붙는다.
View / Materialized View / UDF는 반드시 Secure 버전이어야 공유 안전.
🔑 모든 공유 객체는 read-only(읽기 전용) 이다. 소비자는 수정·삭제·데이터 추가 불가.
소비자(Data Consumer)는 SHARE로부터 데이터베이스를 생성하며, 이 DB에는 제공자가 부여한 읽기 전용 객체들이 담긴다.
⚠️ 중요: Secure Data Sharing은 VPS(Virtual Private Snowflake) edition에서는 사용 불가하다.
-- 빈 share 생성 (CREATE SHARE privilege 필요)
CREATE SHARE MY_SHARE;
-- 객체 공유 (권한 부여)
GRANT USAGE ON DATABASE MY_DATABASE TO SHARE MY_SHARE;
GRANT USAGE ON SCHEMA MY_DATABASE.MY_SCHEMA TO SHARE MY_SHARE;
GRANT SELECT ON TABLE MY_DATABASE.MY_SCHEMA.MY_TABLE TO SHARE MY_SHARE;
-- 소비자 계정 추가
ALTER SHARE MY_SHARE ADD ACCOUNTS=TT67B77;
📌 권한 부여 순서 (암기): Database → Schema → Table
상위 객체부터 USAGE를 부여하고, 마지막에 테이블에 SELECT를 부여한다.
-- 사용 가능한 share 목록 조회 (IMPORT SHARE privilege 필요)
SHOW SHARES;
-- share로부터 데이터베이스 생성 (IMPORT SHARE privilege 필요)
CREATE DATABASE SHARED_DATABASE FROM SHARE GYU889T.MY_SHARE;
-- share 내용 확인 (ACCOUNT ADMIN)
DESC SHARE GYU889T.MY_SHARE;
-- 공유 테이블 조회
SELECT * FROM SHARED_DATABASE.MY_TABLE;
🔑 제공자는 CREATE SHARE / 소비자는 IMPORT SHARE 권한이 필요하다 (아래 4·5절에서 상세).
| 규칙 | 내용 |
|---|---|
| 즉시 반영 | share에 추가된 객체는 모든 소비자에게 즉시(immediately) 사용 가능 |
| DB 1개 제한 | 하나의 share당 데이터베이스는 단 1개만 추가 가능 |
| 개수 제한 없음 | 생성할 수 있는 share 수, share에 추가할 계정 수에 하드 리밋(hard limit) 없음 |
⚠️ 시험 빈출 에러: share에 속하지 않은 다른 DB의 객체를 추가하려 하면 →
SQL compilation error: Database 'TEST_DB' does not belong to the database that is being shared.
→ share 1개 = DB 1개 원칙 때문에 발생.
🔑 CREATE SHARE 명령을 실행하려면
CREATE SHAREprivilege를 가진 role이 필요하다.
(공식 문서 기준: ACCOUNTADMIN role 또는 global CREATE SHARE privilege를 가진 role 필요)
🔑 share는 데이터 제공자 계정과 동일한 region 및 동일한 cloud provider의 계정에만 부여 가능하다.

📌 다른 region / 다른 cloud의 계정과 공유하려면 Replication(복제) 을 사용해야 한다.
(cross-region 데이터 공유는 Snowflake의 데이터 복제 기능을 활용한다.)
🔑 share로부터 데이터베이스를 생성하려면
IMPORT SHAREprivilege를 가진 role이 필요하다.
(공식 문서 기준: 소비자 계정 관리자는 IMPORTED PRIVILEGES 권한을 role에 부여하여 공유 객체 접근을 허용한다.)
| 제약 | 내용 |
|---|---|
| 객체 생성 불가 | 소비자는 공유 데이터베이스 내부에 객체를 생성할 수 없다 |
| 재공유 불가 | 소비자는 공유받은 객체를 다시 공유(reshare)할 수 없다 |

📌 암기: 소비자는 만들 수도(create) 없고, 다시 나눠줄 수도(reshare) 없다.
→ 오직 읽기(read-only)만 가능.
🔑 Reader Account는 non-Snowflake 고객(Snowflake 미사용 고객) 이 제공자의 데이터에 접근할 수 있게 해준다.
| 특징 | 내용 |
|---|---|
| 용도 | Snowflake 고객이 아닌 대상과 데이터 공유 |
| 데이터 입력 불가 | reader account는 데이터를 insert하거나 copy할 수 없다 (read-only) |
| 소비 범위 제한 | reader account는 자신을 생성한 제공자 계정의 데이터만 소비 가능 |
| 비용 부담 | 제공자 계정이 reader account에 대한 책임을 지고, 사용량에 대한 비용도 제공자가 부담 |

📌 시험 핵심: "Snowflake를 쓰지 않는 외부 고객과 공유" = Reader Account
비용은 항상 Provider가 부담한다.
⚠️ 확인 필요: 강의 슬라이드에는 reader account 생성 SQL(
CREATE MANAGED ACCOUNT)이나
개수 제한 수치가 없어 본 노트에서는 다루지 않음 (공식 문서에는 별도 존재).
🔑 Data Exchange는 계정들이 데이터를 제공·소비할 수 있는 데이터 마켓플레이스의 private 버전이다.
| 특징 | 내용 |
|---|---|
| 본질 | data marketplace의 private(비공개) 버전 |
| 설정 방법 | Snowflake 계정용 Data Exchange는 이름과 설명을 제공하여 Snowflake support와 함께 설정 |
| 관리 주체 | Data Exchange를 호스팅하는 Snowflake 계정 = Data Exchange Admin |
| Admin 권한 | 멤버 관리, 멤버를 provider/consumer로 지정, listing 요청 관리 |
📌 암기: Data Exchange = "내 그룹만 쓰는 비공개 마켓플레이스"
호스팅 계정이 Data Exchange Admin이 되어 모든 것을 관리한다.
| 주제 | 핵심 한 줄 |
|---|---|
| Secure Data Sharing | 데이터 복사 없이 metadata로 공유 (read-only), VPS edition 불가 |
| 공유 가능 객체 | Table, External table, Secure View/MV/UDF |
| Share 규칙 | share당 DB 1개, 계정 추가는 무제한, 객체 추가 시 즉시 반영 |
| Provider 권한 | CREATE SHARE 필요, 동일 region + 동일 cloud만 공유 가능 |
| Consumer 권한 | IMPORT SHARE 필요, 객체 생성·재공유 불가 |
| Reader Account | non-Snowflake 고객용, 비용은 Provider가 부담 |
| Data Exchange | 마켓플레이스의 private 버전, 호스팅 계정 = Admin |
CREATE SHAREIMPORT SHARE