집계 정책

집계 정책 (Aggregation policies)

Enterprise Edition 기능

이 기능에는 Enterprise Edition(이상)이 필요해요. 업그레이드 문의는 Snowflake Support에 연락해요.

집계 정책(aggregation policy)은 테이블이나 뷰에서 어떤 유형의 쿼리가 데이터에 접근할 수 있는지 제어하는 스키마 수준 객체예요. 테이블에 집계 정책을 적용하면 해당 테이블에 대한 쿼리는 결과를 반환하기 위해 데이터를 최소 크기의 그룹으로 집계해야 하며, 이를 통해 쿼리가 개별 레코드의 정보를 반환하지 못하게 해요. 집계 정책이 할당된 테이블이나 뷰를 집계 제한(aggregation-constrained) 이라고 말해요.

집계 정책은 엔티티 키(entity key)와 함께 또는 없이 사용할 수 있어요. 엔티티 키 없이 집계 정책을 사용하면 데이터 세트의 개별 행의 프라이버시를 보호해요(즉 행 수준 프라이버시). 엔티티 키와 함께 집계 정책을 사용하면 해당 엔티티에 대한 정보가 여러 행에 나타나더라도 엔티티의 프라이버시를 보호해요(즉 엔티티 수준 프라이버시).

집계 정책과 엔티티 키를 결합하는 방법에 대한 자세한 내용은 집계 정책으로 엔티티 수준 프라이버시 구현 을 참고해요.

출처: Snowflake 문서 - Aggregation policies

본문

개요

Snowflake의 핵심 기능은 데이터 세트를 다른 엔티티와 공유하는 능력이에요. 집계 정책을 사용하면 프로바이더(데이터 소유자)가 데이터를 소비자에게 공유한 후에도 데이터로 무엇을 할 수 있는지 제어할 수 있어요. 구체적으로 프로바이더는 테이블의 소비자가 개별 레코드를 검색하는 대신 데이터를 집계하도록 요구할 수 있어요.

집계 정책을 만들 때 프로바이더의 정책 관리자는 최소 그룹 크기(즉 함께 그룹으로 집계되어야 하는 행 수)를 지정해요. 최소 그룹 크기가 클수록 소비자가 쿼리 결과를 사용해 단일 레코드의 내용을 추론할 가능성이 낮아져요.

집계 정책이 테이블이나 뷰에 적용되면 그에 대한 쿼리는 두 가지 요구 사항을 충족해야 해요.

  • 쿼리는 데이터를 집계해야 해요. 쿼리가 집계 함수를 사용하면 허용된 집계 함수 중 하나여야 해요.
  • 쿼리가 만드는 각 그룹에는 최소 X개 레코드의 집계가 포함되어야 하며, 여기서 X는 집계 정책의 최소 그룹 크기예요.

쿼리가 정책의 최소 그룹 크기보다 적은 레코드를 포함하는 그룹을 반환하면 Snowflake는 해당 그룹들을 나머지 그룹(remainder group) 으로 결합해요. Snowflake는 적절한 컬럼에 집계 함수를 적용해 나머지 그룹의 값을 반환해요. 그러나 그 값은 둘 이상의 그룹에 속한 행에서 계산되므로 GROUP BY 키 컬럼의 값은 NULL이에요. 예를 들어 쿼리에 GROUP BY state 절이 포함되어 있으면 나머지 그룹의 state 값은 NULL이에요.

나머지 그룹을 채울 만큼 결과가 충분하지 않은 쿼리도 여전히 작동하지만, 결과의 모든 필드에 NULL 값을 반환해요.

제한 사항

  • 집계 정책으로 외부 테이블을 보호할 수 없어요.
  • 쿼리가 명시적 그룹화 구문을 사용하면 GROUP BY 절이어야 해요. 쿼리는 GROUP BY ROLLUP , GROUP BY CUBE , GROUP BY GROUPING SETS 같은 관련 구문을 사용할 수 없어요.
  • 하나의 쿼리가 집계 제한 테이블에 대해 동작할 때 대부분의 집합 연산자(set operators) 는 허용되지 않아요. 예외로 UNION ALL은 지원되지만, 각 결과 그룹이 쿼리되는 집계 제한 테이블의 최소 그룹 크기를 충족해야 해요(자세한 내용은 쿼리 요구 사항 참고).
  • 집계 제한 테이블의 컬럼이 프로젝션 정책(projection policy) 으로 보호되면 해당 테이블에 대한 쿼리는 그 컬럼을 COUNT 함수의 인자로 사용할 수 없어요.
  • 집계 제한 테이블이나 뷰에 대한 쿼리에는 재귀적 CTE(recursive CTE) 가 허용되지 않아요.
  • 집계 제한 테이블이나 뷰에 대한 쿼리에는 윈도우 함수(window functions) 가 허용되지 않아요.
  • 집계 제한 테이블에 대한 쿼리는 집계 정책의 요구 사항을 충족하는 쿼리 부분에 대한 참조가 있을 때 상관 서브쿼리(correlated subquery) 나 lateral join 을 사용할 수 없어요. 다음 예제는 금지된 쿼리 유형을 보여줘요.
    • 예제 1: protected_table 이 집계 제한이라고 가정하면, 데이터를 집계하는 쿼리 부분이 서브쿼리 밖의 다른 쿼리 부분을 참조하므로 다음 쿼리는 허용되지 않아요.
      SELECT c1, c2
        FROM open_table
        WHERE c1 = (SELECT x FROM protected_table WHERE y = open_table.c2);
      
    • 예제 2: protected_table 이 집계 제한이라고 가정하면, 서브쿼리가 데이터를 집계하는 서브쿼리 밖의 쿼리 부분을 참조하므로 다음 쿼리는 허용되지 않아요.
      SELECT
        SUM(SELECT COUNT(*) FROM open_table ot WHERE pt.id = ot.id)
        FROM protected_table pt;
      

