POLICY_CONTEXT

POLICY_CONTEXT

POLICY_CONTEXT 함수는 하나 이상의 컨텍스트 함수(context function) 또는 SYS_CONTEXT 네임스페이스 속성의 값을 기준으로 쿼리 결과를 시뮬레이션하여, 정책이 쿼리 결과에 어떤 영향을 미치는지 파악할 수 있게 해줘요. 컨텍스트 함수와 SYS_CONTEXT 속성은 쿼리의 현재 컨텍스트에 따라 값을 반환해요. 예를 들어 쿼리를 실행하는 사용자가 누구인지, 어떤 역할이 활성화되어 있는지, 에이전트가 쿼리를 호출하는지 여부 같은 값들이에요. 정책 본문은 종종 이러한 값들을 사용해 정책이 반환할 값을 결정해요.

이 함수는 쿼리 결과를 결정하기 위해 다음 정책들을 평가해요:

  • 마스킹 정책 (Masking policies)
  • 행 액세스 정책 (Row access policies)
  • 집계 정책 (Aggregation policies)
  • 조인 정책 (Join policies)
  • 프로젝션 정책 (Projection policies)

출처: 문서

본문

문법 (Syntax)

EXECUTE USING
POLICY_CONTEXT(
  <arg> => '<string_literal>'
  [ , <arg> => '<string_literal>' , ... ]
  [ , <arg> => ( '<string_literal>' [ , '<string_literal>' , ... ] ) ]
)
AS
SELECT <query>

인자 (Arguments)

컨텍스트 함수 인자, SYS_CONTEXT 속성 인자, 또는 둘 다 지정할 수 있어요. 인자는 최소 하나 이상 지정해야 해요.

다음 표는 지원되는 모든 인자를 요약해요:

인자 (Argument) 유형 (Type) 설명 (Description)
CURRENT_USER 컨텍스트 함수 쿼리를 실행하는 현재 사용자
CURRENT_ROLE 컨텍스트 함수 사용 중인 현재 역할
CURRENT_AVAILABLE_ROLES 컨텍스트 함수 현재 사용자가 사용할 수 있는 역할
CURRENT_ACCOUNT 컨텍스트 함수 현재 계정
SNOWFLAKE$SESSION_ROLE SYS_CONTEXT 속성 세션의 주 역할
SNOWFLAKE$SESSION_PRINCIPAL_NAME SYS_CONTEXT 속성 세션을 시작한 주체(principal)의 이름
SNOWFLAKE$SESSION_PRINCIPAL_TYPE SYS_CONTEXT 속성 세션을 시작한 주체의 유형
SNOWFLAKE$SESSION_DATABASE SYS_CONTEXT 속성 세션에서 사용 중인 현재 데이터베이스
SNOWFLAKE$SESSION_SCHEMA SYS_CONTEXT 속성 세션에서 사용 중인 현재 스키마
SNOWFLAKE$SESSION_WAREHOUSE SYS_CONTEXT 속성 세션에서 사용 중인 현재 웨어하우스
SNOWFLAKE$SESSION_ACTIVATED_ROLES SYS_CONTEXT 목록 세션에서 활성화된 계정 역할 집합
SNOWFLAKE$SESSION_ACTIVATED_DATABASE_ROLES SYS_CONTEXT 목록 세션에서 활성화된 데이터베이스 역할 집합
SNOWFLAKE$CURRENT_ACTIVATED_ROLES SYS_CONTEXT 목록 현재 실행 컨텍스트에서 활성화된 계정 역할 집합
SNOWFLAKE$CURRENT_ACTIVATED_DATABASE_ROLES SYS_CONTEXT 목록 현재 실행 컨텍스트에서 활성화된 데이터베이스 역할 집합

컨텍스트 함수 인자 (Context function arguments)

context_function => 'string_literal'

컨텍스트 함수와 그 값을 문자열로 지정해요. Snowflake는 인자로 다음 컨텍스트 함수와 그 값을 지원해요: CURRENT_USER, CURRENT_ROLE, CURRENT_AVAILABLE_ROLES, CURRENT_ACCOUNT. 문자열 값으로 사용할 형식을 확인하려면 해당 함수를 사용해 쿼리를 실행하세요. 예를 들어: SELECT CURRENT_USER(); 출력: 값은 'JSMITH'여야 해요. CURRENT_AVAILABLE_ROLES를 지정하고 ROLE1, ROLE2와 같은 여러 역할 값을 지정한다면 역할 목록을 다음과 같이 대괄호로 감싸세요: ['ROLE1', 'ROLE2'].

SYS_CONTEXT 속성 인자 (SYS_CONTEXT property arguments)

