데이터 이동 정책

데이터 이동 정책

Enterprise Edition 기능 — 이 기능은 Enterprise Edition(또는 그 이상)이 필요해요. 업그레이드 문의는 Snowflake 지원에 연락해 주세요.

데이터 이동 정책(DMP)은 Snowflake의 데이터 유출(data exfiltration) 방지 제어의 일부예요. 구성된 정책에 따라 데이터 이동 작업을 제한, 알림, 또는 차단하는 데 도움을 줘요. 이동 규칙을 정의하고, 그러한 규칙을 정책으로 그룹화하고, 정책을 태그에 또는 계정에 직접 연결해 이 작업을 수행해요. 지원되는 이동 작업이 태그된 객체를 포함할 때 Snowflake는 활성 정책을 평가해 그 작업을 허용하거나, 알림과 함께 허용하거나, 차단할 수 있어요.

출처: Documentation

본문

이점

데이터 이동 정책은 다음을 도와줘요.

  • 이동 유형별 행 예산을 설정해 민감한 데이터의 대규모 내보내기를 제한.
  • 개별 테이블과 뷰 대신 태그에 정책을 연결해 환경 간 제어 재사용.
  • 승인된 사용자의 액세스 패턴을 변경하지 않고 이동 가드레일(guardrail) 추가.
  • 알림 기반 모니터링을 통해 위험한 이동에 대한 가시성 개선.

DMP 구성 전제 조건

DMP를 구성하기 전에 다음을 확인해요.

  • 민감한 데이터 도메인을 식별하고 필요하면 데이터를 분류해요.
  • 보호된 데이터가 태그로 커버되는지. 태그는 컬럼, 테이블, 스키마 또는 데이터베이스 범위로 적용할 수 있어요.
  • 이동 사용 사례에 대해 태그 전파(propagation)가 올바르게 구성되는지. 기본적으로 데이터 이동 정책이 연결된 태그는 전파 수준이 ON_DEPENDENCY_AND_DATA_MOVEMENT로 설정되어야 해요. 이 요구 사항을 비활성화하려면 ENFORCE_TAG_PROPAGATION_FOR_DATA_MOVEMENT_POLICIES 계정 매개 변수를 FALSE로 설정해요. 비활성화되면 데이터 이동 정책을 모든 전파 수준의 태그에 적용할 수 있으며, 즉 정책이 태그 전파를 통해 데이터를 따라가며 보호하지 않는다는 뜻이에요. 자세한 내용은 태그 전파를 참고해요.
  • 통제된 이동 액세스가 필요한 비즈니스 워크플로를 위해 승인된 예외 역할을 정의해요.
  • 출시 전에 비생산 환경에서 이동 워크플로를 검증해요.

데이터 이동 정책 작동 방식

데이터 이동 규칙

데이터 이동 규칙은 COPY_INTO_EXTERNAL_STAGE 같은 하나의 이동 유형을 제어해요. 각 규칙에는 다음이 포함돼요.

  • 규칙이 적용되는 이동 클래스를 선택하는 TYPE. 지원되는 값은 COPY_INTO_EXTERNAL_STAGE, COPY_INTO_INTERNAL_STAGE, SNOWSIGHT_UI, AGENT_ACCESS, UI_DOWNLOAD, PROGRAMMATIC_FETCH예요.
  • 정수를 반환하는 MAX_ROWS 표현식.

MAX_ROWS 반환 값의 의미는 다음과 같아요.

  • NULL: 이 규칙에 따른 제한 없음.
  • 0: 이동 작업 차단.
  • 양의 정수: 그 작업에 허용되는 최대 행 수.

MAX_ROWS 본문은 SYS_CONTEXT를 호출해 세션 및 이동 컨텍스트를 읽을 수 있어요. 이동 규칙의 SYS_CONTEXT를 참고해요.

데이터 이동 정책

데이터 이동 정책은 규칙을 두 목록으로 그룹화해요.

  • ENFORCE_RULES는 이동 작업을 차단할 수 있어요.
  • ALERT_RULES는 작업을 허용하고 알림을 생성해요.

정책 연결

정책은 태그에 또는 계정에 직접 연결할 수 있어요.

태그 기반 연결이 기본 방법이에요. ALTER TAG ... SET DATA MOVEMENT POLICY ...을 사용해 정책을 태그에 바인딩해요. 해당 태그가 객체에 적용되면 Snowflake는 지원되는 이동 작업에 대해 DMP를 평가해요.

계정 수준 연결은 기준 정책을 제공해요. 이것은 가장 세분화되지 않은 연결 수준이며, 주어진 컬럼 또는 데이터 객체에 대해 태그 기반 정책이 해결되지 않을 때만 적용돼요. 한 번에 하나의 계정 수준 정책만 활성화할 수 있어요. 설정하려면 ALTER ACCOUNT SET DATA MOVEMENT POLICY ...을 사용하고, 제거하려면 ALTER ACCOUNT UNSET DATA MOVEMENT POLICY을 사용해요.

연결 우선 순위

여러 정책이 적용 가능할 때 Snowflake는 작업에 관련된 각 컬럼 또는 데이터 객체에 대해 정책이 있는 가장 세분화된 연결 수준을 사용하고, 그 컬럼 또는 객체에 대해 더 거친 수준을 무시해요. 우선 순위는 가장 세분화된 것부터 가장 거친 것 순으로 다음과 같아요.

  • 컬럼 수준 태그
  • 테이블 수준 태그
  • 스키마 수준 태그
  • 데이터베이스 수준 태그
  • 계정 수준

