CREATE ROW ACCESS POLICY

현재/지정된 스키마에 새 행 액세스 정책을 만들거나 기존 행 액세스 정책을 대체합니다.

행 액세스 정책을 생성한 후 ALTER TABLE 명령을 사용하여 테이블에 정책을 추가하거나 ALTER VIEW 명령을 사용하여 뷰를 추가합니다.

참고 항목:

행 액세스 정책 DDL

구문

Snowflake는 행 액세스 정책을 만드는 다음 구문을 지원합니다.

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

필수 매개 변수

name

행 액세스 정책의 식별자로, 스키마에 고유해야 합니다.

식별자 값은 알파벳 문자로 시작해야 하며 전체 식별자 문자열을 큰따옴표(예: 《My object》)로 묶지 않는 한 공백이나 특수 문자를 포함할 수 없습니다. 큰따옴표로 묶인 식별자도 대/소문자를 구분합니다.

자세한 내용은 식별자 요구 사항 섹션을 참조하십시오.

AS ( <arg_name> <arg_type> [ , ] )

행 액세스 정책을 위한 서명입니다.

서명은 행에 액세스할 수 있는지 여부를 결정하기 위해 고려해야 하는 속성의 세트를 지정합니다. 속성 값은 행 액세스 정책으로 보호되는 데이터베이스 오브젝트(예: 테이블 또는 뷰)에서 가져옵니다.

RETURNS BOOLEAN

행 액세스 정책은 true 또는 false로 평가해야 합니다. 행 액세스 정책으로 보호되는 테이블을 쿼리하는 사용자에게는 body 가 작성되는 방식에 따라 출력에서 행이 표시됩니다.

body

행 액세스 정책으로 보호되는 테이블의 쿼리에 대해 반환할 행을 결정하기 위해 서명의 인자 값에 대해 작동하는 SQL 식입니다.

body 는 부울 값으로 된 임의의 SQL 식일 수 있습니다. Snowflake는 컨텍스트 함수, 사용자 정의 함수 개요, 외부 함수 쓰기 그리고 하위 쿼리를 사용하는 식을 호출하는 식을 지원합니다.

정책 body 에서 컨텍스트 함수의 경우:

정책이 CURRENT_DATABASE 또는 CURRENT_SCHEMA 함수를 호출할 경우 함수는 USE <오브젝트> 명령으로 지정하거나 Snowsight 의 컨텍스트 선택기로 선택하는 세션에 대한 데이터베이스나 스키마가 아니라 보호된 테이블이나 뷰가 포함된 데이터베이스나 스키마로 평가합니다.

선택적 매개 변수

COMMENT = 'string_literal'

행 액세스 정책에 대한 설명을 지정합니다.

기본값: 값 없음

액세스 제어 요구 사항

이 SQL 명령을 실행하는 데 사용되는 역할 에는 최소한 다음 권한 이 있어야 합니다.

권한

오브젝트

참고

CREATE ROW ACCESS POLICY

스키마

스키마의 모든 오브젝트에 대해 작업하려면 상위 데이터베이스 및 스키마에 대한 USAGE 권한도 필요합니다.

지정된 권한 세트로 사용자 지정 역할을 만드는 방법에 대한 지침은 사용자 지정 역할 만들기 섹션을 참조하십시오.

보안 오브젝트 에 대해 SQL 작업을 수행하기 위한 역할과 권한 부여에 대한 일반적인 정보는 액세스 제어의 개요 섹션을 참조하십시오.

마스킹 정책 DDL 및 권한에 대한 추가적인 세부 사항은 Column-level Security 관리하기 섹션을 참조하십시오.