고려 사항

집계 정책으로 민감한 데이터를 보호할 때 다음을 고려해요.

  • 집계 정책은 엔티티가 아니라 개별 레코드에 대한 데이터를 보호해요. 데이터 세트에 같은 엔티티에 속한 여러 레코드가 포함되어 있으면 집계 정책은 해당 엔티티 전체가 아니라 그 엔티티에 대한 특정 레코드의 프라이버시만 보호해요.
  • 집계 정책은 개별 레코드에 대한 접근을 제한하지만, 악의적인 행위자가 의도적인 쿼리로 집계 제한 테이블에서 잠재적으로 민감한 데이터를 얻지 못한다는 것을 보장하지는 않아요. 충분히 많은 쿼리 시도로 악의적인 행위자가 집계 요구 사항을 우회해 개별 행의 값을 알아낼 수 있을 수도 있어요. 집계 정책은 어느 정도 신뢰가 있는 파트너와 고객과 함께 사용하기에 가장 적합해요. 또한 프로바이더는 데이터의 잠재적 오용에 대해 경계해야 해요(예: 리스팅의 접근 이력 검토).

집계 정책 만들기

집계 정책을 만드는 구문은 다음과 같아요.

CREATE [OR REPLACE] AGGREGATION POLICY <name>
  AS () RETURNS AGGREGATION_CONSTRAINT -> <body>
  [COMMENT = '<string_literal>'];

여기서:

  • name은 정책의 이름을 지정해요.
  • AS () RETURNS AGGREGATION_CONSTRAINT는 정책의 시그니처와 반환 타입이에요. 시그니처는 인자를 받지 않으며 반환 타입은 내부 데이터 타입인 AGGREGATION_CONSTRAINT예요. 모든 집계 정책은 동일한 시그니처와 반환 타입을 가져요.
  • body는 집계 정책의 제한을 결정하는 SQL 표현식이에요.

body에서 함수 호출

집계 정책의 body는 정책의 제한을 정의하기 위해 두 함수를 사용해요: NO_AGGREGATION_CONSTRAINT 와 AGGREGATION_CONSTRAINT . body의 조건이 이 함수 중 하나를 호출하면 함수의 반환 값이 집계 제한 테이블이나 뷰에 대한 쿼리가 결과를 반환하기 위해 어떻게 구성되어야 하는지 결정해요.

NO_AGGREGATION_CONSTRAINT — 집계 정책이 할당된 테이블이나 뷰에 대한 쿼리가 무제한 접근을 가지길 원할 때 body의 표현식을 사용해 NO_AGGREGATION_CONSTRAINT 함수를 호출해요.

AGGREGATION_CONSTRAINT — 쿼리가 결과를 반환하기 위해 데이터를 집계하도록 요구하려면 body의 표현식을 사용해 AGGREGATION_CONSTRAINT 함수를 호출해요. MIN_GROUP_SIZE 인자를 사용해 각 집계 그룹에 포함될 행 또는 엔티티 수를 지정해요.

NO_AGGREGATION_CONSTRAINT 및 AGGREGATION_CONSTRAINT 함수의 전체 구문은 CREATE AGGREGATION POLICY 를 참고해요.

참고: 집계 정책의 body는 사용자 정의 함수, 테이블 또는 뷰를 참조할 수 없어요.

예제 정책

고정 최소 그룹 크기 — 가장 단순한 집계 정책은 AGGREGATION_CONSTRAINT 함수를 직접 호출하고 테이블에 대한 모든 쿼리에 적용되는 상수 최소 그룹 크기를 정의해요. 예를 들어 다음 명령은 최소 그룹 크기가 5인 집계 정책을 만들어요.