예제: 컬럼이 컬럼 수준 태그 정책으로 커버되면 그 정책이 컬럼을 지배해요. 그 테이블 수준, 스키마 수준, 데이터베이스 수준, 계정 수준 정책은 그 컬럼에 대해 참조되지 않아요. 그러나 컬럼 수준 태그 정책이 없는 컬럼이나 객체에 대해서는 정책이 있는 다음으로 세분화된 수준이 적용돼요.

문에 대한 실행 정책 집합은 작업에 관련된 모든 컬럼과 데이터 객체에 걸친 승리 정책들의 합집합이에요. 이러한 실행 정책들에 걸친 가장 엄격한 MAX_ROWS 값이 전체 문을 지배해요.

예제: 쿼리가 두 컬럼을 읽어요. ssn 컬럼은 MAX_ROWS = 100인 컬럼 수준 태그 정책으로 커버돼요. name 컬럼에는 컬럼 수준 태그 정책이 없어요. 테이블 수준 태그 정책은 MAX_ROWS = 1000이에요. 가장 엄격한 제한이 이기므로 쿼리는 100행으로 제한돼요.

DMP에 대해 지원되는 작업

DMP 평가는 지원되는 이동 작업에 대해 다음 작업을 지원해요.

  • 허용(Allow): 데이터 이동이 알림이나 시행 기준을 트리거하지 않고 완료.
  • 알림과 함께 허용(Allow with alert): 데이터 이동이 완료되고 알림을 트리거.
  • 차단(Block): 이동 작업이 거부.

특히 UI_DOWNLOAD 이동 유형의 경우:

  • 버튼 비활성화: UI_DOWNLOAD 시행 규칙 기준이 충족되면 Snowsight UI에서 다운로드 버튼을 비활성화해 다운로드가 허용되지 않음.
  • 다운로드 허용: 시행 기준이 충족되지 않음.

이동 유형과 우선 순위

각 이동 유형의 의미

각 데이터 이동 규칙은 단일 TYPE 값에 적용돼요. TYPE은 데이터 이동 정책으로 보호되는 테이블에서 작동할 때 Snowflake가 문에 할당하는 이동 유형과 일치해야 하며, 워크로드의 사용자 정의 설명이 아니에요.

  • COPY_INTO_EXTERNAL_STAGE: Snowflake가 문을 내보내기 또는 외부 스테이지로의 COPY INTO로 분류할 때 적용(데이터가 고객 관리 객체 스토리지 또는 외부 스테이지로 노출된 다른 외부 대상에 기록됨).
  • COPY_INTO_INTERNAL_STAGE: Snowflake가 문을 내부 스테이지, 즉 계정 안의 Snowflake 관리 스테이지로의 COPY INTO로 분류할 때 적용.
  • SNOWSIGHT_UI: Snowflake가 문을 Snowsight에서 시작된 데이터 액세스로 분류할 때 적용.
  • AGENT_ACCESS: Snowflake가 문이 에이전트 또는 MCP 스타일 클라이언트를 통해 민감한 데이터에 접근하고 있다고 판단할 때 적용. 이 유형은 우선 순위 규칙에 따라 문이 COPY_INTO_EXTERNAL_STAGE 또는 COPY_INTO_INTERNAL_STAGE로 분류되지 않는 경우에만 적용돼요. Snowflake가 문을 스테이지로의 복사로 분류하면 SQL이 에이전트에 의해 실행되었더라도 일치하는 COPY_INTO_* 규칙 유형을 사용해요.
  • UI_DOWNLOAD: 사용자가 Snowsight UI에서 쿼리 결과를 다운로드할 때 적용. 구체적으로 워크스페이스의 SQL 및 Python 파일에 대한 결과 창의 Download 버튼, 워크스페이스의 노트북 셀 결과 다운로드, Query History의 결과 다운로드에 적용돼요. 이 이동 유형은 모든 다운로드 버튼에 적용되지 않아요. 커버되지 않는 버튼과 기능 예시에는 Streamlit 앱의 다운로드, Visual Studio Code 확장의 노트북, 워크스페이스의 Export as HTML 옵션, CoWork이 포함되지만 이에 국한되지 않아요. 시행 시 적용되는 다운로드 버튼이 비활성화돼요. 이 이동 유형에서는 알림 규칙이 지원되지 않아요.
  • PROGRAMMATIC_FETCH: Snowflake가 문을 드라이버 또는 커넥터, SnowSQL, Snowflake CLI, SQL API 또는 저장 프로시저에서의 프로그래매틱 데이터 액세스로 분류할 때 적용. 이 유형은 더 높은 우선 순위의 이동 유형이 일치하지 않을 때만 적용돼요. 저장 프로시저는 Snowsight와 관련하여 예외예요. 저장 프로시저 안에서 실행되는 문은 호출 세션이 Snowsight에서 시작되었더라도 SNOWSIGHT_UI가 아닌 PROGRAMMATIC_FETCH로 분류돼요.
Snowflake가 기본 이동 유형을 선택하는 방법

