조인 정책¶
조인 정책은 테이블이 쿼리될 때 조인 요구 사항을 제어하는 스키마 수준의 오브젝트입니다. 조인 정책이 테이블에 적용되면 해당 테이블에 대한 쿼리에는 조인이 필요하거나 필요하지 않습니다. 조인이 요구 사항인 경우 특정 조인 열로 제한할 수 있습니다.
이러한 종류의 정책을 사용하여 공유 테이블에서 공통 정보를 찾는 수단으로 특정 테이블 및 뷰에 대한 쿼리에 조인을 적용할 수 있습니다. 조인 정책이 할당된 테이블 또는 뷰를 protected 또는 join-constrained 라고 합니다.
개요¶
Snowflake의 핵심 기능은 데이터 세트를 다른 엔터티와 공유하는 기능입니다. 조인 정책을 통해 데이터 공급자(데이터 소유자)는 데이터가 컨슈머와 공유된 후에도 데이터로 수행할 수 있는 작업에 대한 제어권을 행사할 수 있습니다. 구체적으로, 공급자는 테이블의 컨슈머에게 단일 테이블에서 레코드를 검색하는 대신 데이터를 다른 테이블에 조인하도록 요구할 수 있습니다. 이 요구 사항은 공통 데이터 세트를 보유한 준신뢰 파트너 간의 데이터 공유를 용이하게 합니다. 단일 테이블에서 데이터를 선택하는 것은 일반적으로 유용하지 않으며, 한 소유자의 테이블을 컨슈머 또는 파트너가 소유한 유사한 테이블과 조인할 때 의미 있는 데이터를 사용할 수 있습니다.
조인 정책이 테이블 또는 뷰에 적용된 후에는 반드시 쿼리를 수행해야 합니다.
테이블 또는 뷰를 다른 테이블 또는 뷰에 조인합니다.
지원되는 조인 유형 을 지정합니다.
허용되는 조인 열이 있는 조인 조건을 지정합니다.
조인에 조인하는 1개 이상의 테이블 또는 뷰가 보호되지 않은 상태여야 합니다. 이 제한은 공격자가 동일한 조직에서 공유되고 키 값이 일치하는 두 개의 보호된 테이블을 조인하여 조인 정책을 우회하는 것을 방지합니다.
조인 정책은 조인된 테이블에 대한 액세스를 제어하지만, 악의적인 공격자가 신중하게 구성된 쿼리를 사용하여 조인이 제한된 테이블에서 중요한 데이터를 얻지 못하도록 보장하지는 않습니다. 쿼리 시도가 충분하면 악의적인 공격자는 잠재적으로 조인 요구 사항을 우회할 수 있습니다. 조인 정책은 기존에 신뢰 관계가 있는 파트너 및 고객과 함께 사용하는 것이 가장 적합합니다. 또한 공급자는 데이터의 오용 가능성에 대해 경계해야 합니다(예: 목록에 대한 액세스 기록 검토).
조인 정책 만들기 및 구현하기¶
조인 정책을 만들고 구현하려면 다음을 수행합니다.
정책 자체를 만듭니다.
새 테이블이나 기존 테이블 또는 뷰에 정책을 적용합니다.
몇 가지 쿼리를 실행하여 정책의 예상 동작을 확인합니다.
이러한 단계는 다음 섹션에서 설명합니다.
기존 정책을 수정하고 예상 동작이 변경되는지 확인할 수도 있습니다.
언제든지 SHOW JOIN POLICIES 및 DESCRIBE JOIN POLICY 명령을 사용하여 계정의 조인 정책을 확인할 수 있습니다. 정책의 실제 정의를 보려면 JOIN_POLICIES 뷰를 쿼리하십시오. 정책에 연결된 테이블 및 뷰를 확인하려면 POLICY_REFERENCES Information Schema 테이블 함수를 쿼리하십시오.
사용자 지정 정책 관리자 역할 설정 등 정책 관리에 대한 자세한 내용은 조인 정책 관리하기 섹션을 참조하십시오.
조인 정책 만들기¶
가장 간단한 형태의 조인 정책은 사용자가 항상 테이블 또는 뷰를 다른 테이블 또는 뷰에 조인하도록 요구합니다. 즉, 조인 지정이 없는 단일 테이블에 대한 쿼리는 허용되지 않습니다. 예를 들어, jp1
이라는 정책을 만듭니다.
CREATE JOIN POLICY jp1
AS () RETURNS JOIN_CONSTRAINT -> JOIN_CONSTRAINT(JOIN_REQUIRED => TRUE);
이 명령의 전체 구문과 JOIN_CONSTRAINT 함수는 CREATE JOIN POLICY 섹션을 참조하십시오.
테이블 또는 뷰에 조인 정책 적용하기¶
조인 정책을 생성한 후에는 특정 테이블 또는 뷰에 할당하여 정책을 구현합니다.
테이블 또는 뷰가 이미 있는 경우 ALTER TABLE 또는 ALTER VIEW 명령을 사용합니다.
새 테이블이나 뷰를 생성하려면 CREATE TABLE 또는 CREATE VIEW 명령을 사용합니다.
두 경우 모두 JOIN POLICY 매개 변수를 지정하여 조인 정책 자체를 식별합니다. 예를 들어, 다음 명령은 jp
정책을 join_table
테이블에 할당합니다.
CREATE OR REPLACE TABLE join_table (
col1 INT,
col2 VARCHAR,
col3 NUMBER )
JOIN POLICY jp1;
선택적으로 특정 조인 열을 사용하도록 조인을 제한하려는 경우 ALLOWED JOIN KEYS 매개 변수를 지정할 수도 있습니다. 특정 열에 대한 조인 제한 섹션을 참조하십시오.
테이블 또는 뷰에는 한 번에 1개의 조인 정책만 할당할 수 있습니다. 조인 정책 바꾸기 섹션을 참조하십시오.
몇 가지 쿼리를 실행하여 조인 정책 테스트하기¶
다음 쿼리는 join_table
테이블에 대해 jp1
정책이 적용될 때 예상되는 동작을 보여줍니다. 이 테이블은 로딩할 필요가 없으며 빈 테이블만으로도 예상 동작을 보여줄 수 있습니다.
조인이 없는 쿼리는 예상 오류를 반환합니다.
SELECT * FROM join_table;
506037 (23001): SQL compilation error: Join Policy violation, please contact the policy admin for details
col1
에 대한 명시적 내부 조인이 포함된 쿼리는 결과를 반환합니다.
SELECT * FROM join_table jt1 INNER JOIN join_table_2 jt2 ON jt1.col1=jt2.col1;
+------+------+------+------+------+------+
| COL1 | COL2 | COL3 | COL1 | COL2 | COL3 |
|------+------+------+------+------+------|
+------+------+------+------+------+------+
col2
에 대한 명시적 내부 조인이 포함된 쿼리도 결과를 반환합니다.
SELECT * FROM join_table jt1 INNER JOIN join_table_2 jt2 ON jt1.col2=jt2.col2;
+------+------+------+------+------+------+
| COL1 | COL2 | COL3 | COL1 | COL2 | COL3 |
|------+------+------+------+------+------|
+------+------+------+------+------+------+
특정 열에 대한 조인 제한¶
조인 정책 동작을 추가로 테스트하려면 테이블에서 정책을 분리(설정 해제)하고 조인 정책을 삭제하고 다시 생성한 다음 ALLOWED JOIN KEYS 매개 변수가 포함된 DDL 을 사용하여 join_table
을 다시 만듭니다.
ALTER TABLE join_table UNSET JOIN POLICY;
DROP JOIN POLICY jp1;
CREATE JOIN POLICY jp1
AS () RETURNS JOIN_CONSTRAINT -> JOIN_CONSTRAINT(JOIN_REQUIRED => TRUE);
CREATE OR REPLACE TABLE join_table (
col1 INT,
col2 VARCHAR,
col3 NUMBER )
JOIN POLICY jp1 ALLOWED JOIN KEYS (col1);
이제 col2
를 조인 열로 사용하여 이전 쿼리 중 1개를 다시 시도합니다. col2
는 허용된 조인 키가 아니므로 쿼리가 실패합니다.
SELECT * FROM join_table jt1 INNER JOIN join_table_2 jt2 ON jt1.col2=jt2.col2;
506038 (23001): SQL compilation error: Join Policy violation, invalid join condition with reason: Disallowed join key used.
jt1.col1=jt2.col1
을 조인 조건으로 사용하여 동일한 쿼리를 수행하면 성공합니다. 이 두 테이블의 자연 조인은 col1
및 col2
를 통해 조인을 시도하기 때문에 실패합니다.
조인 정책 표시 및 설명하기¶
SHOW JOIN POLICIES 및 DESCRIBE JOIN POLICY 명령을 사용하여 계정의 기존 조인 정책에 대한 기본 정보를 확인할 수 있습니다. 조인 정책에 대한 자세한 내용은 조인 정책 모니터링 섹션을 참조하십시오.
SHOW JOIN POLICIES;
+-------------------------------+------+---------------+----------------+-------------+--------------+---------+-----------------+---------+
| created_on | name | database_name | schema_name | kind | owner | comment | owner_role_type | options |
|-------------------------------+------+---------------+----------------+-------------+--------------+---------+-----------------+---------|
| 2024-12-04 15:15:49.591 -0800 | JP1 | POLICY1_DB | POLICY1_SCHEMA | JOIN_POLICY | POLICY1_ROLE | | ROLE | |
+-------------------------------+------+---------------+----------------+-------------+--------------+---------+-----------------+---------+
DESCRIBE JOIN POLICY jp1;
+------+-----------+-----------------+----------------------------------------+
| name | signature | return_type | body |
|------+-----------+-----------------+----------------------------------------|
| JP1 | () | JOIN_CONSTRAINT | JOIN_CONSTRAINT(JOIN_REQUIRED => TRUE) |
+------+-----------+-----------------+----------------------------------------+
조건부 조인 정책 만들기 및 적용하기¶
정책 관리자는 조인 정책의 SQL 식을 정의하여 쿼리를 실행하는 사용자의 역할과 같은 요소에 따라 쿼리마다 다른 제한을 적용할 수 있습니다. 이 전략을 사용하면 한 사용자는 제한 없이 테이블을 쿼리할 수 있는 반면 다른 사용자는 조인을 사용하도록 요구할 수 있습니다.
예를 들어, 다음 조인 정책은 ACCOUNTADMIN
, FINANCE_ROLE
, HR_ROLE
역할이 있는 사용자에게 테이블에 대한 무제한 액세스 권한을 부여하는 반면 다른 모든 사용자에게는 조인을 지정하도록 요구합니다.
CREATE JOIN POLICY my_join_policy AS () RETURNS JOIN_CONSTRAINT -> CASE WHEN CURRENT_ROLE() = 'ACCOUNTADMIN' OR CURRENT_ROLE() = 'FINANCE_ROLE' OR CURRENT_ROLE() = 'HR_ROLE' THEN JOIN_CONSTRAINT(JOIN_REQUIRED => FALSE) ELSE JOIN_CONSTRAINT(JOIN_REQUIRED => TRUE) END;팁
조건부 정책에서 CURRENT_ROLE 같은 컨텍스트 함수를 사용할 때는 다음과 같은 전략을 사용할 수 있습니다.
컨텍스트 함수는 문자열을 반환하므로 이를 사용한 비교는 대/소문자를 구분합니다. 대/소문자를 구분하지 않고 비교하려면 LOWER 를 사용하여 문자열을 모두 소문자로 변환하면 됩니다.
POLICY_CONTEXT 함수는 컨텍스트 함수가 특정 값을 반환할 때 정책 본문이 올바른 값을 반환하고 있는지 평가하는 데 도움이 됩니다. POLICY_CONTEXT 함수는 하나 이상의 컨텍스트 함수의 지정된 값을 기반으로 쿼리 결과를 시뮬레이션합니다.
조인 쿼리 요구 사항¶
조인 제약 조건이 있는 테이블 또는 뷰에 대한 쿼리는 조인 정책이 적용되려면 다음 요구 사항을 준수해야 합니다.
- 지원되는 조인 유형
조인 제약 조건 테이블에는 다음과 같은 명시적 조인 유형이 지원됩니다.
INNER JOIN (선택 사항인 INNER 키워드 사용, JOIN 은 필수)
LEFT OUTER JOIN 및 RIGHT OUTER JOIN, 여기서 조인 제약이 있는 테이블은 “반대” 테이블입니다. 조인 제약 조건이 있는 테이블이 첫 번째 또는 “왼쪽” 테이블인 경우 외부 조인은 RIGHT OUTER JOIN 이어야 합니다. 조인 제약 조건이 있는 테이블이 두 번째 또는 “오른쪽” 테이블인 경우 외부 조인은 LEFT OUTER JOIN 이어야 합니다.
NATURAL JOIN (공통 이름을 가진 열에 대한 내부 조인)
내부 및 외부 조인은 ON 또는 USING 조인 조건을 사용하여 FROM 절 내에 명시적으로 지정해야 합니다. 이러한 조인은 WHERE 절에서 지정할 수 없습니다.
- 지원되지 않는 조인 유형
다음 조인 유형은 지원되지 않습니다.
FULL OUTER JOIN
ASOF JOIN
LATERAL 조인
WHERE 절의 암시적 조인
교차 조인(데카르트 곱)
- 여러 조인 제약 조건 테이블을 사용한 조인
조인 쿼리의 두 테이블(또는 모든 테이블)에 조인 정책이 할당된 경우 쿼리가 오류와 함께 실패합니다. 두 테이블의 조인에서는 1개만 조인 제약 조건이 적용될 수 있습니다.
UNION 및 UNION ALL 세트 작업은 조인 제약이 있는 테이블에 대한 쿼리에서 지원되지 않습니다.
INTERSECT 세트 작업은 의미 체계적으로 Inner 조인과 동일하므로 지원됩니다.
MINUS 및 EXCEPT 세트 작업은 조인 제약 조건 테이블이 연산자의 필터링된 쪽(즉, 두 번째 쿼리 블록에 있는 경우)에 있는 경우에만 지원됩니다.
- 데이터 타입 변환
SELECT 문에 데이터 타입 변환 함수가 포함된 쿼리는 함수의 TRY 버전을 사용해야 합니다. 예를 들어, TRY_CAST 함수는 허용되지만 CAST 함수는 금지됩니다. 숫자 타입에는 다음과 같은 데이터 타입 변환 함수가 허용됩니다.
조인 제약된 테이블에 대한 쿼리에 대한 예상 오류¶
다음 예제는 테이블 또는 뷰에 조인 정책이 적용되어 쿼리가 실패할 것으로 예상되는 몇 가지 경우를 보여 줍니다. 배경 정보는 조인 쿼리 요구 사항 섹션을 참조하십시오. 이러한 쿼리의 테이블에는 행이 포함되어 있지 않으므로 쿼리 결과는 빈 결과(성공) 또는 오류(실패)를 반환합니다.
조인이 없는 쿼리 실패¶
조인 정책이 join_table
에 할당되면 조인이 없는 단순 쿼리는 실패합니다. 다음 쿼리는 오류를 반환합니다.
SELECT col1, col2 FROM join_table;
WHERE 절 조인은 금지됩니다¶
join_table
(별칭 jt1
)이 조인 제약이 있는 테이블인 경우 다음 WHERE 절 join은 오류를 반환합니다.
SELECT *
FROM join_table jt1, join_table_2 jt2
WHERE jt1.col1=jt2.col1;
왼쪽 및 오른쪽 외부 조인은 테이블 순서에 따라 달라집니다¶
다음 예제에서는 외부 조인의 예상 동작을 보여 주며, join_table
(별칭 jt1
)은 조인 제약이 있는 테이블입니다. 첫 번째 쿼리는 오류를 반환합니다.
SELECT * FROM join_table jt1
LEFT OUTER JOIN join_table_2 jt2 ON jt1.col1=jt2.col1;
두 번째 쿼리는 결과를 반환합니다.
SELECT * FROM join_table jt1
RIGHT OUTER JOIN join_table_2 jt2 ON jt1.col1=jt2.col1;
조인 제약 조건이 있는 두 테이블 조인은 지원되지 않습니다¶
join_table
및 join_table_2
모두에 조인 정책이 할당된 경우 다음 조인 쿼리는 오류를 반환합니다.
SELECT * FROM join_table jt1 JOIN join_table_2 jt2 ON jt1.col1=jt2.col1;
UNION 세트 작업은 허용되지 않지만 INTERSECT 작업은 허용됩니다¶
이 예제에서 join_table
에는 조인 정책이 있지만 join_table_3
에는 조인 정책이 없습니다. UNION 쿼리는 실패하지만 유사한 INTERSECT 쿼리는 성공합니다.
SELECT * FROM JOIN_TABLE
UNION
SELECT * FROM JOIN_TABLE_3;
SELECT * FROM JOIN_TABLE
INTERSECT
SELECT * FROM JOIN_TABLE_3;
EXCEPT 동작은 쿼리 블록의 순서에 따라 달라집니다¶
EXCEPT 동작은 쿼리 블록의 순서에 따라 달라집니다. 첫 번째 쿼리는 조인 제약 조건이 있는 테이블에서 먼저 선택하고 오류를 반환합니다.
SELECT * FROM JOIN_TABLE
EXCEPT
SELECT * FROM JOIN_TABLE_3;
두 번째 쿼리가 성공합니다.
SELECT * FROM JOIN_TABLE_3
EXCEPT
SELECT * FROM JOIN_TABLE;
조인 제약된 테이블의 뷰도 보호됩니다¶
join_table
에 조인 정책 jp1
이 할당되었다고 가정합니다. 테이블에 뷰를 만듭니다.
CREATE VIEW join_table_view AS
SELECT * FROM join_table;
이제 조인을 지정하지 않고 뷰를 쿼리합니다.
SELECT * FROM join_table_view;
join_table
에 대한 정책을 위반하므로 쿼리가 실패했습니다. 뷰의 쿼리에는 조인이 포함되어야 합니다. 뷰를 사용한 조인 정책 동작에 대한 자세한 내용은 뷰 및 구체화된 뷰 섹션을 참조하십시오.
조인 정책 관리하기¶
조인 정책을 수정, 교체, 분리, 설명 및 모니터링할 수 있습니다. 다음 섹션에서는 이러한 관리 작업을 다룹니다.
조인 정책 수정하기¶
ALTER JOIN POLICY 명령을 사용하여 조인 정책 규칙을 수정할 수 있습니다. 정책의 이름을 바꾸거나 설명을 변경할 수도 있습니다.
조인 정책을 수정하기 전에 DESCRIBE JOIN POLICY 명령 또는 GET_DDL 함수를 실행하여 정책의 현재 SQL 식을 검토하십시오.
예를 들어, 다음 명령을 실행하여 조인이 필수가 아니도록 jp3
조인 정책의 SQL 식을 업데이트합니다.
ALTER JOIN POLICY jp3 SET BODY -> JOIN_CONSTRAINT(JOIN_REQUIRED => FALSE);
조인 정책 바꾸기¶
조인 정책을 교체하는 권장 방법은 ALTER TABLE 문에 FORCE
매개 변수를 사용하여 기존 정책을 분리하고 단일 명령으로 새 정책을 할당하는 것입니다. 이 접근 방식을 사용하면 기존 정책을 원자 단위로 교체할 수 있으므로 보호에 공백이 생기지 않습니다.
예를 들어, 이미 조인 제약이 있는 테이블에 새 조인 정책을 할당하는 경우입니다.
ALTER TABLE join_table SET JOIN POLICY jp2 FORCE;
하나의 문에서 테이블이나 뷰에서 정책을 분리(UNSET JOIN POLICY)한 다음 다른 문에서 새 정책을 설정(SET JOIN POLICY)할 수도 있습니다. 이 방법을 선택하면 두 작업 사이의 중간에서 테이블이 조인 정책으로 보호되지 않습니다. 이 시간 동안 쿼리는 잠재적으로 민감한 데이터에 액세스할 수 있습니다.
조인 정책 분리하기¶
ALTER TABLE 또는 ALTER VIEW 명령의 UNSET JOIN POLICY 절을 사용하여 테이블 또는 뷰에서 조인 정책을 분리합니다. 오브젝트에 둘 이상의 정책을 가질 수 없으므로 정책의 이름은 요구 사항이 아닙니다. 예:
ALTER VIEW join_view UNSET JOIN POLICY;
조인 정책 모니터링¶
다음과 같은 방법으로 조인 정책 사용량을 모니터링할 수 있습니다.
공유 SNOWFLAKE 데이터베이스의 Account Usage 스키마에서 JOIN_POLICIES 뷰를 쿼리합니다. 이 뷰는 Snowflake 계정의 모든 조인 정책에 대한 카탈로그 입니다.
POLICY_REFERENCES Information Schema 테이블 함수를 쿼리하여 조인 정책 참조를 식별하고 현재 정책이 적용된 테이블 및 뷰를 확인합니다.
조인 정책에 대한 정보 얻기¶
기존 조인 정책에 대한 정보를 얻으려면 공유 SNOWFLAKE 데이터베이스의 Account Usage 스키마에서 JOIN_POLICIES 뷰를 쿼리합니다. 이 뷰는 Snowflake 계정의 모든 조인 정책에 대한 카탈로그 입니다. 예를 들어, 특정 조인 정책에 대한 정책 본문을 반환할 수 있습니다.
SELECT policy_name, policy_body, created
FROM SNOWFLAKE.ACCOUNT_USAGE.JOIN_POLICIES
WHERE policy_name='JP2' AND created LIKE '2024-11-26%';
+-------------+----------------------------------------------------------+-------------------------------+
| POLICY_NAME | POLICY_BODY | CREATED |
|-------------+----------------------------------------------------------+-------------------------------|
| JP2 | CASE | 2024-11-26 11:22:54.848 -0800 |
| | WHEN CURRENT_ROLE() = 'ACCOUNTADMIN' | |
| | THEN JOIN_CONSTRAINT(JOIN_REQUIRED => FALSE) | |
| | ELSE JOIN_CONSTRAINT(JOIN_REQUIRED => TRUE) | |
| | END | |
+-------------+----------------------------------------------------------+-------------------------------+
조인 정책에 연결된 테이블 및 뷰에 대한 정보 가져오기¶
POLICY_REFERENCES Information Schema 테이블 함수는 기존 조인 정책에 연결된 테이블 및 뷰에 대한 정보를 반환합니다. 두 가지 구문 선택 사항을 사용할 수 있습니다.
지정된 조인 정책이 설정된 각 오브젝트(테이블 또는 뷰)에 대한 행을 반환합니다.
USE DATABASE my_db; USE SCHEMA INFORMATION_SCHEMA; SELECT policy_name, policy_kind, ref_entity_name, ref_entity_domain, ref_column_name, ref_arg_column_names, policy_status FROM TABLE(INFORMATION_SCHEMA.POLICY_REFERENCES(policy_name => 'my_db.my_schema.jp1'));
join_table
에 할당된 정책에 대한 정보를 반환합니다.USE DATABASE my_db; USE SCHEMA INFORMATION_SCHEMA; SELECT policy_name, policy_kind, ref_entity_name, ref_entity_domain, ref_column_name, ref_arg_column_names, policy_status FROM TABLE(INFORMATION_SCHEMA.POLICY_REFERENCES(ref_entity_name => 'my_db.my_schema.join_table', ref_entity_domain => 'table'));
+-------------+-------------+-----------------+-------------------+-----------------+----------------------+---------------+ | POLICY_NAME | POLICY_KIND | REF_ENTITY_NAME | REF_ENTITY_DOMAIN | REF_COLUMN_NAME | REF_ARG_COLUMN_NAMES | POLICY_STATUS | |-------------+-------------+-----------------+-------------------+-----------------+----------------------+---------------| | JP1 | JOIN_POLICY | JOIN_TABLE | TABLE | NULL | [ "COL1" ] | ACTIVE | +-------------+-------------+-----------------+-------------------+-----------------+----------------------+---------------+
정책 관리 모범 사례¶
조인 정책을 만들고 테이블에 정책을 할당하려면 마스킹, 프로젝션 및 집계 정책과 같은 다른 정책을 만들고 할당하는 것과 동일한 일반 절차가 필요합니다.
중앙 집중식 관리 방식을 사용하는 경우 사용자 지정 역할(예:
join_policy_admin
)을 만들어 정책을 관리합니다. 또는 기존 역할을 사용할 수 있습니다.이 역할에 조인 정책을 만들고 할당할 수 있는 권한을 부여합니다.
조인 정책을 만듭니다.
테이블에 정책을 할당하고 열 조인을 허용(ALLOWED JOIN KEYS)하도록 테이블을 만들거나 변경합니다.
테이블에서 일부 조인 및 비조인 쿼리를 테스트합니다.
테이블에 대한 성공적인 쿼리는 해당 데이터를 다른 테이블 또는 뷰에 조인해야 하며 허용된 열에 조인해야 합니다.
- 액세스 제어 관리자 작업
사용자 지정 역할을 만들어 조인 정책을 관리합니다. 기존 역할을 재사용할 수도 있습니다.
USE ROLE USERADMIN; CREATE ROLE join_policy_admin;
join_policy_admin
사용자 지정 역할에 스키마에서 조인 정책을 만들고 정책을 Snowflake 계정의 테이블 또는 뷰에 할당할 수 있는 권한을 부여합니다.이 단계에서는 프로젝션 정책이
privacy.join_policies
라는 데이터베이스와 스키마에 저장되고 이 데이터베이스와 스키마가 이미 존재한다고 가정합니다.GRANT USAGE ON DATABASE privacy TO ROLE join_policy_admin; GRANT USAGE ON SCHEMA privacy.join_policies TO ROLE join_policy_admin; GRANT CREATE JOIN POLICY ON SCHEMA privacy.join_policies TO ROLE join_policy_admin; GRANT APPLY JOIN POLICY ON ACCOUNT TO ROLE join_policy_admin;
이제 한 명 이상의 사용자에게
join_policy_admin
역할을 할당할 수 있습니다.조인 정책을 사용하는 데 필요한 권한에 대한 자세한 내용은 조인 정책 관리하기 (이 항목의) 섹션을 참조하십시오.
- 정책 관리자 작업 조인하기
조인 정책을 만듭니다.
USE ROLE join_policy_admin; USE SCHEMA privacy.join_policies; CREATE OR REPLACE JOIN POLICY jp1 AS () RETURNS JOIN_CONSTRAINT -> JOIN_CONSTRAINT(JOIN_REQUIRED => TRUE);
조인 정책과 다른 Snowflake 기능의 상호 작용¶
다음 섹션에서는 조인 정책이 다른 Snowflake 기능 및 서비스와 상호 작용하는 방식을 요약하여 설명합니다.
기타 정책¶
이 섹션에서는 조인 정책이 마스킹 정책, 행 액세스 정책, 집계 정책, 프로젝션 정책 을 비롯한 다른 정책과 상호 작용하는 방식에 대해 설명합니다.
조인 제약이 있는 테이블에 다른 정책을 첨부할 수 있습니다. 테이블에 대한 성공적인 쿼리는 모든 정책의 요구 사항을 충족해야 합니다.
행 액세스 정책이 조인 제약 조건 테이블에 할당된 경우 행 액세스 정책에 따라 쿼리 결과에서 제외된 행은 조인 결과를 계산할 때 포함되지 않습니다.
마스킹 정책, 행 액세스 정책, 집계 정책 또는 프로젝션 정책의 본문은 해당 열을 포함하여 조인 제약이 있는 테이블을 참조할 수 없습니다.
뷰 및 구체화된 뷰¶
뷰와 구체화된 뷰 모두에 조인 정책을 할당할 수 있습니다. 뷰에 조인 정책이 적용되면 기본 테이블은 조인 제약 조건이 적용되지 않습니다. 이 기본 테이블은 여전히 제한 없이 쿼리할 수 있습니다.
조인 제약된 테이블에서 뷰를 만들 수 있는지 여부는 뷰의 유형에 따라 다릅니다.
1개 이상의 조인 제약이 있는 테이블에서 일반 뷰를 만들 수 있지만, 해당 뷰에 대한 쿼리는 해당 기본 테이블의 제한을 충족하는 방식으로 데이터를 조인해야 합니다. 테이블에 뷰를 만들어서 보호된 테이블의 조인 정책을 우회할 수 없습니다. 테이블에 대한 정책이 뷰에 대한 쿼리에 대해 존중되고 적용됩니다. 예를 보려면 조인 제약된 테이블의 뷰도 보호됩니다 를 참조하십시오.
조인 제약이 있는 테이블 또는 뷰를 기반으로 구체화된 뷰를 만들 수 없으며 구체화된 뷰의 기반이 되는 테이블 또는 뷰에 조인 정책을 할당할 수 없습니다.
복제된 오브젝트¶
다음 접근 방식은 복제된 데이터베이스 또는 스키마에 저장된 복제된 테이블 또는 뷰에 대한 SELECT 권한이 있는 사용자의 데이터를 보호하는 데 도움이 됩니다.
개별 조인 정책 오브젝트 복제는 지원되지 않습니다.
데이터베이스를 복제하면 데이터베이스 내의 모든 조인 정책이 복제됩니다.
스키마를 복제하면 스키마 내의 모든 조인 정책이 복제됩니다.
복제본 테이블은 원본 테이블과 동일한 조인 정책에 매핑됩니다.
테이블이 복제되는 상위 스키마의 컨텍스트에서 테이블이 복제되는 경우 원본 테이블에 동일한 상위 스키마의 조인 정책에 대한 참조(즉, 로컬 참조)가 있으면 복제된 테이블은 복제된 조인 정책에 대한 참조를 갖게 됩니다.
원본 테이블이 다른 스키마(즉, 외부 참조)의 조인 정책을 참조하는 경우 복제본 테이블은 외부 참조를 유지합니다.
자세한 내용은 CREATE <오브젝트> … CLONE 섹션을 참조하십시오.
복제¶
데이터베이스 복제 및 복제 그룹을 사용하여 조인 정책과 해당 할당을 복제할 수 있습니다.
데이터베이스 복제 의 경우, 다음 조건 중 하나가 참이면 복제 작업이 실패합니다.
기본 데이터베이스가 Enterprise 이상 계정에 있고 정책이 포함되어 있지만, 복제가 승인된 1개 이상의 계정이 하위 에디션에 있습니다.
기본 데이터베이스에 포함된 테이블 또는 뷰에 다른 데이터베이스의 정책에 대한 현수 참조 가 있습니다.
복제 그룹 에서 여러 데이터베이스를 복제할 때 데이터베이스 복제에 대한 현수 참조 동작을 피할 수 있습니다.
권한과 명령¶
다음 하위 섹션에서는 조인 정책을 관리하는 데 도움이 되는 정보를 제공합니다.
정책 조인 권한¶
Snowflake는 조인 정책 오브젝트에 대해 다음과 같은 권한을 지원합니다.
스키마의 모든 오브젝트에 대해 작업을 수행하려면 상위 데이터베이스 및 스키마에 대한 USAGE 권한.
권한 |
사용법 |
---|---|
APPLY |
테이블의 조인 정책에 대한 설정 및 설정 취소 작업을 사용하도록 설정합니다. |
OWNERSHIP |
정책에 대한 모든 권한을 부여하는 조인 정책의 소유권을 이전합니다. 조인 정책의 대부분의 속성을 변경하는 데 필요합니다. |
자세한 내용은 DDL 명령, 작업 및 권한 요약 섹션을 참조하십시오.
조인 정책 DDL 참조¶
Snowflake는 다음 DDL 명령을 지원하여 조인 정책을 만들고 관리합니다.
DDL 명령, 작업 및 권한 요약¶
다음 표에는 조인 정책 권한과 DDL 작업 간의 관계가 요약되어 있습니다.
스키마의 모든 오브젝트에 대해 작업을 수행하려면 상위 데이터베이스 및 스키마에 대한 USAGE 권한.
작업 |
필요한 권한 |
---|---|
조인 정책을 만듭니다. |
동일한 스키마에서 CREATE JOIN POLICY 권한이 있는 역할. |
조인 정책을 변경합니다. |
조인 정책에 대한 OWNERSHIP 권한이 있는 역할입니다. |
조인 정책 설명하기 |
다음 중 하나:
|
조인 정책을 삭제합니다. |
조인 정책에 대한 OWNERSHIP 권한이 있는 역할입니다. |
조인 정책을 표시합니다. |
다음 중 하나:
|
테이블에 대한 조인 정책을 설정하거나 설정 해제합니다. |
다음 중 하나:
|
Snowflake는 오브젝트에 대한 조인 정책을 만들고 설정할 수 있는 다양한 권한을 지원합니다.
join_policy_admin
사용자 지정 역할이 모든 테이블에 조인 정책을 만들고 설정하는 중앙 집중식 정책 관리 방식의 경우 다음 권한이 필요합니다.USE ROLE securityadmin; GRANT USAGE ON DATABASE mydb TO ROLE join_policy_admin; GRANT USAGE ON SCHEMA mydb.schema TO ROLE join_policy_admin; GRANT CREATE JOIN POLICY ON SCHEMA mydb.schema TO ROLE join_policy_admin; GRANT APPLY ON JOIN POLICY ON ACCOUNT TO ROLE join_policy_admin;
하이브리드 관리 방식에서는 단일 역할에 CREATE JOIN POLICY 권한이 있어 조인 정책의 이름이 일관되게 지정되고 개별 팀 또는 역할은 특정 조인 정책에 대해 APPLY 권한을 갖습니다.
예를 들어, 사용자 지정 역할
finance_role
에는 해당 역할이 소유한 테이블 및 뷰에 대한 조인 정책cost_center
를 설정할 수 있는 권한이 부여될 수 있습니다(즉, 해당 역할은 테이블 또는 뷰에 대한 OWNERSHIP 권한이 있음).USE ROLE securityadmin; GRANT CREATE JOIN POLICY ON SCHEMA mydb.schema TO ROLE join_policy_admin; GRANT APPLY ON JOIN POLICY cost_center TO ROLE finance_role;