CREATE AGGREGATION POLICY my_agg_policy
  AS () RETURNS AGGREGATION_CONSTRAINT -> AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 5);

조건부 정책 — 정책 관리자는 집계 정책의 SQL 표현식을 정의해 쿼리를 실행하는 사용자의 역할 같은 요인에 따라 다른 쿼리에 다른 제한이 적용되도록 할 수 있어요. 이 전략을 사용하면 한 사용자는 제한 없이 테이블을 쿼리하고 다른 사용자는 결과를 집계하도록 요구할 수 있어요.

예를 들어 다음 집계 정책은 ADMIN 역할을 가진 사용자에게 테이블에 대한 무제한 접근을 제공하고 다른 모든 쿼리는 데이터를 최소 5행 또는 엔티티의 그룹으로 집계하도록 요구해요.

CREATE AGGREGATION POLICY my_agg_policy
  AS () RETURNS AGGREGATION_CONSTRAINT ->
  CASE
    WHEN CURRENT_ROLE() = 'ADMIN'
    THEN NO_AGGREGATION_CONSTRAINT()
    ELSE AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 5)
  END;

팁: 조건부 정책에서 CURRENT_ROLE 같은 컨텍스트 함수를 사용할 때 다음 전략을 사용할 수 있어요.

  • 컨텍스트 함수는 문자열을 반환하므로 이를 사용한 비교는 대소문자를 구분해요. 대소문자를 구분하지 않는 비교를 원한다면 LOWER를 사용해 문자열을 모두 소문자로 변환할 수 있어요.
  • POLICY_CONTEXT 함수는 컨텍스트 함수나 SYS_CONTEXT 속성이 특정 값을 반환할 때 정책 body가 올바른 값을 반환하는지 평가하는 데 도움이 돼요. POLICY_CONTEXT 함수는 활성화된 역할과 에이전트 유형 같은 하나 이상의 컨텍스트 함수 또는 SYS_CONTEXT 네임스페이스 속성의 지정된 값을 기반으로 쿼리 결과를 시뮬레이션해요.

실행 컨텍스트에서 에이전트가 활성화된 경우 — 실행 컨텍스트에서 에이전트가 활성화되어 있으면 IS_AGENT_ACTIVATED 를 집계 정책에서 사용해 사용자의 역할이 그렇지 않으면 비집계 접근을 허용하더라도 집계를 요구할 수 있어요. 에이전트가 활성화되어 있지 않으면 ADMIN 사용자 지정 역할이 집계 없이 쿼리할 수 있어요.

CREATE OR REPLACE AGGREGATION POLICY agg_when_agent AS ()
  RETURNS AGGREGATION_CONSTRAINT ->
  CASE
    WHEN SYS_CONTEXT('SNOWFLAKE$CURRENT', 'IS_AGENT_ACTIVATED')::BOOLEAN = TRUE
    THEN AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 5)
    WHEN CURRENT_ROLE() = 'ADMIN'
    THEN NO_AGGREGATION_CONSTRAINT()
    ELSE AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 5)
  END;

집계 정책 수정

ALTER AGGREGATION POLICY 명령을 사용해 집계 정책의 최소 그룹 크기를 결정하는 SQL 표현식을 수정할 수 있어요. 정책 이름을 바꾸거나 주석을 변경할 수도 있어요.

집계 정책을 수정하기 전에 DESCRIBE AGGREGATION POLICY 명령이나 GET_DDL 함수를 실행해 정책의 현재 SQL 표현식을 검토할 수 있어요. 최소 그룹 크기를 결정하는 SQL 표현식은 BODY 컬럼에 표시돼요.

예를 들어 다음 명령을 실행해 집계 정책 my_policy 의 SQL 표현식을 변경해 모든 상황에서 최소 그룹 크기가 2행이 되도록 요구할 수 있어요.

ALTER AGGREGATION POLICY my_policy SET BODY -> AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 2);

집계 정책 할당

생성된 집계 정책은 하나 이상의 테이블이나 뷰에 적용해 집계 제한으로 만들 수 있어요. 테이블이나 뷰에는 집계 정책 하나만 연결할 수 있어요.

ALTER TABLE 또는 ALTER VIEW 명령의 SET AGGREGATION POLICY 절을 사용해 기존 테이블이나 뷰에 집계 정책을 할당해요.

ALTER {TABLE | VIEW} <name> SET AGGREGATION POLICY <policy_name> [FORCE]

여기서:

  • name은 테이블이나 뷰의 이름을 지정해요.
  • policy_name은 집계 정책의 이름을 지정해요.
  • FORCE는 이미 집계 정책이 할당된 테이블이나 뷰에 집계 정책을 할당할 수 있게 하는 선택적 파라미터예요. 새 집계 정책은 기존 것을 원자적으로 교체해요.