하나의 문에 대해 Snowflake는 DMP 평가를 위한 기본 이동 유형을 이 고정 순서로 최대 하나 선택해요.

  • COPY_INTO_EXTERNAL_STAGE
  • COPY_INTO_INTERNAL_STAGE
  • AGENT_ACCESS
  • SNOWSIGHT_UI
  • PROGRAMMATIC_FETCH

목록에서 문과 일치하는 첫 번째 분류가 이겨요. 실질적 효과: UI와 에이전트 요청은 드라이버 같은 백엔드를 통해 실행될 수 있지만 PROGRAMMATIC_FETCH가 고려되기 전에 SNOWSIGHT_UI 또는 AGENT_ACCESS로 분류돼요.

UI_DOWNLOAD와 실행 후 평가

쿼리 실행은 COPY_INTO_EXTERNAL_STAGE, COPY_INTO_INTERNAL_STAGE, SNOWSIGHT_UI, AGENT_ACCESS에 대한 데이터 이동 규칙의 평가를 트리거하고 실행을 차단할 수 있어요. 반면 UI_DOWNLOAD 규칙은 쿼리가 끝난 후 독립적으로 처리돼요. 쿼리가 성공적으로 실행되면 결과를 다운로드할 수 있는지 제어하기 위해 해당하는 곳에 UI_DOWNLOAD 제한이 시행돼요.

이동 규칙의 SYS_CONTEXT

규칙의 MAX_ROWS 표현식과 DMP가 규칙 본문에서 SQL을 허용하는 다른 곳에서 SYS_CONTEXT를 사용해 평가 시 시스템 컨텍스트를 읽을 수 있어요. 이를 통해 표준 SQL에서처럼 활성 역할, 클라이언트 및 기타 세션 컨텍스트 같은 값을 기반으로 규칙 논리를 작성할 수 있어요. 예를 들어 SYS_CONTEXT('SNOWFLAKE$SESSION', 'ROLE')을 사용해 현재 역할을 읽을 수 있어요.

기존 Snowflake 정의 네임스페이스 외에도 DMP는 평가 중인 문에 대한 이동별 컨텍스트(대상 스테이지 특성, Snowsight 표면 플래그, 에이전트 식별자 같은)를 위한 SNOWFLAKE$DATA_MOVEMENT 네임스페이스를 노출해요. SYS_CONTEXT('SNOWFLAKE$DATA_MOVEMENT', '<property>')는 관련 테이블에 나열된 문서화된 속성 이름으로만 사용해요. 속성 이름은 대소문자를 구분하지 않으며, 일부 속성은 밑줄이 있는 버전과 없는 버전 같은 대체 철자를 지원해요. 이 네임스페이스에서 지원되지 않는 속성을 참조하면 CREATE DATA MOVEMENT RULE 또는 ALTER DATA MOVEMENT RULE이 컴파일 시간에 실패해요. 지원되는 속성이 문의 기본 이동 유형에 적용되지 않거나 컨텍스트를 사용할 수 없으면 그 값을 해당 사항 없음으로 취급해요(예: NULL과 비교해).

SYS_CONTEXT는 VARCHAR를 반환해요. 부울 지원 속성은 문자열 TRUE 또는 FALSE를 반환해요. 부울 리터럴과 비교할 때는 BOOLEAN으로 캐스트해요. 반환 의미와 예제는 SYS_CONTEXT를 참고해요.

모든 기본 이동 유형에 대한 속성
속성(허용 별칭) 유형 해당 시 NULL 가능 설명
MOVEMENT_TYPE (MOVEMENTTYPE) STRING 아니요 평가된 문에 대한 데이터 이동 작업 유형의 레이블.
COPY_INTO_EXTERNAL_STAGE와 COPY_INTO_INTERNAL_STAGE에 대한 속성
속성(허용 별칭) 유형 해당 시 NULL 가능 설명
STAGE_TYPE (STAGETYPE) STRING 예 스테이지 범주: EXTERNAL 또는 INTERNAL.
STAGE_NAME (STAGENAME) STRING 예 대상 스테이지의 정규화된 이름.
DESTINATION_ENCRYPTED (ENCRYPTED) BOOLEAN 예 대상 스테이지에 대해 암호화가 활성화되어 있는지 여부.
STAGE_URL (STAGEURL) STRING 예 대상 스테이지 위치.
CLOUD_PROVIDER (CLOUDPROVIDER) STRING 예 스테이지의 클라우드 제공업체.
FILE_FORMAT (FILEFORMAT) STRING 예 내보내기 파일 형식.
SNOWSIGHT_UI에 대한 속성
속성(허용 별칭) 유형 해당 시 NULL 가능 설명
UI_SURFACE (UISURFACE) STRING 예 작업의 Snowsight 실행 표면.
IS_WORKSPACE (ISWORKSPACE) BOOLEAN 아니요(기본 false) UI_SURFACE가 WORKSPACE이면 True.
IS_STREAMLIT (ISSTREAMLIT) BOOLEAN 아니요(기본 false) UI_SURFACE가 STREAMLIT이면 True.
IS_NOTEBOOK (ISNOTEBOOK) BOOLEAN 아니요(기본 false) UI_SURFACE가 NOTEBOOK이면 True.
IS_NOTEBOOK_PROJECT (ISNOTEBOOKPROJECT) BOOLEAN 아니요(기본 false) UI_SURFACE가 NOTEBOOK_PROJECT이면 True.
AGENT_ACCESS에 대한 속성
속성(허용 별칭) 유형 해당 시 NULL 가능 설명
AGENT_NAME (AGENTNAME) STRING 예 호출 에이전트의 정규화된 이름.
UI_DOWNLOAD에 대한 속성

