CREATE ROW ACCESS POLICY

CREATE ROW ACCESS POLICY

현재/지정한 스키마에 새 행 접근 정책(row access policy)을 만들거나 기존 행 접근 정책을 교체하는 명령이에요. 행 접근 정책은 테이블이나 뷰에 적용해 행 수준에서 데이터 접근을 제어해요.

출처: 문서

본문

현재/지정한 스키마에 새 행 접근 정책을 만들거나 기존 행 접근 정책을 교체해요.

행 접근 정책을 만든 뒤에는 ALTER TABLE 명령으로 테이블에, 또는 ALTER VIEW 명령으로 뷰에 정책을 추가해요.

이 명령은 다음 변형(variant)을 지원해요.

  • CREATE OR ALTER ROW ACCESS POLICY: 행 접근 정책이 없으면 만들고, 있으면 기존 행 접근 정책을 수정해요.

함께 보기: 행 접근 정책 DDL

구문 (Syntax)

Snowflake는 행 접근 정책을 만들기 위해 다음 구문을 지원해요.

CREATE [ OR REPLACE ] ROW ACCESS POLICY [ IF NOT EXISTS ] <name> AS
( <arg_name> <arg_type> [ , ... ] ) RETURNS BOOLEAN -> <body>
[ COMMENT = '<string_literal>' ]

변형 구문 (Variant syntax)

CREATE OR ALTER ROW ACCESS POLICY

존재하지 않으면 새 행 접근 정책을 만들고, 존재하면 기존 행 접근 정책을 문에 정의된 행 접근 정책으로 변환해요. CREATE OR ALTER ROW ACCESS POLICY 문은 CREATE ROW ACCESS POLICY 문의 구문 규칙을 따르고, ALTER ROW ACCESS POLICY 문과 동일한 제약을 가져요.

행 접근 정책을 수정할 때 다음 변경이 지원돼요.

  • 정책 본문 표현식 교체
  • COMMENT 추가·업데이트·제거

자세한 내용은 CREATE OR ALTER <object>를 참고해요.

CREATE OR ALTER ROW ACCESS POLICY <name> AS
( <arg_name> <arg_type> [ , ... ] ) RETURNS BOOLEAN -> <body>
[ COMMENT = '<string_literal>' ]

필수 매개변수 (Required parameters)

name 행 접근 정책의 식별자로, 스키마 안에서 고유해야 해요.

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

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

{AS ( <arg_name> <arg_type> [ , ... ] )} 행 접근 정책의 시그니처예요.

시그니처는 행 접근 여부를 결정하기 위해 고려해야 하는 일련의 속성을 지정해요. 속성 값은 행 접근 정책으로 보호할 데이터베이스 객체(예: 테이블이나 뷰)에서 옵니다.

RETURNS BOOLEAN 행 접근 정책은 true 또는 false로 평가되어야 해요. 행 접근 정책으로 보호된 테이블을 쿼리하는 사용자는 body가 어떻게 작성되었는지에 따라 출력에 행을 보게 돼요.

body 시그니처의 인자 값에 대해 동작해 행 접근 정책으로 보호된 테이블에 대한 쿼리에서 반환할 행을 결정하는 SQL 표현식이에요.

body는 boolean 값을 반환하는 모든 SQL 표현식일 수 있어요. Snowflake는 사용자 정의 함수 개요(User-defined functions overview), 외부 함수 작성(Writing external functions)을 호출하는 표현식과 하위 쿼리(subquery)를 사용하는 표현식을 지원해요.

선택 매개변수 (Optional parameters)

COMMENT = 'string_literal' 행 접근 정책에 대한 설명(comment)을 지정해요.

  • 기본값: 값 없음

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

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

권한 (Privilege) 객체 (Object) 비고
CREATE ROW ACCESS POLICY Schema
OWNERSHIP Row Access Policy 기존 행 접근 정책에 대해 CREATE OR ALTER ROW ACCESS POLICY 문을 실행하는 데 필요해요.

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

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

마스킹 정책 DDL과 권한에 대한 자세한 내용은 컬럼 수준 보안 관리(Managing Column-level Security)를 참고해요.

사용 메모 (Usage notes)

정책 본문에 하나 이상의 하위 쿼리를 포함하면 오류가 발생할 수 있어요. 가능하면 하위 쿼리 수, JOIN 작업 수를 제한하고 WHERE 절 조건을 단순화해요.

데이터베이스 객체에 행 접근 정책과 하나 이상의 마스킹 정책이 모두 있으면 행 접근 정책이 먼저 평가돼요.

쿼리 실행 중 행 접근 정책에 대한 자세한 내용은 행 접근 정책 이해(Understanding row access policies)를 참고해요.

테이블이나 뷰 컬럼은 마스킹 정책 시그니처나 행 접근 정책 시그니처 중 하나에만 지정할 수 있어요. 즉, 같은 컬럼을 마스킹 정책 시그니처와 행 접근 정책 시그니처에 동시에 지정할 수 없어요.

자세한 내용은 CREATE MASKING POLICY를 참고해요.

정책이 테이블이나 뷰에 연결된 경우 CREATE OR REPLACE ROW ACCESS POLICY로 정책 시그니처(즉 인자 이름이나 입출력 데이터 유형)를 변경할 수 없고, ALTER ROW ACCESS POLICY로도 변경할 수 없어요. 시그니처를 변경해야 한다면 정책에 DROP ROW ACCESS POLICY 문을 실행하고 새 행 접근 정책을 만들어요.