예를 들어 정책 my_agg_policy 를 테이블 t1 에 할당하려면 다음을 실행해요.

ALTER TABLE t1 SET AGGREGATION POLICY my_agg_policy;

또한 CREATE TABLE 및 CREATE VIEW 명령의 WITH 절을 사용해 생성 시점에 테이블이나 뷰에 집계 정책을 할당할 수 있어요. 예를 들어 정책 my_agg_policy 를 새 테이블에 할당하려면 다음을 실행해요.

CREATE TABLE t1 WITH AGGREGATION POLICY my_agg_policy;

집계 정책 교체

집계 정책을 교체하는 권장 방법은 FORCE 파라미터를 사용해 기존 집계 정책을 분리하고 단일 명령으로 새 정책을 할당하는 것이에요. 이렇게 하면 보호에 공백 없이 이전 정책을 원자적으로 교체할 수 있어요.

예를 들어 이미 집계 제한인 테이블에 새 집계 정책을 할당하려면:

ALTER TABLE privacy SET AGGREGATION POLICY agg_policy_2 FORCE;

또한 한 문에서 테이블이나 뷰에서 집계 정책을 분리(… UNSET AGGREGATION POLICY)한 다음 다른 문에서 테이블이나 뷰에 새 정책을 설정(… SET AGGREGATION POLICY )할 수도 있어요. 이 방법을 선택하면 테이블은 정책 하나를 분리하고 다른 정책을 할당하는 사이에 집계 정책으로 보호되지 않아요. 이 시간 동안 쿼리가 민감한 데이터에 접근할 수 있어요.

집계 정책 분리

ALTER TABLE 또는 ALTER VIEW 명령의 UNSET AGGREGATION POLICY 절을 사용해 테이블이나 뷰에서 집계 정책을 분리해 데이터를 집계할 필요를 제거해요. 테이블이나 뷰에는 둘 이상의 집계 정책을 연결할 수 없으므로 집계 정책의 이름은 필요하지 않아요.

ALTER {TABLE | VIEW} <name> UNSET AGGREGATION POLICY

여기서:

  • name은 테이블이나 뷰의 이름을 지정해요.

예를 들어 뷰 v1 에서 집계 정책을 분리하려면 다음을 실행해요.

ALTER VIEW v1 UNSET AGGREGATION POLICY;

Snowsight로 집계 정책 보기

테이블이나 뷰에 집계 정책이 있는지 확인하려면 다음을 수행해요.

  • Snowsight 에 로그인해요.
  • 탐색 메뉴에서 Catalog » Explorer 를 선택한 다음 테이블이나 뷰를 선택해요.
  • Table Details 탭에서 Policies 섹션을 찾아 집계 정책을 찾아요.
  • 집계 정책의 최소 그룹 크기를 확인하려면 Minimum Group Size 필드를 찾아요. 정책의 body가 복잡하고 조건에 따라 최소 그룹 크기가 다르면 숫자 대신 Case dependent 가 표시돼요. 복잡한 body의 경우 집계 정책 이름 위에 마우스를 올리면 body를 볼 수 있어 최소 그룹 크기를 확인하는 데 도움이 돼요.
  • 테이블의 엔티티 키를 구성하는 컬럼을 확인하려면 Entity Key Columns 필드를 찾아요. 테이블이나 뷰에 엔티티 키가 둘 이상이면 정책이 Policies 섹션에 엔티티 키마다 여러 번 나타나요.

집계 정책 모니터링

집계 정책 사용량을 모니터링하는 방법을 결정하는 두 가지 일반적인 접근 방식을 고려하는 것이 도움이 돼요.

  • 집계 정책 검색
  • 집계 정책 참조 식별

집계 정책 검색

공유 SNOWFLAKE 데이터베이스의 Account Usage 스키마에 있는 AGGREGATION_POLICIES 뷰를 사용할 수 있어요. 이 뷰는 Snowflake 계정의 모든 집계 정책에 대한 카탈로그 예요. 예:

SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.AGGREGATION_POLICIES
  ORDER BY POLICY_NAME;

집계 정책 참조 식별

POLICY_REFERENCES Information Schema 테이블 함수로 집계 정책 참조를 식별할 수 있어요. 두 가지 다른 구문 옵션이 있어요.

  • 지정된 집계 정책이 설정된 각 객체(즉 테이블이나 뷰)에 대한 행을 반환해요.
    USE DATABASE my_db;
    USE SCHEMA information_schema;
    SELECT policy_name,
      policy_kind,
      ref_entity_name,
      ref_entity_domain,
      ref_column_name,
      ref_arg_column_names,
      policy_status
    FROM TABLE(information_schema.policy_references(policy_name => 'my_db.my_schema.aggpolicy'));
    
  • my_table 이라는 테이블에 할당된 각 정책에 대한 행을 반환해요.
    USE DATABASE my_db;
    USE SCHEMA information_schema;
    SELECT policy_name,
      policy_kind,
      ref_entity_name,
      ref_entity_domain,
      ref_column_name,
      ref_arg_column_names,
      policy_status
    FROM TABLE(information_schema.policy_references(ref_entity_name => 'my_db.my_schema.my_table', ref_entity_domain => 'table'));
    