참고 — UI_DOWNLOAD에 대한 특정 이동 컨텍스트 속성은 없어요.

PROGRAMMATIC_FETCH에 대한 속성
속성(허용 별칭) 유형 해당 시 NULL 가능 설명
IS_DRIVERS (ISDRIVERS) BOOLEAN 아니요(기본 false) 클라이언트가 드라이버 또는 커넥터 계열(JDBC, ODBC, Python 등)에 속하면 True.
IS_SPROC (ISSPROC) BOOLEAN 아니요(기본 false) 가져오기가 저장 프로시저 안에서 발생하면 True.
IS_SNOWSQL (ISSNOWSQL) BOOLEAN 아니요(기본 false) 클라이언트가 SnowSQL이면 True.
IS_SNOWFLAKE_CLI (ISSNOWFLAKECLI) BOOLEAN 아니요(기본 false) 클라이언트가 Snowflake CLI이면 True.
IS_SQL_API (ISSQLAPI) BOOLEAN 아니요(기본 false) 클라이언트가 SQL API를 사용했으면 True.

액세스 제어

권한 객체 유형 설명
CREATE DATA MOVEMENT RULE 스키마 스키마에서 데이터 이동 규칙을 만드는 데 필요.
CREATE DATA MOVEMENT POLICY 스키마 스키마에서 데이터 이동 정책을 만드는 데 필요.
APPLY DATA MOVEMENT POLICY 계정 데이터 이동 정책을 태그 또는 계정에 연결하는 데 필요.
OWNERSHIP 규칙 또는 정책 규칙 또는 정책을 변경, 삭제 또는 이름 변경하는 데 필요.

데이터 이동 정책 구성

보호할 테이블과 뷰 계획

민감한 데이터가 포함된 테이블을 식별하고 관련 태그가 테이블 수준에서 범위 내에 있는지 확인해요. 현재 거버넌스 모델이 컬럼 수준에서 태그를 적용한다면 DMP 제어 대상 데이터 세트에 대해 테이블 수준에서 동등한 태그를 어떻게 적용할지 계획해요.

데이터 이동 규칙 만들기

제어하려는 이동 유형당 하나의 규칙을 정의해요.

다음 예제는 역할 기반 예외가 있는 엄격한 보상(compensation) 규칙을 만들어요.

CREATE OR REPLACE DATA MOVEMENT RULE hr_comp_copy_guard
  TYPE = 'COPY_INTO_EXTERNAL_STAGE'
  MAX_ROWS AS () RETURNS INTEGER
  -> (
    CASE
      WHEN SYS_CONTEXT('SNOWFLAKE$SESSION', 'ROLE') = 'COMP_TEAM_ROLE' THEN NULL
      ELSE 0
    END
  );

다음 예제는 PII에 대한 2계층 패턴을 만들어요.

CREATE OR REPLACE DATA MOVEMENT RULE hr_pii_copy_hard_boundary
  TYPE = 'COPY_INTO_EXTERNAL_STAGE'
  MAX_ROWS AS () RETURNS INTEGER
  -> (1000);

CREATE OR REPLACE DATA MOVEMENT RULE hr_pii_copy_alert_budget
  TYPE = 'COPY_INTO_EXTERNAL_STAGE'
  MAX_ROWS AS () RETURNS INTEGER
  -> (500);

SNOWFLAKE$DATA_MOVEMENT의 이동 컨텍스트를 사용하는 규칙을 만들어요(여기서는 스테이지로의 COPY에 대한 클라우드 제공업체).

CREATE OR REPLACE DATA MOVEMENT RULE export_cloud_row_budget
  TYPE = 'COPY_INTO_EXTERNAL_STAGE'
  MAX_ROWS AS () RETURNS INTEGER
  -> (
    CASE
      WHEN SYS_CONTEXT('SNOWFLAKE$DATA_MOVEMENT', 'CLOUD_PROVIDER') = 'AWS' THEN 1000
      ELSE NULL
    END
  );

에이전트 주도 액세스를 차단하는 규칙을 만들어요.

CREATE OR REPLACE DATA MOVEMENT RULE hr_comp_agent_guard
  TYPE = 'AGENT_ACCESS'
  MAX_ROWS AS () RETURNS INTEGER -> (0);

이 규칙을 데이터 이동 정책에 추가해 에이전트가 테이블 데이터에 접근하지 못하게 차단해요.

데이터 이동 정책 만들기

관련 규칙을 ENFORCE_RULES와 ALERT_RULES로 그룹화해요.

CREATE OR REPLACE DATA MOVEMENT POLICY hr_comp_dmp_strict
  ENFORCE_RULES = (hr_comp_copy_guard, hr_comp_agent_guard)
  COMMENT = 'Block Compensation export and Agent access';

CREATE OR REPLACE DATA MOVEMENT POLICY hr_pii_dmp_guardrails
  ENFORCE_RULES = (hr_pii_copy_hard_boundary)
  ALERT_RULES = (hr_pii_copy_alert_budget)
  COMMENT = 'PII guardrails: alert >= 500, block >= 1000';

