CREATE PRIVACY POLICY

CREATE PRIVACY POLICY

새 프라이버시 정책(privacy policy)을 만들거나 기존 프라이버시 정책을 교체하는 명령이에요. 프라이버시 정책은 차등 프라이버시(differential privacy)를 적용해 테이블에 대한 쿼리가 소비하는 프라이버시 예산(budget)을 제어해요.

출처: 문서

본문

새 프라이버시 정책을 만들거나 기존 프라이버시 정책을 교체해요.

함께 보기: ALTER PRIVACY POLICY, DESCRIBE PRIVACY POLICY, DROP PRIVACY POLICY, SHOW PRIVACY POLICIES

구문 (Syntax)

CREATE [ OR REPLACE ] PRIVACY POLICY [ IF NOT EXISTS ] <name>
  AS () RETURNS PRIVACY_BUDGET -> <body>
  [ COMMENT = '<string_literal>' ]

필수 매개변수 (Required parameters)

name 프라이버시 정책의 식별자(즉 이름)를 지정하는 문자열로, 프라이버시 정책이 만들어지는 스키마 안에서 고유해야 해요.

또한 식별자는 반드시 알파벳 문자로 시작해야 하며, 전체 식별자 문자열이 큰따옴표로 묶이지 않는 한 공백이나 특수 문자를 포함할 수 없어요 (예: "My object"). 큰따옴표로 묶인 식별자는 대소문자를 구분해요.

자세한 내용은 식별자 요구 사항(Identifier requirements)을 참고해요.

body 본문의 SQL 표현식은 정책의 반환 값을 제어하기 위해 NO_PRIVACY_POLICY와 PRIVACY_BUDGET 두 함수를 호출해요. 정책이 할당된 테이블에 대해 쿼리가 실행되면, Snowflake는 본문의 조건을 평가해 적절한 함수를 호출하고 값을 반환해요. 이 반환 값은 프라이버시 보호 테이블에 대한 쿼리와 연결될 프라이버시 예산(있는 경우)을 결정해요.

표현식은 CURRENT_ROLE 또는 INVOKER_ROLE 같은 컨텍스트 함수를 사용해 사용자나 사용자 그룹을 프라이버시 예산과 연결할 수 있어요.

본문의 표현식에서 CASE 블록을 사용한다면 NO_PRIVACY_POLICY 또는 PRIVACY_BUDGET을 호출하는 ELSE 문을 반드시 포함해야 해요. 모든 사용자는 프라이버시 예산과 연결되거나 프라이버시 보호 테이블에 대한 무제한 접근 권한을 가져야 해요. 사용자가 프라이버시 보호 테이블이나 뷰에 접근해서는 안 된다면, 프라이버시 정책에서 정의하려고 하지 말고 SELECT 권한을 회수해요.

NO_PRIVACY_POLICY 프라이버시 정책이 할당된 테이블이나 뷰에 대한 쿼리가 무제한 접근 권한을 갖기를 원할 때 본문의 표현식으로 NO_PRIVACY_POLICY 함수를 호출해요.

PRIVACY_BUDGET 정책에서 프라이버시 예산을 반환하려면 본문의 표현식으로 PRIVACY_BUDGET 함수를 호출해요. 표현식은 쿼리를 실행하는 사용자 같은 요인에 따라 다른 쿼리에 다른 프라이버시 예산을 반환하도록 하는 조건을 포함할 수 있어요.

계정 간 협업에서 프라이버시 예산은 소비자 계정의 계정 식별자로 자동으로 네임스페이스가 지정되어, 프라이버시 예산의 이름이 같더라도 두 소비자 계정이 같은 프라이버시 예산을 공유하지 못해요. CURRENT_ACCOUNT 함수를 사용해 계정 이름과 프라이버시 예산 이름을 연결하면 예산을 구분하는 데 도움이 될 수 있어요. 예를 들어 PRIVACY_BUDGET(BUDGET_NAME => 'external_budget.' || CURRENT_ACCOUNT())처럼 함수를 호출할 수 있어요.

PRIVACY_BUDGET 함수의 시그니처는 다음과 같아요.

PRIVACY_BUDGET(
  BUDGET_NAME=> '<string>'
  [, BUDGET_LIMIT=> <decimal> ]
  [, MAX_BUDGET_PER_AGGREGATE=> <decimal> ]
  [, BUDGET_WINDOW=> <string> ]
)

프라이버시 예산 인자:

BUDGET_NAME => expression 프라이버시 예산의 이름으로 해석돼요. 프라이버시 정책의 본문에서 이름이 지정되면 Snowflake가 프라이버시 예산을 자동으로 만들어요.