쿼리 요구 사항

집계 정책이 테이블이나 뷰에 적용된 후에는 그 테이블이나 뷰에 대한 쿼리가 특정 요구 사항을 충족해야 해요. 이 섹션은 집계 제한 테이블이나 뷰에 대한 쿼리에서 허용되는 것과 허용되지 않는 것을 다뤄요.

참고: 쿼리의 일부가 집계 정책의 요구 사항을 충족하도록 데이터를 적절히 집계하면 이러한 쿼리 제한은 적용되지 않으며, 쿼리의 다른 부분에는 그렇지 않으면 금지되는 것을 포함할 수 있어요.

예를 들어 다음 쿼리는 쿼리의 다른 부분이 protected_table 에 할당된 정책의 집계 요구 사항을 이미 충족했으므로 결과를 집계하지 않는 SELECT 문을 사용할 수 있어요.

SELECT * FROM open_table ot WHERE ot.a > (SELECT SUM(id) FROM protected_table pt)

쿼리에 포함될 수 있는 것에 대한 추가 제한은 제한 사항 을 참고해요.

집계 함수 — 집계 제한 테이블에 대한 쿼리에서 허용되는 집계 함수는 다음과 같아요.

  • AVG
  • COUNT [DISTINCT]
  • HLL
  • SUM

쿼리는 허용된 집계 함수 중 두 개 이상을 포함할 수 있어요. 허용되지 않은 집계 함수를 사용하려 하면 쿼리가 실패해요.

집계 함수 내에서 전처리 함수를 사용하려면 다음 전처리 함수만 지원돼요.

따라서 예를 들어:

  • SELECT myfunc(C1), COUNT(C2) FROM t1 GROUP BY 1; 은 집계 정책의 최상위 레벨에서 모든 비집계 함수가 지원되므로 유효해요.
  • SELECT C1, COUNT(myfunc(C2)) FROM t1 GROUP BY 1; 은 집계 정책의 집계 함수 내에서 위에 나열된 함수만 지원되므로 유효하지 않아요.

그룹화 문 — 집계 제한 테이블에 대한 쿼리는 데이터를 최소 크기의 그룹으로 집계해야 해요. 명시적 그룹화 문(즉 GROUP BY 절) 또는 전체 데이터 세트를 집계하는 스칼라 집계 함수(예: COUNT(*) )를 사용할 수 있어요.

필터 — 일반적으로 Snowflake는 쿼리가 필터가 선택한 행을 집계하기만 하면 WHERE 및 ON 절을 사용해 집계 제한 테이블을 필터링하는 방법을 제한하지 않아요.

조인 — 쿼리는 다른 집계 제한 테이블을 포함한 다른 테이블과 집계 제한 테이블을 조인할 수 있어요.

Snowflake는 각 집계 그룹을 검사해 집계 제한 테이블에서 가져온 행 수가 해당 테이블의 최소 그룹 크기를 충족하거나 초과하는지 확인해요. 예를 들어 최소 그룹 크기가 5인 집계 제한 테이블 table_a 가 최소 그룹 크기가 3인 table_b 와 조인되면 쿼리가 반환하는 각 그룹은 table_a 에서 최소 5행의 행과 table_b 에서 3행으로 만들어져야 해요.

조인이 있는 쿼리가 집계 제한 테이블의 요구 사항을 충족하는지 여부는 그룹의 크기가 아니라 테이블에서 가져온 행 수에 의해 결정돼요. 결과적으로 조인된 데이터에서 만든 그룹의 크기는 집계 제한 테이블의 최소 그룹 크기보다 클 수 있지만 여전히 필터링된 데이터가 될 수 있어요. 예를 들어 다음과 같이 가정해요.

  • agg_t 는 최소 그룹 크기가 2인 집계 제한 테이블이에요. 이 테이블은 다음 내용을 가진 단일 정수 컬럼 c 를 포함해요: {1, 2, 2}.
  • open_t 는 제한이 없으며 다음 내용을 가진 정수 컬럼 c 를 포함해요: {1, 1, 1, 2}.

사용자가 두 테이블을 조인하는 다음 쿼리를 실행해요.

SELECT c, COUNT(*)
  FROM agg_t, open_t
  WHERE agg_t.c = open_t.c
  GROUP BY agg_t.c;

쿼리는 다음을 반환해요.