정책을 태그에 연결하고 태그를 테이블에 적용

각 정책을 민감한 데이터 도메인을 나타내는 태그에 연결해요.

ALTER TAG compensation_salary SET DATA MOVEMENT POLICY hr_comp_dmp_strict;
ALTER TAG pii_ssn_full SET DATA MOVEMENT POLICY hr_pii_dmp_guardrails;
ALTER TAG pii_contact_info SET DATA MOVEMENT POLICY hr_pii_dmp_guardrails;

그런 다음 보호하려는 테이블에 해당 태그를 적용해요.

정책을 계정에 연결

태그 기반 정책으로 커버되지 않는 모든 테이블과 뷰에 기준 정책을 적용하려면 계정 수준에서 연결해요.

ALTER ACCOUNT SET DATA MOVEMENT POLICY <db_name>.<schema_name>.<policy_name>;

기존 계정 수준 정책을 교체하려면:

ALTER ACCOUNT SET DATA MOVEMENT POLICY <db_name>.<schema_name>.<policy_name> FORCE;

계정 수준 정책을 제거하려면:

ALTER ACCOUNT UNSET DATA MOVEMENT POLICY;

구성 검증

SHOW 명령을 사용해 규칙, 정책, 태그가 예상대로 구성되었는지 확인해요.

SHOW DATA MOVEMENT RULES IN SCHEMA mydb.myschema;
SHOW DATA MOVEMENT POLICIES IN SCHEMA mydb.myschema;
SHOW TAGS LIKE 'PII_%' IN SCHEMA mydb.myschema;

운영 모범 사례

현재 이동 패턴을 이해하기 위해 알림 전용 정책으로 시작한 다음 차단 규칙을 점진적으로 도입해요.

  • 넉넉한 MAX_ROWS 값을 가진 ALERT_RULES를 사용해 민감한 테이블의 이동을 기준화해요.
  • PII와 보상 데이터 같은 고위험 도메인에 ENFORCE_RULES를 추가해요.
  • 범위를 확장하기 전에 알림을 검토하고 임계값, 태깅 범위, 예외 역할 논리를 조정해요.

규모에 맞게 DMP를 운영할 때:

  • 규칙 표현식을 단순하고 읽기 쉽게 유지해요. 깊게 중첩된 표현식보다 간단한 CASE 논리를 선호해요.
  • 임계값 아래, 임계값, 임계값 위에서 확정적인 시나리오를 테스트해요.
  • 승인된 예외 역할에 SYS_CONTEXT('SNOWFLAKE$SESSION', 'ROLE') 같은 명시적 역할 인식 조건을 사용해요.
  • SYS_CONTEXT('SNOWFLAKE$DATA_MOVEMENT', '<property>')는 문의 기본 이동 유형에 대한 문서화된 속성으로만 사용해요.
  • 소유권을 사전에 정의해요. DMP 규칙과 정책을 소유할 관리 역할과 정책-태그 바인딩을 관리할 수 있는 역할을 결정해요.
  • 환경 간 변경을 추진해요. 프로덕션 출시 전에 비생산 환경에서 대표적인 워크로드를 검증해요.
  • 마스킹 정책, 행 액세스 정책 같은 다른 거버넌스 제어와 Data Exfiltration Trust Center 탐지와 함께 DMP를 사용해 심층 방어 보호를 제공해요.

복제(Cloning)

스키마 또는 데이터베이스가 복제되면 데이터 이동 규칙과 정책이 스키마 객체로 복제돼요. 그러나 복제된 정책은 규칙 연결 없이 시작돼요. ENFORCE_RULES와 ALERT_RULES 목록이 비어 있어요. 복제된 정책을 연결하기 전에 정책에 규칙을 명시적으로 추가해야 해요.

태그-정책 바인딩은 복제 중에 보존돼요. 복제된 스키마 또는 데이터베이스에 정책이 있었다면 복제된 태그의 바인딩은 복제된 정책을 참조하도록 업데이트돼요. 정책이 다른 스키마 또는 데이터베이스에 있다면 원래 정책 참조가 유지돼요.

GET_DDL

GET_DDL은 DATA MOVEMENT RULE와 DATA MOVEMENT POLICY 객체 모두에 대해 지원돼요. 출력은 각 객체 유형에 대한 CREATE OR REPLACE 문법을 따릅니다.

제한 사항

  • PARTITION BY를 사용하는 언로드 작업은 규칙 구성과 관계없이 관련 테이블에서 DMP가 활성일 때 항상 차단돼요.
  • DMP의 크로스 리전 공유 보호는 지원되지 않아요.
  • SYS_CONTEXT('SNOWFLAKE$DATA_MOVEMENT', ...)는 문의 기본 이동 유형에 대한 값만 반환해요. 다른 이동 유형의 속성은 해당 사항 없음으로 동작해요(이동 유형과 우선 순위와 이동 규칙의 SYS_CONTEXT 참고).
  • 행 임계값은 문당 평가돼요.
  • 모니터링 및 원격 측정 뷰는 지연될 수 있어요. 지연 시간은 최대 2시간이 될 수 있어요.
  • 각 이벤트에 대해 위반 레코드가 생성돼요. 그러나 서비스 중단이나 과도한 위반 기간 같은 드문 경우에는 레코드가 캡처되지 않을 수 있어요. 시행과 기록은 독립적이므로 레코드가 없다고 해서 시행이 발생하지 않았음을 나타내지는 않아요.
  • UI_DOWNLOAD 규칙에서는 알림 규칙이 지원되지 않아요.
  • UI_DOWNLOAD 위반은 DATA_MOVEMENT_VIOLATIONS account usage 뷰에 포함되지 않아요. UI_DOWNLOAD 시행은 다운로드 요청을 차단하는 대신 다운로드 버튼을 비활성화하는 방식으로 작동하므로 정책 위반 이벤트가 발생하지 않아요.