정책 body에 매핑 테이블 조회가 포함되어 있다면 중앙 집중식 매핑 테이블을 만들어 보호된 테이블과 같은 데이터베이스에 저장해요. 특히 body가 IS_DATABASE_ROLE_IN_SESSION 함수를 호출한다면 이는 특히 중요해요. 자세한 내용은 함수 사용 메모를 참고해요.

데이터 공유 공급자는 리더 계정(reader account)에 행 접근 정책을 만들 수 없어요.

마스킹 또는 행 접근 정책 본문에 CURRENT_DATABASE 또는 CURRENT_SCHEMA 함수를 지정하면, 이 함수는 보호된 테이블을 포함하는 데이터베이스 또는 스키마를 반환하며 세션에서 사용 중인 데이터베이스나 스키마를 반환하지 않아요.

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

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

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

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

CREATE OR ALTER ROW ACCESS POLICY

ALTER ROW ACCESS POLICY 명령의 모든 제약이 적용돼요.

기존 정책의 행 접근 정책 시그니처(인자 이름과 데이터 유형)는 변경할 수 없어요. 시그니처를 변경해야 한다면 기존 정책을 삭제하고 새로 만들어요.

행 접근 정책 이름 바꾸기는 지원되지 않아요.

태그 설정·해제는 지원되지 않아요.

예시 (Examples)

이 예시들은 CURRENT_ROLE 컨텍스트 함수를 사용해요. 정책 조건에 역할 활성화와 역할 계층이 필요하다면 IS_ROLE_IN_SESSION을 사용해요.

다음 행 접근 정책은 CURRENT_ROLE이 it_admin 사용자 지정 역할인 사용자가 쿼리 결과에서 직원 ID 번호(즉 empl_id)를 포함하는 행을 볼 수 있게 해요.

create or replace row access policy rap_it as (empl_id varchar) returns boolean ->
  case
      when 'it_admin' = current_role() then true
      else false
  end
;

다음 행 접근 정책은 다음 두 조건 중 하나가 참이면 사용자가 쿼리 결과의 행을 볼 수 있게 해요.

  • 현재 역할이 sales_executive_role 사용자 지정 역할인 경우. 현재 역할을 결정하려면 CURRENT_ROLE 함수를 호출해요.
  • 현재 역할이 sales_manager 사용자 지정 역할이고 쿼리가 salesmanagerregions 매핑 테이블에 대응하는 sales_region을 지정하는 경우.
use role securityadmin;

create or replace row access policy rap_sales_manager_regions_1 as (sales_region varchar) returns boolean ->
  'sales_executive_role' = current_role()
      or exists (
            select 1 from salesmanagerregions
              where sales_manager = current_role()
                and region = sales_region
          )
;

여기서:

rap_sales_manager_regions_1 행 접근 정책의 이름이에요.

as (sales_region varchar) 행 접근 정책의 시그니처예요. 시그니처는 행 접근 여부를 결정하기 위해 고려해야 하는 일련의 속성을 지정해요. 속성 값은 행 접근 정책으로 보호할 테이블에서 옵니다.

returns boolean -> 행 접근 정책의 적용을 지정해요. 행 접근 정책의 <expression>은 오른쪽 화살표(즉 ->) 바로 뒤에 온다는 점에 주의해요.

표현식은 boolean 값을 반환하는 모든 SQL 표현식일 수 있어요. Snowflake는 UDF, 외부 함수를 호출하는 표현식과 하위 쿼리를 사용하는 표현식을 지원해요.

'sales_executive_role' = current_role() sales_executive_role 사용자 지정 역할을 가진 사용자가 데이터를 볼 수 있게 하는 행 접근 정책 표현식의 첫 번째 조건이에요.

or exists (select 1 from salesmanagerregions where sales_manager = current_role() and region = sales_region) 하위 쿼리를 사용하는 행 접근 정책 표현식의 두 번째 조건이에요. 하위 쿼리는 데이터에 대한 실행 쿼리가 salesmanagerregions 매핑 테이블에 나열된 리전을 지정해야 하고 CURRENT_ROLE이 sales_manager 사용자 지정 역할이어야 해요.

다음 행 접근 정책은 정책 시그니처에 두 속성을 지정해요.

create or replace row access policy rap_test2 as (n number, v varchar)
  returns boolean -> true;

여기서:

rap_test2 행 접근 정책의 이름이에요.

(n number, v varchar) 행 접근 정책의 시그니처예요. 시그니처는 행 접근 여부를 결정하기 위해 고려해야 하는 일련의 속성을 지정해요. 속성 값은 행 접근 정책으로 보호할 테이블에서 옵니다.

returns boolean -> true 행 접근 정책의 적용을 결정해요. 반환 값은 행 접근 정책이 추가된 데이터베이스 객체에서 사용자가 특정 행에 접근할 수 있는지 여부를 결정해요.

추가 예시는 행 접근 정책 사용(Use row access policies)을 참고해요.

CREATE OR ALTER ROW ACCESS POLICY

새 행 접근 정책을 만들거나 기존 정책의 본문을 교체해요.

CREATE OR ALTER ROW ACCESS POLICY rap_it AS (empl_id varchar) RETURNS BOOLEAN ->
  CASE
    WHEN 'it_admin' = current_role() THEN true
    ELSE false
  END
COMMENT = 'Restrict row access to IT admin role';

더 알아보기 (Learn more)

  • 행 접근 정책 DDL — 행 접근 정책 관련 DDL 문서
  • 행 접근 정책 이해 — 쿼리 실행 중 정책 동작
  • ALTER ROW ACCESS POLICY — 행 접근 정책 수정
  • DROP ROW ACCESS POLICY — 행 접근 정책 삭제