+-----------------+
| c | COUNT(*)    |
|------+----------|
| 2 | 2           |
|------+----------|
| null | 3        |
+-----------------+

두 번째 그룹에 최소 그룹 크기보다 많은 3개 레코드가 있음에도 모든 레코드가 집계 제한 테이블의 단일 레코드에 해당하므로 값은 필터링돼요.

UNION ALL — 쿼리는 쿼리되는 테이블 중 하나 이상이 집계 제한이더라도 UNION ALL 을 사용해 두 서브쿼리의 결과를 결합할 수 있어요. 조인과 유사하게 결과의 각 그룹은 쿼리되는 모든 집계 제한 테이블의 최소 그룹 크기를 충족해야 해요. 예를 들어 다음과 같이 가정해요.

  • 테이블 protected_table1 의 최소 그룹 크기는 2예요.
  • 테이블 protected_table2 의 최소 그룹 크기는 5예요.

다음 쿼리를 실행하면:

SELECT a, COUNT(*)
  FROM (
    SELECT a, b FROM protected_table1
    UNION ALL
    SELECT a, b FROM protected_table2
  )
  GROUP BY a;

키 a 로 형성된 각 그룹에는 protected_table1 에서 2개, protected_table2 에서 5개의 레코드가 있어야 하며, 그렇지 않으면 레코드는 나머지 그룹에 배치돼요.

외부 함수 — 쿼리는 쿼리의 다른 부분이 집계 제한 테이블의 요구 사항을 충족하도록 결과를 적절히 집계하지 않는 한 외부 함수(external function) 를 호출할 수 없어요.

로깅 및 메트릭 — 쿼리는 UDF 로깅이나 메트릭을 통해 집계 제한 테이블의 컬럼을 로그할 수 없어요.

데이터 타입 변환 — SELECT 문에 데이터 타입 변환 함수를 포함하는 쿼리는 함수의 TRY 버전을 사용해야 해요. 예를 들어 TRY_CAST 함수는 허용되지만 CAST 함수는 금지돼요. 숫자 타입에는 다음 데이터 타입 변환 함수가 허용돼요.

  • TRY_CAST
  • TRY_TO_DECFLOAT
  • TRY_TO_DECIMAL
  • TRY_TO_DOUBLE
  • TRY_TO_NUMBER
  • TRY_TO_NUMERIC

PIVOT — 쿼리는 집계 제한 테이블의 컬럼에 대해 PIVOT 연산자를 사용할 수 없어요.

확장 예제

집계 정책을 만들고 테이블에 할당하는 것은 마스킹 및 프로젝션 정책 같은 다른 정책을 만들고 할당하는 것과 같은 일반적인 절차를 따르는 걸.

  • 중앙 집중식 관리 접근 방식을 사용한다면 정책을 관리할 사용자 지정 역할(예: agg_policy_admin)을 만들어요. 또는 기존 역할을 사용할 수 있어요.
  • 이 역할에 집계 정책을 만들고 할당할 권한을 부여해요.
  • 집계 정책을 만들어요.
  • 집계 정책을 테이블에 할당해요.

집계 정책이 테이블에 할당되면 테이블에 대한 성공적인 쿼리는 데이터를 집계해야 해요.

다음 확장 예제는 프로바이더의 접근 제어 관리자가 사용자 지정 역할을 만드는 것부터 데이터 소비자가 집계된 결과를 반환하는 쿼리를 실행하는 것까지 이 과정의 각 단계에 대한 통찰을 제공해요.

접근 제어 관리자 작업 — 집계 정책을 관리할 사용자 지정 역할을 만들어요. 기존 역할을 재사용할 수도 있어요.

USE ROLE USERADMIN;

CREATE ROLE AGG_POLICY_ADMIN;
  • agg_policy_admin 사용자 지정 역할에 스키마에서 집계 정책을 만들고 Snowflake 계정의 테이블이나 뷰에 집계 정책을 할당할 권한을 부여해요. 이 단계는 집계 정책이 privacy.agg_policies 라는 데이터베이스와 스키마에 저장되며 이 데이터베이스와 스키마가 이미 존재한다고 가정해요.
GRANT USAGE ON DATABASE privacy TO ROLE agg_policy_admin;
GRANT USAGE ON SCHEMA privacy.agg_policies TO ROLE agg_policy_admin;

GRANT CREATE AGGREGATION POLICY
  ON SCHEMA privacy.agg_policies TO ROLE agg_policy_admin;

GRANT APPLY AGGREGATION POLICY ON ACCOUNT TO ROLE agg_policy_admin;

agg_policy_admin 역할을 이제 하나 이상의 사용자에게 할당할 수 있어요. 집계 정책 작업에 필요한 권한에 대한 자세한 내용은 (이 토픽의) 권한 및 명령 을 참고해요.