참조: SQL 명령

다음 명령을 사용해 DMP를 관리해요.

명령 설명
CREATE DATA MOVEMENT RULE 데이터 이동 규칙 만들기.
ALTER DATA MOVEMENT RULE 데이터 이동 규칙 수정.
DROP DATA MOVEMENT RULE 데이터 이동 규칙 제거.
CREATE DATA MOVEMENT POLICY 데이터 이동 정책 만들기.
ALTER DATA MOVEMENT POLICY 규칙 추가 또는 제거를 포함해 데이터 이동 정책 수정.
DROP DATA MOVEMENT POLICY 데이터 이동 정책 제거.
SHOW DATA MOVEMENT RULES 데이터 이동 규칙 나열.
SHOW DATA MOVEMENT POLICIES 데이터 이동 정책 나열.
DESCRIBE DATA MOVEMENT RULE 데이터 이동 규칙의 정의 표시.
DESCRIBE DATA MOVEMENT POLICY 데이터 이동 정책의 정의 표시.
ALTER TAG 태그에 데이터 이동 정책 연결 또는 해제(SET / UNSET DATA MOVEMENT POLICY).
ALTER ACCOUNT 계정 수준 데이터 이동 정책 연결 또는 해제(SET / UNSET DATA MOVEMENT POLICY).

데이터 이동 정책 관리(CRUD)

다음 워크플로는 데이터 이동 정책과 규칙을 만들고, 검사하고, 업데이트하고, 제거하는 방법을 보여줘요.

컨텍스트 설정

관리 역할을 사용하고 대상 데이터베이스와 스키마를 설정해요.

USE ROLE ACCOUNTADMIN;
USE DATABASE <db_name>;
USE SCHEMA <schema_name>;

만들기(Create)

먼저 규칙을 만들고, 그 다음 정책을 만들고, 그 다음 정책을 태그에 연결해요.

CREATE OR REPLACE DATA MOVEMENT RULE pii_copy_enforce_rule
  TYPE = 'COPY_INTO_EXTERNAL_STAGE'
  MAX_ROWS AS () RETURNS INTEGER
  -> (800);

CREATE OR REPLACE DATA MOVEMENT RULE pii_copy_alert_rule
  TYPE = 'COPY_INTO_EXTERNAL_STAGE'
  MAX_ROWS AS () RETURNS INTEGER
  -> (500);

CREATE OR REPLACE DATA MOVEMENT RULE pii_agent_access_enforce_rule
  TYPE = 'AGENT_ACCESS'
  MAX_ROWS AS () RETURNS INTEGER
  -> (0);

CREATE OR REPLACE DATA MOVEMENT RULE pii_ui_download_enforce_rule
  TYPE = 'UI_DOWNLOAD'
  MAX_ROWS AS () RETURNS INTEGER
  -> (100);

CREATE OR REPLACE DATA MOVEMENT RULE pii_programmatic_fetch_enforce_rule
  TYPE = 'PROGRAMMATIC_FETCH'
  MAX_ROWS AS () RETURNS INTEGER
  -> (1000);

CREATE OR REPLACE DATA MOVEMENT RULE pii_programmatic_fetch_alert_rule
  TYPE = 'PROGRAMMATIC_FETCH'
  MAX_ROWS AS () RETURNS INTEGER
  -> (500);

CREATE OR REPLACE DATA MOVEMENT POLICY pii_data_policy
  ENFORCE_RULES = (pii_copy_enforce_rule, pii_agent_access_enforce_rule,
                   pii_ui_download_enforce_rule, pii_programmatic_fetch_enforce_rule)
  ALERT_RULES = (pii_copy_alert_rule, pii_programmatic_fetch_alert_rule)
  COMMENT = 'PII guardrails: alert at 500, block above 800; block agent access; disable UI download above 100 rows; alert at 500 and block programmatic fetch above 1000';

ALTER TAG pii_tag SET DATA MOVEMENT POLICY pii_data_policy;

태그 기반 정책 대신 또는 그에 더해 전체 계정에 기준 정책을 적용하려면:

ALTER ACCOUNT SET DATA MOVEMENT POLICY pii_data_policy;

읽기(Read)

SHOW와 DESCRIBE 명령을 사용해 정책과 규칙 정의를 검사해요.

SHOW DATA MOVEMENT RULES IN SCHEMA <db_name>.<schema_name>;
SHOW DATA MOVEMENT POLICIES IN SCHEMA <db_name>.<schema_name>;
SHOW DATA MOVEMENT POLICIES IN ACCOUNT;

DESCRIBE DATA MOVEMENT RULE pii_copy_enforce_rule;
DESCRIBE DATA MOVEMENT POLICY pii_data_policy;

