CREATE ROW ACCESS POLICY¶
현재/지정된 스키마에 새 행 액세스 정책을 만들거나 기존 행 액세스 정책을 대체합니다.
행 액세스 정책을 생성한 후 ALTER TABLE 명령을 사용하여 테이블에 정책을 추가하거나 ALTER VIEW 명령을 사용하여 뷰를 추가합니다.
- 참고 항목:
구문¶
Snowflake는 행 액세스 정책을 만드는 다음 구문을 지원합니다.
CREATE [ OR REPLACE ] ROW ACCESS POLICY [ IF NOT EXISTS ] <name> AS
( <arg_name> <arg_type> [ , ... ] ) RETURNS BOOLEAN -> <body>
[ COMMENT = '<string_literal>' ]
필수 매개 변수¶
name
행 액세스 정책의 식별자로, 스키마에 고유해야 합니다.
식별자 값은 알파벳 문자로 시작해야 하며 전체 식별자 문자열을 큰따옴표(예: “My object”)로 묶지 않는 한 공백이나 특수 문자를 포함할 수 없습니다. 큰따옴표로 묶인 식별자도 대/소문자를 구분합니다.
자세한 내용은 식별자 요구 사항 섹션을 참조하십시오.
AS ( <arg_name> <arg_type> [ , ... ] )
행 액세스 정책을 위한 서명입니다.
서명은 행에 액세스할 수 있는지 여부를 결정하기 위해 고려해야 하는 속성의 세트를 지정합니다. 속성 값은 행 액세스 정책으로 보호되는 데이터베이스 오브젝트(예: 테이블 또는 뷰)에서 가져옵니다.
RETURNS BOOLEAN
행 액세스 정책은 true 또는 false로 평가해야 합니다. 행 액세스 정책으로 보호되는 테이블을 쿼리하는 사용자에게는
body
가 작성되는 방식에 따라 출력에서 행이 표시됩니다.body
행 액세스 정책으로 보호되는 테이블의 쿼리에 대해 반환할 행을 결정하기 위해 서명의 인자 값에 대해 작동하는 SQL 식입니다.
body
는 부울 값으로 된 임의의 SQL 식일 수 있습니다. Snowflake는 사용자 정의 함수 개요, 외부 함수 쓰기, 하위 쿼리를 사용하는 식을 호출하는 식을 지원합니다.
선택적 매개 변수¶
COMMENT = 'string_literal'
행 액세스 정책에 대한 설명을 지정합니다.
기본값: 값 없음
액세스 제어 요구 사항¶
이 작업을 실행하는 데 사용되는 역할 에는 최소한 다음 권한 이 있어야 합니다.
권한 |
오브젝트 |
참고 |
---|---|---|
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 문을 실행하고 새 행 액세스 정책을 만드십시오.
정책
body
에 매핑 테이블 조회가 포함된 경우 중앙 집중식 매핑 테이블을 생성하고 보호된 테이블과 동일한 데이터베이스에 매핑 테이블을 저장합니다. 이는body
가 IS_DATABASE_ROLE_IN_SESSION 함수를 호출하는 경우 특히 중요합니다. 자세한 내용은 함수 사용법 노트를 참조하십시오.데이터 공유 공급자는 독자 계정 에서 행 액세스 정책을 만들 수 없습니다.
마스킹 또는 행 액세스 정책의 본문에서 CURRENT_DATABASE 또는 CURRENT_SCHEMA 함수를 지정하면 이 함수는 세션에 사용 중인 데이터베이스 또는 스키마가 아니라 보호된 테이블이 포함된 데이터베이스 또는 스키마를 반환합니다.
메타데이터 관련:
주의
고객은 Snowflake 서비스를 사용할 때 개인 데이터(사용자 오브젝트 제외), 민감한 데이터, 수출 통제 대상 데이터 또는 기타 규제 데이터가 메타데이터로 입력되지 않도록 해야 합니다. 자세한 내용은 Snowflake의 메타데이터 필드 섹션을 참조하십시오.
OR REPLACE
및IF NOT EXISTS
절은 상호 배타적입니다. 두 문자를 같은 문에 함께 사용할 수 없습니다.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 ;
다음 두 조건 중 어느 하나가 참인 경우 사용자는 다음 행 액세스 정책을 사용해 쿼리 결과에서 행을 볼 수 있습니다.
현재 역할은
sales_executive_role
사용자 지정 역할입니다. CURRENT_ROLE 함수를 호출하여 현재 역할을 확인합니다.현재 역할은
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 ) ;여기서:
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;여기서:
rap_test2
행 액세스 정책의 이름입니다.
(n number, v varchar)
행 액세스 정책을 위한 서명입니다.
서명은 행에 액세스할 수 있는지 여부를 결정하기 위해 고려해야 하는 속성의 세트를 지정합니다. 속성 값은 행 액세스 정책으로 보호되는 테이블에서 가져옵니다.
returns boolean -> true
행 액세스 정책의 적용을 결정합니다.
반환된 값에 따라 행 액세스 정책이 추가된 데이터베이스 오브젝트에서 주어진 행에 대한 액세스 권한이 사용자에게 있는지 여부가 결정됩니다.
추가적인 예를 보려면 행 액세스 정책 사용하기 섹션을 참조하십시오.