다이나믹 테이블 액세스 제어
다이나믹 테이블 액세스 제어
이 페이지는 다이나믹 테이블을 만들고, 조회하고, 관리하고, 모니터링하고, drop하는 데 필요한 권한을 설명합니다. 다이나믹 테이블 파이프라인을 구축하거나 관리하는 사람이라면 이 grant들이 필요해요.
다음 예시는 특정 스키마에서 다이나믹 테이블을 만드는 데 필요한 최소 권한을 역할에 부여합니다:
GRANT USAGE ON DATABASE mydb TO ROLE transform_role;
GRANT USAGE ON SCHEMA mydb.myschema TO ROLE transform_role;
GRANT USAGE ON WAREHOUSE transform_wh TO ROLE transform_role;
GRANT CREATE DYNAMIC TABLE ON SCHEMA mydb.myschema TO ROLE transform_role;
GRANT SELECT ON TABLE mydb.myschema.raw_orders TO ROLE transform_role;
이 grant 이후 해당 역할은 다이나믹 테이블을 만들고 소유자로서 조회할 수 있어요. 완전한 예시는 Grant privileges to create a dynamic table를 참고하세요.
참고: 이 예시들의 역할 이름(
transform_role,analyst_role등)은 자리표시자입니다. 자신의 역할 이름으로 바꾸세요. 이들은 Snowflake 내장 역할이 아니에요.
Snowflake 권한 모델의 전체 개요는 Overview of Access Control과 Access control privileges를 참고하세요.
출처: Snowflake 문서
본문
권한 빠른 참조
역할이 다이나믹 테이블을 만들면 그 역할이 소유자가 됩니다. Snowflake는 백그라운드 리프레시를 소유자 역할로 실행하므로, 소유자 역할은 참조하는 모든 객체에 대한 USAGE와 SELECT를 항상 유지해야 해요. 소유자 역할이 이 권한을 잃으면 리프레시가 실패합니다. 자세한 내용은 Understand the owner-role refresh model을 참고하세요.
다이나믹 테이블의 모든 작업은 포함하는 데이터베이스, 스키마, 그리고 (쿼리를 실행하는 작업의 경우) 웨어하우스에 대한 USAGE가 필요합니다. 아래 예시들은 각 섹션을 독립적으로 복사할 수 있도록 매번 이 grant들을 포함해요.
다음 표는 각 작업에 필요한 권한을 보여줍니다:
| 작업 | 필요한 권한 | 부여 대상 |
|---|---|---|
| 다이나믹 테이블 생성 | CREATE DYNAMIC TABLE | 스키마 |
| 다이나믹 테이블 조회 | SELECT | 다이나믹 테이블 |
| Suspend, resume, refresh, 웨어하우스/target lag 변경 | OPERATE | 다이나믹 테이블 |
| 리프레시 이력과 스케줄링 상태 조회 | MONITOR | 다이나믹 테이블 |
| 다이나믹 테이블 drop 또는 이름 변경 | OWNERSHIP | 다이나믹 테이블 |
| 소유권 이전 | OWNERSHIP | 다이나믹 테이블 |
OWNERSHIP은 OPERATE와 MONITOR의 모든 기능을 포함합니다.
다이나믹 테이블 생성 권한 부여
다이나믹 테이블을 만들려면 역할에 스키마에 대한 CREATE DYNAMIC TABLE, 정의(SELECT 쿼리)에서 참조하는 모든 base table 또는 뷰에 대한 SELECT, 그리고 데이터베이스·스키마·리프레시 웨어하우스에 대한 USAGE가 필요합니다.
-- 스키마에서 다이나믹 테이블을 생성할 수 있는 권한을 역할에 부여
GRANT USAGE ON DATABASE mydb TO ROLE transform_role;
GRANT USAGE ON SCHEMA mydb.myschema TO ROLE transform_role;
GRANT CREATE DYNAMIC TABLE ON SCHEMA mydb.myschema TO ROLE transform_role;
GRANT SELECT ON TABLE mydb.myschema.raw_orders TO ROLE transform_role;
GRANT USAGE ON WAREHOUSE transform_wh TO ROLE transform_role;
이 grant 이후 해당 역할은 다이나믹 테이블을 만들 수 있어요. 전체 dt_orders 정의는 Create a dynamic table을 참고하세요.
참고: 정의에서 직접 참조하는 상위 다이나믹 테이블에 의존하는 다이나믹 테이블을 만들면서
INITIALIZE = ON_CREATE를 설정하면, 생성 역할은[DYNAMIC_TABLE_REFRESH_BOUNDARY()](/user-guide/dynamic-tables/data-consistency)를 통해 참조되는 테이블을 제외한 모든 직접 참조 상위 다이나믹 테이블에 대해 OPERATE도 필요합니다.INITIALIZE = ON_SCHEDULE을 사용할 때는 필요하지 않아요.
INITIALIZE = ON_SCHEDULE을 웨어하우스 USAGE가 있는 보조 역할과 함께 사용하면, 기본(primary) 역할에 이 권한이 없을 경우 다이나믹 테이블이 성공적으로 리프레시되지 않습니다.
Future grant 설정하기
기존 다이나믹 테이블에 대한 grant는 나중에 만들어진 다이나믹 테이블에는 적용되지 않아요. FUTURE grant를 사용하면 새 다이나믹 테이블이 올바른 권한을 자동으로 상속받습니다:
GRANT SELECT ON FUTURE DYNAMIC TABLES IN SCHEMA mydb.myschema TO ROLE analyst_role;
GRANT MONITOR ON FUTURE DYNAMIC TABLES IN SCHEMA mydb.myschema TO ROLE ops_role;
이 grant들은 다이나믹 Iceberg 테이블에도 적용됩니다. 자세한 내용은 Grant access with future grants를 참고하세요.
다이나믹 테이블 조회 권한 부여
다이나믹 테이블을 만들 권한 없이 읽기만 하려면 역할에 다이나믹 테이블에 대한 SELECT와 데이터베이스·스키마·쿼리 웨어하우스에 대한 USAGE가 필요합니다:
GRANT USAGE ON DATABASE mydb TO ROLE analyst_role;
GRANT USAGE ON SCHEMA mydb.myschema TO ROLE analyst_role;
GRANT USAGE ON WAREHOUSE analytics_wh TO ROLE analyst_role;
GRANT SELECT ON DYNAMIC TABLE mydb.myschema.dt_orders TO ROLE analyst_role;
참고: 다이나믹 테이블에 권한을 부여할 때는 객체 유형을 TABLE이 아니라 DYNAMIC TABLE로 지정하세요. TABLE에 대한 grant는 다이나믹 테이블에 적용되지 않습니다.
이 grant들로 역할은 다이나믹 테이블을 다른 테이블처럼 조회할 수 있어요:
USE ROLE analyst_role;
SELECT order_id, product_name, line_total FROM mydb.myschema.dt_orders LIMIT 5;
+----------+--------------+------------+
| ORDER_ID | PRODUCT_NAME | LINE_TOTAL |
+----------+--------------+------------+
| 1001 | WIDGET A | 89.97 |
| 1002 | WIDGET B | 49.99 |
| 1003 | WIDGET A | 59.98 |
| 1004 | GADGET X | 62.50 |
+----------+--------------+------------+
한 번에 스키마의 모든 기존 다이나믹 테이블에 SELECT를 부여하려면:
GRANT SELECT ON ALL DYNAMIC TABLES IN SCHEMA mydb.myschema TO ROLE analyst_role;
OPERATE 부여로 다이나믹 테이블 관리
OPERATE 권한은 완전한 OWNERSHIP을 주지 않고도 역할이 다이나믹 테이블을 suspend, resume, 수동 리프레시할 수 있게 합니다. 리프레시 라이프사이클을 관리해야 하는 역할에 OPERATE를 부여하세요. 예: GRANT OPERATE ON DYNAMIC TABLE mydb.myschema.dt_orders TO ROLE pipeline_admin_role.
OPERATE가 있으면 역할은 suspend, resume, 수동 리프레시를 트리거할 수 있어요:
USE ROLE pipeline_admin_role;
ALTER DYNAMIC TABLE mydb.myschema.dt_orders SUSPEND;
ALTER DYNAMIC TABLE mydb.myschema.dt_orders RESUME;
ALTER DYNAMIC TABLE mydb.myschema.dt_orders REFRESH;
OPERATE는 웨어하우스나 target lag를 변경하는 것도 허용합니다. 웨어하우스 변경에는 새 웨어하우스에 대한 USAGE가 필요해요:
GRANT USAGE ON WAREHOUSE transform_wh_xl TO ROLE pipeline_admin_role;
ALTER DYNAMIC TABLE mydb.myschema.dt_orders SET
WAREHOUSE = transform_wh_xl
TARGET_LAG = '5 minutes';
MONITOR 부여로 메타데이터 조회
MONITOR 권한은 다이나믹 테이블을 변경할 수 없이 운영 메타데이터에 대한 읽기 전용 액세스를 제공합니다. 관측 가능성이 필요한 역할에 MONITOR를 부여하세요. 예: GRANT MONITOR ON DYNAMIC TABLE mydb.myschema.dt_orders TO ROLE ops_role.
MONITOR가 있으면 역할은 SHOW DYNAMIC TABLES에서 스케줄링 상태, 리프레시 이력, 그래프 이력을 조회할 수 있어요:
USE ROLE ops_role;
-- 스케줄링 상태와 구성 조회
SHOW DYNAMIC TABLES LIKE 'dt_orders' IN SCHEMA mydb.myschema;
-- 최근 리프레시 이력 조회
SELECT name, state, refresh_trigger, refresh_action
FROM TABLE(INFORMATION_SCHEMA.DYNAMIC_TABLE_REFRESH_HISTORY(
NAME => 'mydb.myschema.dt_orders',
DATA_TIMESTAMP_START => DATEADD('hour', -1, CURRENT_TIMESTAMP())
));
-- 모든 다이나믹 테이블의 현재 상태 그래프 이력 조회
SELECT * FROM TABLE(INFORMATION_SCHEMA.DYNAMIC_TABLE_GRAPH_HISTORY())
WHERE qualified_name = 'mydb.myschema.dt_orders';
MONITOR가 없으면 SELECT만 있는 역할로 다이나믹 테이블을 조회할 때 다음 필드가 숨겨집니다: text, warehouse, scheduling_state, last_suspended_on, suspend_reason_code (Snowsight 전용).
MONITOR는 읽기 전용입니다. 테이블을 suspend, resume, refresh할 수 없어요.
OWNERSHIP 부여로 전체 제어권 이전
OWNERSHIP은 다이나믹 테이블에 대한 전체 제어권을 부여합니다. drop/undrop, 이름 변경, swap, 주석 설정, 클러스터링 키 변경, 거버넌스 정책 관리를 포함해요. 한 번에 한 역할만 OWNERSHIP을 보유할 수 있습니다.
소유권은 SQL 또는 Snowsight로 이전할 수 있어요.
GRANT OWNERSHIP ON DYNAMIC TABLE mydb.myschema.dt_orders TO ROLE pipeline_admin_role;
스키마의 모든 향후 다이나믹 테이블 소유권을 이전하려면:
GRANT OWNERSHIP ON FUTURE DYNAMIC TABLES IN SCHEMA mydb.myschema TO ROLE pipeline_admin_role;
Snowsight로 이전하려면:
- Snowsight에 로그인합니다.
- 내비게이션 메뉴에서 Transformation » Dynamic tables를 선택합니다.
- 목록에서 다이나믹 테이블을 찾아 » Transfer Ownership을 선택합니다.
- 소유권을 이전할 역할을 선택합니다.
소유자 역할 리프레시 모델 이해하기
Snowflake는 다이나믹 테이블의 소유자 역할로 백그라운드 리프레시를 실행합니다. 즉, 소유자 역할은 다음 권한을 항상 유지해야 하며, 그렇지 않으면 예정된 리프레시가 실패해요:
| 권한 | 객체 |
|---|---|
| SELECT | 정의에서 참조하는 모든 base table, 뷰, 다이나믹 테이블 |
| USAGE | 그 base 객체를 포함하는 데이터베이스와 스키마 |
| USAGE | 다이나믹 테이블에 할당된 웨어하우스 |
소유권을 이전할 때 새 소유자 역할은 이미 이 권한들을 갖고 있어야 합니다. 없으면 리프레시가 실패하고, 반복적 오류 후 다이나믹 테이블이 자동으로 suspend될 수 있어요.
소유권 이전 후 권한 오류 진단
리프레시 웨어하우스에 대한 USAGE가 없는 역할로 소유권을 이전하면 다음 예정된 리프레시가 실패합니다:
-- 웨어하우스 USAGE가 없는 역할로 소유권 이전
GRANT OWNERSHIP ON DYNAMIC TABLE mydb.myschema.dt_orders TO ROLE new_owner_role;
리프레시는 다음과 비슷한 에러로 실패합니다:
SQL compilation error: Failed to refresh dynamic table with refresh_trigger SCHEDULED
at data_timestamp <ts> because of the error: SQL compilation error: Target table
failed to refresh: Dynamic Table 'MYDB.MYSCHEMA.DT_ORDERS' could not be refreshed
because warehouse 'TRANSFORM_WH' is missing.
수정하려면 새 소유자 역할에 누락 권한을 부여하세요:
GRANT USAGE ON WAREHOUSE transform_wh TO ROLE new_owner_role;
GRANT SELECT ON TABLE mydb.myschema.raw_orders TO ROLE new_owner_role;
GRANT USAGE ON DATABASE mydb TO ROLE new_owner_role;
GRANT USAGE ON SCHEMA mydb.myschema TO ROLE new_owner_role;
그런 다음 다이나믹 테이블을 재개합니다:
ALTER DYNAMIC TABLE mydb.myschema.dt_orders RESUME;
특정 사용자 권한으로 리프레시 (EXECUTE AS USER)
대부분의 다이나믹 테이블 구성은 EXECUTE AS USER가 필요 없어요. 다이나믹 테이블이 행 액세스 정책, 마스킹 정책을 사용하거나 리프레시에 보조 역할이 필요할 때만 이 섹션을 읽으세요.
기본적으로 Snowflake는 소유자 역할로 다이나믹 테이블을 내부 SYSTEM 사용자로 리프레시합니다. EXECUTE AS USER 옵션은 리프레시가 지정된 사용자를 대신해 실행되도록 바꿔요. 기본 역할은 여전히 다이나믹 테이블의 소유자 역할이지만, 지정된 사용자의 보조 역할도 활성화됩니다.
EXECUTE AS USER는 다음 경우에 사용하세요:
- 행 액세스/마스킹 정책이
CURRENT_USER()를 참조합니다. 기본 SYSTEM 사용자는 정책 조건과 일치하지 않아요. EXECUTE AS USER를 설정하면 리프레시 중CURRENT_USER()가 지정된 사용자로 평가됩니다. - 보조 역할이 필요할 때. 소유자 역할만으로는 필요한 모든 객체에 도달할 수 없지만, 사용자의 보조 역할은 도달할 수 있을 때.
- 감사 귀속(audit attribution)이 중요할 때. 리프레시가 SYSTEM 사용자 대신 지정된 사용자로 귀속됩니다.
EXECUTE AS USER 권한 부여
소유자 역할은 대상 사용자에 대한 IMPERSONATE가 있어야 하고, 대상 사용자는 다이나믹 테이블의 소유자 역할을 보유해야 합니다:
-- 소유자 역할이 서비스 사용자를 대신해 행동할 수 있도록 IMPERSONATE 부여
GRANT IMPERSONATE ON USER service_user TO ROLE transform_role;
-- 서비스 사용자도 소유자 역할을 보유해야 함
GRANT ROLE transform_role TO USER service_user;
그런 다음 EXECUTE AS USER 절로 다이나믹 테이블을 만들거나 변경합니다:
CREATE OR REPLACE DYNAMIC TABLE mydb.myschema.dt_orders
TARGET_LAG = '10 minutes'
WAREHOUSE = transform_wh
EXECUTE AS USER service_user
AS
SELECT ... FROM mydb.myschema.raw_orders ...;
지정된 사용자에게 할당된 모든 역할(기본 역할만이 아니라)에 리프레시 액세스를 부여하려면 USE SECONDARY ROLES ALL을 추가하세요:
CREATE OR REPLACE DYNAMIC TABLE dt_orders
TARGET_LAG = '10 minutes'
WAREHOUSE = transform_wh
EXECUTE AS USER service_user
USE SECONDARY ROLES ALL
AS
SELECT ... FROM raw_orders;
전체 dt_orders 정의는 Create a dynamic table을 참고하세요. 기존 다이나믹 테이블의 사용자를 변경하려면 ALTER DYNAMIC TABLE <name> SET EXECUTE AS USER <user>를 실행하고, 기본 SYSTEM 사용자로 되돌리려면 ALTER DYNAMIC TABLE <name> UNSET EXECUTE AS USER를 실행하세요.
중요: 다이나믹 테이블 생성 후 IMPERSONATE 권한이 취소되면 리프레시가 실패하고 다이나믹 테이블이 자동으로 suspend될 수 있습니다.
EXECUTE AS USER의 크로스 프로덕트 고려사항
- 데이터 마스킹 및 행 액세스 정책.
CURRENT_USER()를 사용하는 정책은 SYSTEM 사용자가 아니라 지정된 사용자로 평가됩니다. - 복제와 장애 조치. 사용자 이름과 역할 이름이 보조 배포에 복제됩니다. 사용자나 역할이 보조 환경에 없으면 사용자가 INVALID로 표시되고, 사용자와 역할이 재생성될 때까지 리프레시가 실패합니다.
이중 웨어하우스 권한
INITIALIZATION_WAREHOUSE를 사용할 때 모든 권한 요구사항은 WAREHOUSE와 동일합니다. 역할은 두 웨어하우스 모두에 USAGE가 필요합니다:
| 작업 | 필요한 권한 |
|---|---|
| INITIALIZATION_WAREHOUSE로 CREATE DYNAMIC TABLE | CREATE DYNAMIC TABLE과 WAREHOUSE 및 INITIALIZATION_WAREHOUSE 모두에 USAGE |
| ALTER DYNAMIC TABLE SET 또는 UNSET INITIALIZATION_WAREHOUSE | 다이나믹 테이블에 OWNERSHIP 또는 OPERATE, 해당 웨어하우스에 USAGE |
| ALTER DYNAMIC TABLE REFRESH (INITIALIZATION_WAREHOUSE 포함) | 다이나믹 테이블에 OPERATE, 해당 웨어하우스에 USAGE |
자세한 내용은 Choose and size warehouses for dynamic tables을 참고하세요.
더 알아보기 (Learn more)
- Choose and size warehouses for dynamic tables — 리프레시용 웨어하우스 구성
- Monitor dynamic tables — 리프레시 상태 모니터링
- Troubleshoot dynamic table refresh issues — 리프레시 실패 해결
- REVOKE
… FROM ROLE — 권한 취소