사용법 노트

  • 정책 본문에 하나 이상의 하위 쿼리 를 포함하면 오류가 발생할 수 있습니다. 가능하면 하위 쿼리 수를 제한하고 JOIN 작업 수를 제한하며 WHERE 절 조건을 단순화하십시오.

  • 데이터베이스 오브젝트에 행 액세스 정책과 하나 이상의 마스킹 정책 이 모두 있는 경우 행 액세스 정책이 먼저 평가됩니다.

    쿼리 런타임 중 행 액세스 정책에 대한 자세한 내용은 행 액세스 정책 이해하기 를 참조하십시오.

  • 마스킹 정책 서명 또는 행 액세스 정책 서명에서 주어진 테이블 또는 뷰 열을 지정할 수 있습니다. 다시 말해, 마스킹 정책 서명과 행 액세스 정책 서명에 모두 동시에 같은 열을 지정할 수 없습니다.

    자세한 내용은 CREATE MASKING POLICY 섹션을 참조하십시오.

  • 정책이 테이블이나 뷰에 연결된 경우 CREATE OR REPLACE ROW ACCESS POLICY를 사용하거나 ALTER ROW ACCESS POLICY 를 사용하여 정책 서명(즉, 인자 이름 또는 입력/출력 데이터 타입)을 변경할 수 없습니다. 서명을 변경해야 하는 경우 정책에 대한 DROP ROW ACCESS POLICY 문을 실행하고 새 행 액세스 정책을 만드십시오.

  • 데이터 공유 공급자는 독자 계정 에서 행 액세스 정책을 만들 수 없습니다.

  • 메타데이터 관련:

    주의

    고객은 Snowflake 서비스를 사용할 때 개인 데이터(사용자 오브젝트 제외), 민감한 데이터, 수출 통제 대상 데이터 또는 기타 규제 데이터가 메타데이터로 입력되지 않도록 해야 합니다. 자세한 내용은 Snowflake의 메타데이터 필드 섹션을 참조하십시오.

  • CREATE OR REPLACE <오브젝트> 문은 원자성입니다. 즉, 오브젝트가 바뀔 때 단일 트랜잭션으로 이전 오브젝트가 삭제되고 새 오브젝트가 생성됩니다.

이들 예제에서는 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
;
Copy

다음 두 조건 중 어느 하나가 참인 경우 사용자는 다음 행 액세스 정책을 사용해 쿼리 결과에서 행을 볼 수 있습니다.

  1. 현재 역할은 sales_executive_role 사용자 지정 역할입니다. CURRENT_ROLE 함수를 호출하여 현재 역할을 확인합니다.

  2. 현재 역할은 sales_manager 사용자 지정 역할이고 이 쿼리는 salesmanageregions 매핑 테이블에 해당하는 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
          )
;
Copy

여기서:

rap_sales_manager_regions_1

행 액세스 정책의 이름입니다.

as (sales_region varchar)

행 액세스 정책을 위한 서명입니다.

서명은 행에 액세스할 수 있는지 여부를 결정하기 위해 고려해야 하는 속성의 세트를 지정합니다. 속성 값은 행 액세스 정책으로 보호되는 테이블에서 가져옵니다.

returns boolean ->

행 액세스 정책의 적용을 지정합니다.

행 액세스 정책의 <expression> 은 오른쪽 화살표 바로 다음에 나옵니다(즉, ->).

이 식은 부울 값으로 된 임의의 SQL 식일 수 있습니다. Snowflake는 UDFs, 외부 함수, 하위 쿼리를 사용하는 식을 호출하는 식을 지원합니다.

'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;
Copy

여기서:

rap_test2

행 액세스 정책의 이름입니다.

(n number, v varchar)

행 액세스 정책을 위한 서명입니다.

서명은 행에 액세스할 수 있는지 여부를 결정하기 위해 고려해야 하는 속성의 세트를 지정합니다. 속성 값은 행 액세스 정책으로 보호되는 테이블에서 가져옵니다.

returns boolean -> true

행 액세스 정책의 적용을 결정합니다.

반환된 값에 따라 행 액세스 정책이 추가된 데이터베이스 오브젝트에서 주어진 행에 대한 액세스 권한이 사용자에게 있는지 여부가 결정됩니다.

추가적인 예를 보려면 행 액세스 정책 사용하기 섹션을 참조하십시오.