SHOW TAGS IN SCHEMA <db_name>.<schema_name>;

업데이트(Update)

동작을 변경하려면 규칙 논리를 업데이트하거나 정책에서 규칙 참조를 설정해요.

ALTER DATA MOVEMENT RULE pii_copy_enforce_rule
  SET MAX_ROWS AS () RETURNS INTEGER
  -> (1000);

CREATE OR REPLACE DATA MOVEMENT RULE pii_ui_alert_rule
  TYPE = 'SNOWSIGHT_UI'
  MAX_ROWS AS () RETURNS INTEGER
  -> (100);

ALTER DATA MOVEMENT POLICY pii_data_policy
  SET ALERT_RULES = (pii_copy_alert_rule, pii_ui_alert_rule);

ALTER DATA MOVEMENT POLICY pii_data_policy
  SET ALERT_RULES = (pii_copy_alert_rule);

삭제(Delete)

의존성 안전 순서를 사용해요.

  • 태그 및/또는 계정에서 정책 해제.
  • 정책에서 규칙 매핑 제거.
  • 정책 삭제.
  • 규칙 삭제.
ALTER TAG pii_tag UNSET DATA MOVEMENT POLICY pii_data_policy;
ALTER ACCOUNT UNSET DATA MOVEMENT POLICY;

ALTER DATA MOVEMENT POLICY pii_data_policy
  REMOVE ENFORCE_RULES = (pii_copy_enforce_rule, pii_agent_access_enforce_rule,
                          pii_ui_download_enforce_rule, pii_programmatic_fetch_enforce_rule);
ALTER DATA MOVEMENT POLICY pii_data_policy
  REMOVE ALERT_RULES = (pii_copy_alert_rule, pii_programmatic_fetch_alert_rule);

DROP DATA MOVEMENT POLICY IF EXISTS pii_data_policy;

DROP DATA MOVEMENT RULE IF EXISTS pii_copy_enforce_rule;
DROP DATA MOVEMENT RULE IF EXISTS pii_copy_alert_rule;
DROP DATA MOVEMENT RULE IF EXISTS pii_agent_access_enforce_rule;
DROP DATA MOVEMENT RULE IF EXISTS pii_ui_download_enforce_rule;
DROP DATA MOVEMENT RULE IF EXISTS pii_programmatic_fetch_enforce_rule;
DROP DATA MOVEMENT RULE IF EXISTS pii_programmatic_fetch_alert_rule;

운영 점검

  • 정책 삭제가 실패하면 정책이 모든 태그에서 분리되었는지 확인해요.
  • 규칙 삭제가 실패하면 그 규칙을 여전히 참조하는 정책이 없는지 확인해요.
  • 동작이 예상치 못하면 활성 역할과 이동 유형을 확인해요.

참조: Account Usage 뷰

다음 뷰는 데이터 이동 정책, 규칙, 위반에 대한 정보를 제공해요. 이 뷰는 ACCOUNT_USAGE 및 ORGANIZATION_USAGE 스키마 모두에서 사용할 수 있어요. 이 뷰에 접근하려면 계정에 대해 조직 사용량이 활성화되어야 해요.

DATA_MOVEMENT_POLICIES 뷰

이 Account Usage 뷰는 계정에 정의된 각 데이터 이동 정책에 대한 행을 표시해요.

컬럼
컬럼 이름 데이터 유형 설명
ID NUMBER 데이터 이동 정책에 대한 내부/시스템 생성 식별자.
NAME VARCHAR 데이터 이동 정책의 이름.
SCHEMA_ID NUMBER 정책 스키마에 대한 내부/시스템 생성 식별자.
SCHEMA VARCHAR 데이터 이동 정책의 스키마.
DATABASE_ID NUMBER 정책 데이터베이스에 대한 내부/시스템 생성 식별자.
DATABASE VARCHAR 데이터 이동 정책의 데이터베이스.
OWNER VARCHAR 데이터 이동 정책을 소유한 역할의 이름.
COMMENT VARCHAR 데이터 이동 정책에 대한 주석.
CREATED TIMESTAMP_LTZ 데이터 이동 정책이 생성된 날짜와 시간.
LAST_ALTERED TIMESTAMP_LTZ 데이터 이동 정책이 마지막으로 변경된 날짜와 시간.
DELETED TIMESTAMP_LTZ 데이터 이동 정책이 삭제된 날짜와 시간.
OWNER_ROLE_TYPE VARCHAR 객체를 소유한 역할의 유형(예: ROLE 또는 DATABASE_ROLE).
사용 참고 사항
  • 뷰의 지연 시간은 최대 120분(2시간)일 수 있어요.
  • 뷰는 세션의 현재 역할에 액세스 권한이 부여된 객체만 표시해요.

DATA_MOVEMENT_POLICY_RULES 뷰

이 Account Usage 뷰는 계정에 정의된 각 데이터 이동 규칙에 대한 행을 표시해요.