BUDGET_LIMIT => decimal 이 프라이버시 정책의 예산 한도를 지정하는 0보다 큰 십진수예요. 허용되는 총 프라이버시 손실량을 제어해요. 이 값을 조정하면 새로 고침 기간 동안 이 프라이버시 예산으로 보호되는 테이블에 대해 계산할 수 있는 총 차등 프라이버시 집계의 수가 달라져요. 누적 프라이버시 손실이 이 숫자를 초과하게 하는 쿼리가 실행되면 쿼리가 실패해요. 대략적으로 예산 한도 233과 MAX_BUDGET_PER_AGGREGATE=1이면 새로 고침 기간당 약 1000개의 집계가 허용돼요.

  • 기본값: 233.0

MAX_BUDGET_PER_AGGREGATE => decimal 쿼리의 각 집계 함수가 사용하는 프라이버시 예산의 양을 지정해요. 이 값을 조정하면 각 집계 쿼리에 추가되는 노이즈의 양과, 예산 한도에 도달하기 전에 계산할 수 있는 집계 수가 달라져요. 예를 들어 select count(*), avg(a) ... 쿼리는 count(*)avg(a) 두 개의 집계를 가져요. 0보다 큰 십진수를 지정해요.

  • 기본값: 0.5

BUDGET_WINDOW => string 프라이버시 예산이 새로 고쳐지는 주기, 즉 누적 프라이버시 손실이 0으로 재설정되는 주기예요. 유효한 값:

  • Daily: 매일 UTC 오전 12:00에 새로 고침

  • Weekly: 매주 일요일 UTC 오전 12:00에 새로 고침

  • Monthly: 매월 1일 UTC 오전 12:00에 새로 고침

  • Yearly: 매년 1월 1일 UTC 오전 12:00에 새로 고침

  • Never: 프라이버시 예산이 절대 새로 고침되지 않음

  • 기본값: Weekly

선택 매개변수 (Optional parameters)

COMMENT = 'string_literal' 프라이버시 정책에 대한 설명(comment)을 지정해요.

  • 기본값: 값 없음

접근 제어 요구 사항 (Access control requirements)

이 작업을 실행하는 데 사용하는 역할(role)은 최소한 다음 권한을 가져야 해요.

권한 (Privilege) 객체 (Object) 비고
CREATE PRIVACY POLICY Schema

스키마 안의 객체를 작업하려면 상위 데이터베이스에 대한 권한이 최소 하나, 상위 스키마에 대한 권한이 최소 하나 필요해요.

지정된 권한 집합으로 사용자 지정 역할을 만드는 방법은 사용자 지정 역할 만들기(Creating custom roles)를 참고해요. 보호 가능한 객체에 대해 SQL 작업을 수행하기 위한 역할과 권한 부여의 일반적인 내용은 접근 제어 개요(Overview of Access Control)를 참고해요.

사용 메모 (Usage notes)

메타데이터에 관해서는 다음 사항에 주의해요.

⚠️ 주의: 고객은 Snowflake 서비스를 사용할 때 (User 객체를 제외하고) 개인 데이터·민감 데이터·수출 통제 데이터·기타 규제 데이터를 메타데이터로 입력하지 않도록 해야 해요. 자세한 내용은 Snowflake의 메타데이터 필드를 참고해요.

OR REPLACEIF NOT EXISTS 절은 서로 배타적이에요. 같은 문에서 둘 다 사용할 수 없어요.

CREATE OR REPLACE <object> 문은 원자적(atomic)으로 동작해요. 즉, 객체를 교체할 때 기존 객체는 삭제되고 새 객체는 단일 트랜잭션 안에서 생성돼요.

예시 (Examples)

항상 analysts라는 예산을 반환하는 프라이버시 정책을 만들어요.

CREATE PRIVACY POLICY my_priv_policy
  AS ( ) RETURNS PRIVACY_BUDGET ->
  PRIVACY_BUDGET(BUDGET_NAME=> 'analysts');

admin에게 프라이버시 보호 테이블에 대한 무제한 접근 권한을 주고, 다른 모든 사용자를 analysts 프라이버시 예산과 연결하는 프라이버시 정책을 만들어요.

CREATE PRIVACY POLICY my_priv_policy
  AS () RETURNS PRIVACY_BUDGET ->
    CASE
      WHEN CURRENT_USER() = 'ADMIN'
        THEN NO_PRIVACY_POLICY()
      ELSE PRIVACY_BUDGET(BUDGET_NAME => 'analysts')
    END;

더 알아보기 (Learn more)