sys_context_key => 'string_literal'

SYS_CONTEXT 네임스페이스 속성과 그 시뮬레이션 값을 문자열로 지정해요. 인자 이름은 네임스페이스와 속성을 밑줄로 구분해 결합해요. 예를 들어 SNOWFLAKE$SESSION_ROLE은 SNOWFLAKE$SESSION 네임스페이스의 ROLE 속성에 해당해요.

Snowflake는 다음 SYS_CONTEXT 속성 인자를 지원해요:

인자 (Argument) 설명 (Description)
SNOWFLAKE$SESSION_ROLE SNOWFLAKE$SESSION 네임스페이스의 ROLE 속성 값을 시뮬레이션해요.
SNOWFLAKE$SESSION_PRINCIPAL_NAME SNOWFLAKE$SESSION 네임스페이스의 PRINCIPAL_NAME 속성 값을 시뮬레이션해요.
SNOWFLAKE$SESSION_PRINCIPAL_TYPE SNOWFLAKE$SESSION 네임스페이스의 PRINCIPAL_TYPE 속성 값을 시뮬레이션해요.
SNOWFLAKE$SESSION_DATABASE SNOWFLAKE$SESSION 네임스페이스의 DATABASE 속성 값을 시뮬레이션해요.
SNOWFLAKE$SESSION_SCHEMA SNOWFLAKE$SESSION 네임스페이스의 SCHEMA 속성 값을 시뮬레이션해요.
SNOWFLAKE$SESSION_WAREHOUSE SNOWFLAKE$SESSION 네임스페이스의 WAREHOUSE 속성 값을 시뮬레이션해요.

SYS_CONTEXT 목록 인자 (SYS_CONTEXT list arguments)

sys_context_key => ( 'string_literal' [ , 'string_literal' , ... ] )

SYS_CONTEXT 네임스페이스 속성과 시뮬레이션 값 목록을 지정해요. 값을 괄호로 감싸 튜플(tuple)을 만들어요. 괄호 없이 단일 값을 지정할 수도 있어요.

Snowflake는 다음 SYS_CONTEXT 목록 인자를 지원해요:

인자 (Argument) 설명 (Description)
SNOWFLAKE$SESSION_ACTIVATED_ROLES SNOWFLAKE$SESSION 네임스페이스에서 활성화된 계정 역할 집합을 시뮬레이션해요.
SNOWFLAKE$SESSION_ACTIVATED_DATABASE_ROLES SNOWFLAKE$SESSION 네임스페이스에서 활성화된 데이터베이스 역할 집합을 시뮬레이션해요.
SNOWFLAKE$CURRENT_ACTIVATED_ROLES SNOWFLAKE$CURRENT 네임스페이스(현재 실행 컨텍스트)에서 활성화된 계정 역할 집합을 시뮬레이션해요.
SNOWFLAKE$CURRENT_ACTIVATED_DATABASE_ROLES SNOWFLAKE$CURRENT 네임스페이스(현재 실행 컨텍스트)에서 활성화된 데이터베이스 역할 집합을 시뮬레이션해요.

query

하나 이상의 테이블 또는 뷰를 조회할 SQL 표현식을 지정해요. 필수.