컬럼
컬럼 이름 데이터 유형 설명
ID NUMBER 데이터 이동 규칙에 대한 내부/시스템 생성 식별자.
NAME VARCHAR 데이터 이동 규칙의 이름.
SCHEMA_ID NUMBER 규칙 스키마에 대한 내부/시스템 생성 식별자.
SCHEMA VARCHAR 데이터 이동 규칙의 스키마.
DATABASE_ID NUMBER 규칙 데이터베이스에 대한 내부/시스템 생성 식별자.
DATABASE VARCHAR 데이터 이동 규칙의 데이터베이스.
OWNER VARCHAR 데이터 이동 규칙을 소유한 역할의 이름.
OWNER_ROLE_TYPE VARCHAR 객체를 소유한 역할의 유형(예: ROLE 또는 DATABASE_ROLE).
COMMENT VARCHAR 데이터 이동 규칙에 대한 주석.
MOVEMENT_TYPE VARCHAR 규칙이 적용되는 이동 유형: COPY_INTO_EXTERNAL_STAGE, COPY_INTO_INTERNAL_STAGE, AGENT_ACCESS, SNOWSIGHT_UI, UI_DOWNLOAD, PROGRAMMATIC_FETCH 또는 UNKNOWN.
FUNCTION_SIGNATURE VARCHAR 규칙 함수의 매개 변수 시그니처.
FUNCTION_BODY VARCHAR 규칙의 SQL 표현식 본문.
FUNCTION_RETURN_TYPE VARCHAR 규칙 함수의 반환 데이터 유형.
CREATED TIMESTAMP_LTZ 데이터 이동 규칙이 생성된 날짜와 시간.
LAST_ALTERED TIMESTAMP_LTZ 데이터 이동 규칙이 마지막으로 변경된 날짜와 시간.
DELETED TIMESTAMP_LTZ 데이터 이동 규칙이 삭제된 날짜와 시간.
사용 참고 사항
  • 뷰의 지연 시간은 최대 2시간일 수 있어요.
  • 뷰는 세션의 현재 역할에 액세스 권한이 부여된 객체만 표시해요.

DATA_MOVEMENT_VIOLATIONS 뷰

이 Account Usage 뷰는 계정에서 데이터 이동 정책을 위반한 각 쿼리에 대한 행을 표시해요. 각 행은 잠재적으로 많은 테이블에 걸쳐 트리거된 모든 정책을 쿼리 ID로 키를 지정한 단일 항목으로 통합해요.

컬럼
컬럼 이름 데이터 유형 설명
QUERY_ID VARCHAR 데이터 이동 정책을 위반한 쿼리의 ID.
ENFORCED_POLICY VARCHAR 쿼리가 트리거한 시행 규칙과 해당 정책의 FQN. 트리거된 시행 규칙이 없으면 NULL.
MOVEMENT_TYPE VARCHAR 위반을 트리거한 문의 이동 유형. 가능한 값: COPY_INTO_EXTERNAL_STAGE, COPY_INTO_INTERNAL_STAGE, SNOWSIGHT_UI, AGENT_ACCESS, PROGRAMMATIC_FETCH. UI_DOWNLOAD 위반은 이 뷰에 포함되지 않아요.
ALERTED_POLICIES VARCHAR 쿼리가 트리거한 알림 규칙과 해당 정책의 FQN.
USER_NAME VARCHAR 쿼리를 실행한 사용자의 이름.
DATA_ENTITIES ARRAY 쿼리에 관련된 테이블의 FQN.
TIMESTAMP TIMESTAMP_LTZ 쿼리의 타임스탬프.
사용 참고 사항
  • 뷰의 지연 시간은 최대 3시간일 수 있어요.

DATA_MOVEMENT_RULE_REFERENCES 뷰

이 Account Usage 뷰는 계정의 각 규칙-정책 매핑에 대한 행을 표시해요. 어떤 규칙이 어떤 정책에 할당되었는지, 각 규칙이 시행 목록인지 알림 목록인지를 보여줘요.

컬럼
컬럼 이름 데이터 유형 설명
POLICY_ID NUMBER 데이터 이동 정책에 대한 내부/시스템 생성 식별자.
POLICY_NAME VARCHAR 데이터 이동 정책의 이름.
POLICY_DATABASE VARCHAR 데이터 이동 정책의 데이터베이스.
POLICY_SCHEMA VARCHAR 데이터 이동 정책의 스키마.
RULE_ID NUMBER 데이터 이동 규칙에 대한 내부/시스템 생성 식별자.
RULE_NAME VARCHAR 데이터 이동 규칙의 이름.
RULE_DATABASE VARCHAR 데이터 이동 규칙의 데이터베이스.
RULE_SCHEMA VARCHAR 데이터 이동 규칙의 스키마.
RULE_MOVEMENT_TYPE VARCHAR 규칙의 이동 유형: COPY_INTO_EXTERNAL_STAGE, COPY_INTO_INTERNAL_STAGE, AGENT_ACCESS, SNOWSIGHT_UI, UI_DOWNLOAD, PROGRAMMATIC_FETCH 또는 UNKNOWN.
RULE_CATEGORY VARCHAR 규칙이 시행 목록인지 알림 목록인지: ENFORCE 또는 ALERT.
사용 참고 사항
  • 뷰의 지연 시간은 최대 3시간일 수 있어요.
  • 뷰는 세션의 현재 역할에 액세스 권한이 부여된 객체만 표시해요.
  • 활성 규칙-정책 매핑만 포함돼요. ALTER DATA MOVEMENT POLICY REMOVE ENFORCE_RULES 또는 REMOVE ALERT_RULES로 제거된 매핑은 제외돼요.

더 알아보기