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'
행 액세스 정책에 대한 설명을 지정합니다.
기본값: 값 없음
액세스 제어 요구 사항¶
이 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 문을 실행하고 새 행 액세스 정책을 만드십시오.
정책
body
에 매핑 테이블 조회가 포함된 경우 중앙 집중식 매핑 테이블을 생성하고 보호된 테이블과 동일한 데이터베이스에 매핑 테이블을 저장합니다. 이는body
가 IS_DATABASE_ROLE_IN_SESSION 함수를 호출하는 경우 특히 중요합니다. 자세한 내용은 함수 사용법 노트를 참조하십시오.데이터 공유 공급자는 독자 계정 에서 행 액세스 정책을 만들 수 없습니다.
메타데이터 관련:
주의
고객은 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 ;
다음 두 조건 중 어느 하나가 참인 경우 사용자는 다음 행 액세스 정책을 사용해 쿼리 결과에서 행을 볼 수 있습니다.
현재 역할은
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
행 액세스 정책의 적용을 결정합니다.
반환된 값에 따라 행 액세스 정책이 추가된 데이터베이스 오브젝트에서 주어진 행에 대한 액세스 권한이 사용자에게 있는지 여부가 결정됩니다.
추가적인 예를 보려면 행 액세스 정책 사용하기 섹션을 참조하십시오.