집계 정책 관리자 작업 — 최소 그룹 크기를 3으로 정의해 집계를 요구하는 집계 정책을 만들어요.

USE ROLE agg_policy_admin;
USE SCHEMA privacy.agg_policies;

CREATE AGGREGATION POLICY my_policy
  AS () RETURNS AGGREGATION_CONSTRAINT -> AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 3);
  • 테이블 t1 에 집계 정책을 할당해요.
ALTER TABLE t1 SET AGGREGATION POLICY my_policy;

소비자 쿼리 — 프로바이더가 집계 제한 테이블을 공유하면 데이터 소비자가 그에 대해 쿼리를 실행할 수 있어요. 이 예제에서는 집계 제한 테이블 t1 이 다음 행을 포함한다고 가정해요.

peak state elevation
washington NH 6288
cannon NH 4080
kearsarge NH 2937
mansfield VT 4395
killington VT 4229
wachusett MA 2006

이제 소비자가 t1 에 대해 다음 쿼리를 실행한다고 가정해요.

SELECT state, AVG(elevation) AS avg_elevation
  FROM t1
  GROUP BY state;

결과는 다음과 같아요.

+----------+-----------------+
| STATE    | AVG_ELEVATION   |
|----------+-----------------+
| NH       | 4435            |
| NULL     | 3543            |
+----------+-----------------+

두 번째 그룹의 state 값이 NULL 인 이유는 VT 와 MA 의 봉우리 고도를 평균화하는 나머지 그룹이기 때문이에요.

집계 정책과 Snowflake 기능

다음 하위 섹션은 집계 정책이 다양한 Snowflake 기능 및 서비스와 어떻게 상호작용하는지 간략히 요약해요.

기타 정책

이 섹션은 집계 정책이 마스킹 정책(masking policies) , 행 접근 정책(row access policies) , 프로젝션 정책(projection policies) 을 포함한 다른 정책과 어떻게 상호작용하는지 설명해요.

집계 제한 테이블에 다른 정책을 연결할 수 있어요. 테이블에 대한 성공적인 쿼리는 모든 정책의 요구 사항을 충족해야 해요.

집계 제한 테이블에 행 접근 정책이 할당되면 행 접근 정책에 따라 쿼리 결과에서 제외된 행은 집계된 결과를 계산할 때 포함되지 않아요.

마스킹 정책, 행 접근 정책 또는 프로젝션 정책의 body는 컬럼을 포함한 집계 제한 테이블을 참조할 수 없어요. 마찬가지로 다른 정책의 body는 집계 제한 테이블을 참조하는 UDF를 포함할 수 없어요.

뷰와 구체화된 뷰

뷰와 구체화된 뷰 모두에 집계 정책을 할당할 수 있어요. 뷰에 집계 정책을 적용해도 기본 테이블은 집계 제한이 되지 않아요. 이 기본 테이블은 제한 없이 쿼리할 수 있어요.

민감한 데이터가 노출될 가능성을 피하기 위해 모든 집계 제한 뷰는 그렇지 않더라도 보안 뷰(secure views) 인 것처럼 처리돼요.

집계 제한 테이블에서 뷰를 만들 수 있는지 여부는 뷰의 유형에 따라 달라져요.

  • 하나 이상의 집계 제한 테이블에서 일반 뷰를 만들 수 있지만, 해당 뷰에 대한 쿼리는 해당 기본 테이블의 제한을 충족하는 방식으로 데이터를 집계해야 해요.
  • 집계 제한 테이블이나 뷰를 기반으로 구체화된 뷰를 만들 수 없으며, 구체화된 뷰가 기반으로 하는 테이블이나 뷰에 집계 정책을 할당할 수도 없어요.

복제된 객체

다음 접근 방식은 복제된 데이터베이스나 스키마에 저장된 복제된 테이블이나 뷰에 대한 SELECT 권한을 가진 사용자로부터 데이터를 보호하는 데 도움이 돼요.

  • 개별 집계 정책 객체의 복제(cloning)는 지원되지 않아요.
  • 데이터베이스를 복제하면 데이터베이스 내의 모든 집계 정책이 복제돼요.
  • 스키마를 복제하면 스키마 내의 모든 집계 정책이 복제돼요.
  • 복제된 테이블은 소스 테이블과 동일한 집계 정책에 매핑돼요.
    • 테이블이 상위 스키마 복제의 맥락에서 복제될 때, 소스 테이블이 같은 상위 스키마의 집계 정책을 참조하면(즉 로컬 참조) 복제된 테이블은 복제된 집계 정책을 참조해요.
    • 소스 테이블이 다른 스키마의 집계 정책을 참조하면(즉 외부 참조) 복제된 테이블은 외부 참조를 유지해요.

자세한 내용은 CREATE … CLONE 을 참고해요.