사용 메모 (Usage notes)

  • 이 함수는 다음을 요구해요: 지원되는 컨텍스트 함수 또는 SYS_CONTEXT 속성과 그 값을 지정하는 인자 최소 하나. 테이블이 정책으로 보호되어 있다면 지정된 사용자나 역할에 다음 특권이 부여되어야 해요: 테이블 또는 뷰에 대한 OWNERSHIP, 그리고 정책에 대한 APPLY 특권 (계정 수준 또는 정책 자체에): APPLY MASKING POLICY on ACCOUNT 또는 APPLY on MASKING POLICY policy_name, APPLY ROW ACCESS POLICY on ACCOUNT 또는 APPLY on ROW ACCESS POLICY policy_name, APPLY AGGREGATION POLICY on ACCOUNT 또는 APPLY on AGGREGATION POLICY policy_name, APPLY JOIN POLICY on ACCOUNT 또는 APPLY on JOIN POLICY policy_name, APPLY PROJECTION POLICY on ACCOUNT 또는 APPLY on PROJECTION POLICY policy_name.
  • 다음 조건 중 하나라도 해당하면 Snowflake는 오류 메시지를 반환해요: 지원되지 않는 인자를 하나 이상 사용할 때. Snowflake는 인자 섹션에 나열된 인자만 지원해요. 값을 제대로 지정하지 않을 때. 여기에는 존재하지 않는 값(예: 계정, 사용자, 역할이 없는 경우)에 문자열을 사용하는 경우가 포함돼요. SELECT 쿼리 표현식이 테이블 또는 뷰를 제대로 조회하지 않을 때(예: 테이블이나 뷰를 전혀 지정하지 않은 경우). 특정 데이터 공유 사용 사례(다음 글머리 기호 참조).
  • 데이터 공유: 데이터 공유 소비자(consumer)는 이 함수를 사용해 데이터 공유 제공자(provider)가 제공한 테이블이나 뷰에 대한 쿼리 결과를 시뮬레이션할 수 없어요. 또한 소비자 쿼리 표현식에 보안 데이터 공유(Secure Data Sharing)를 통해 제공된 테이블이나 뷰와, 데이터 공유 제공자 계정과 연관되지 않은 소비자 계정의 다른 테이블이나 뷰(즉 자체 테이블이나 뷰)가 모두 포함되면 Snowflake는 오류 메시지를 반환해요. 데이터 공유 제공자 계정은 공유를 통해 제공된 테이블이나 뷰를 데이터 공유 소비자 계정이 어떻게 보는지 시뮬레이션할 수 있어요. 이렇게 하려면 데이터 공유 제공자가 인자로 소비자 계정 이름을 지정해요. 예를 들어: execute using policy_context(current_account => '<consumer_account_name>') ... ;
  • 결과는 다음에 따라 달라져요: 열에 설정된 마스킹 정책 또는 프로젝션 정책(있는 경우), 테이블이나 뷰에 설정된 행 액세스 정책, 집계 정책 또는 조인 정책(있는 경우), 정책 정의, 쿼리 표현식, 역할에 부여된 특권, 사용자에게 부여된 역할(역할 계층 포함), 이 함수의 인자들.

    중요: 이 함수의 결과가 예상과 다르다면: 내부 정책 관리자에게 문의해 어떤 테이블, 뷰, 열이 정책으로 보호되는지, 그리고 그 정책들의 본문 정의를 더 잘 파악하세요. 이 관리자는 POLICY_ADMIN, MASKING_ADMIN, RAP_ADMIN 같은 맞춤 역할을 가질 수 있어요. 다음을 다시 확인하세요: 함수 문자열 값, SELECT 쿼리 표현식, 역할에 부여된 특권(예: 테이블이나 뷰에 대한 SELECT, 부모 데이터베이스와 스키마에 대한 USAGE 또는 기타 특권)과 그에 따른 특권 상속, 특히 CURRENT_AVAILABLE_ROLES 함수와 그 값을 이 함수의 인자로 지정하는 경우 역할 계층. 필요에 따라 이 함수를 사용하는 SQL 문을 업데이트하고 다시 시도하세요.

  • SYS_CONTEXT 목록 인자는 단일 문자열 값 또는 괄호로 묶인 문자열 값 튜플을 받아요. 예를 들어 다음 둘 다 유효해요: -- 단일 값 (괄호 불필요): SNOWFLAKE$SESSION_ACTIVATED_ROLES => 'ANALYST' 그리고 -- 다중 값 (괄호로 묶인 튜플): SNOWFLAKE$SESSION_ACTIVATED_ROLES => ('ANALYST', 'PUBLIC').
  • 같은 POLICY_CONTEXT 호출에서 컨텍스트 함수 인자와 SYS_CONTEXT 인자를 결합할 수 있어요.
  • 이러한 인자 중 일부가 시뮬레이션하는 SNOWFLAKE$CURRENT 네임스페이스 속성에 대한 자세한 내용은 SYS_CONTEXT (SNOWFLAKE$CURRENT 네임스페이스)를 참조하세요.

예제 (Examples)

PUBLIC 시스템 역할이 empl_info 테이블을 조회하는 효과를 시뮬레이션해요:

EXECUTE USING POLICY_CONTEXT(CURRENT_ROLE => 'PUBLIC')
  AS SELECT * FROM empl_info;

세션에서 특정 활성화된 역할 집합을 시뮬레이션해요:

EXECUTE USING POLICY_CONTEXT(
  SNOWFLAKE$SESSION_ACTIVATED_ROLES => ('ANALYST', 'PUBLIC')
)
  AS SELECT * FROM empl_info;

컨텍스트 함수 인자와 SYS_CONTEXT 인자를 결합해요:

EXECUTE USING POLICY_CONTEXT(
  CURRENT_ROLE => 'ANALYST',
  SNOWFLAKE$SESSION_ACTIVATED_ROLES => ('ANALYST', 'PUBLIC'),
  SNOWFLAKE$CURRENT_ACTIVATED_ROLES => ('ANALYST')
)
  AS SELECT * FROM empl_info;

더 알아보기 (Learn more)