복제

집계 정책과 그 할당은 데이터베이스 복제와 복제 그룹을 사용해 복제할 수 있어요.

데이터베이스 복제 의 경우 다음 조건 중 하나라도 참이면 복제 작업이 실패해요.

  • 기본 데이터베이스가 Enterprise(이상) 계정에 있고 정책을 포함하지만 복제가 승인된 계정 중 하나 이상이 하위 에디션인 경우.
  • 기본 데이터베이스에 포함된 테이블이나 뷰가 다른 데이터베이스의 집계 정책에 대한 댕글링 참조를 가진 경우.

데이터베이스 복제의 댕글링 참조 동작은 복제 그룹 에서 여러 데이터베이스를 복제할 때 피할 수 있어요.

권한 및 명령

다음 하위 섹션은 집계 정책을 관리하는 데 도움이 되는 정보를 제공해요.

집계 정책 권한

Snowflake는 집계 정책 객체에 대해 다음 권한을 지원해요.

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

권한 사용처
APPLY 테이블에서 집계 정책의 설정 및 해제 작업을 활성화해요.
OWNERSHIP 집계 정책의 소유권을 이전하며, 집계 정책에 대한 완전한 제어를 부여해요. 집계 정책의 대부분의 속성을 변경하는 데 필요해요.

자세한 내용은 (이 토픽의) DDL 명령, 작업 및 권한 요약 을 참고해요.

집계 정책 DDL 참조

Snowflake는 집계 정책을 만들고 관리하기 위해 다음 DDL을 지원해요.

  • CREATE AGGREGATION POLICY
  • ALTER AGGREGATION POLICY
  • DESCRIBE AGGREGATION POLICY
  • DROP AGGREGATION POLICY
  • SHOW AGGREGATION POLICIES

DDL 명령, 작업 및 권한 요약

다음 표는 집계 정책 권한과 DDL 작업 사이의 관계를 요약해요.

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

작업 필요한 권한
집계 정책 만들기. 같은 스키마에서 CREATE AGGREGATION POLICY 권한을 가진 역할.
집계 정책 변경. 집계 정책에 대한 OWNERSHIP 권한을 가진 역할.
집계 정책 설명 다음 중 하나: 계정 전체 APPLY AGGREGATION POLICY 권한을 가진 역할, 또는 집계 정책에 대한 OWNERSHIP 권한을 가진 역할, 또는 집계 정책에 대한 APPLY 권한을 가진 역할.
집계 정책 삭제. 집계 정책에 대한 OWNERSHIP 권한을 가진 역할.
집계 정책 표시. 다음 중 하나: 집계 정책이 존재하는 스키마에 대한 USAGE 권한을 가진 역할, 또는 계정에 대한 APPLY AGGREGATION POLICY 권한을 가진 역할.
테이블에 집계 정책 설정 또는 해제. 다음 중 하나: 계정에 대한 APPLY AGGREGATION POLICY 권한을 가진 역할, 또는 집계 정책에 대한 APPLY 권한과 테이블이나 뷰에 대한 OWNERSHIP 권한을 가진 역할.

Snowflake는 객체에 집계 정책을 만들고 설정하기 위해 서로 다른 권한을 지원해요.

  • aggregation_policy_admin 사용자 지정 역할이 모든 테이블에 집계 정책을 만들고 설정하는 중앙 집중식 집계 정책 관리 접근 방식의 경우 다음 권한이 필요해요.
    USE ROLE securityadmin;
    GRANT USAGE ON DATABASE mydb TO ROLE aggregation_policy_admin;
    GRANT USAGE ON SCHEMA mydb.schema TO ROLE aggregation_policy_admin;
    GRANT CREATE AGGREGATION POLICY ON SCHEMA mydb.schema TO ROLE aggregation_policy_admin;
    GRANT APPLY ON AGGREGATION POLICY ON ACCOUNT TO ROLE aggregation_policy_admin;
    
  • 하이브리드 관리 접근 방식에서 단일 역할은 집계 정책이 일관되게 이름 지어지는지 확인하기 위해 CREATE AGGREGATION POLICY 권한을 가지며, 개별 팀이나 역할은 특정 집계 정책에 대한 APPLY 권한을 가져요. 예를 들어 사용자 지정 역할 finance_role 에 역할이 소유한(즉 역할이 테이블이나 뷰에 대한 OWNERSHIP 권한을 가진) 테이블과 뷰에 집계 정책 cost_center 를 설정할 권한을 부여할 수 있어요.
    USE ROLE securityadmin;
    GRANT CREATE AGGREGATION POLICY ON SCHEMA mydb.schema TO ROLE aggregation_policy_admin;
    GRANT APPLY ON AGGREGATION POLICY cost_center TO ROLE finance_role;
    

더 알아보기 (Learn more)