다이나믹 테이블 생성 문제 해결하기

다이나믹 테이블 생성 문제 해결하기

다이나믹 테이블을 만들 때 발생하는 문제를 진단하고 해결하는 방법을 알려드릴게요. 기존 다이나믹 테이블의 리프레시 실패는 다이나믹 테이블 리프레시 문제 해결을, 권한 관련 실패는 다이나믹 테이블 권한 문제 해결을 참고하세요.

출처: Snowflake 문서

본문

CREATE가 SQL 컴파일 오류로 실패

생성이 'context function not supported' 오류로 실패한다면, 정의가 활성 사용자 세션을 요구하는 함수를 사용하고 있는 거예요. 다이나믹 테이블 리프레시는 그런 세션 없이 비동기로 실행됩니다.

일반적인 오류 메시지:

SQL compilation error: Unsupported context function 'CURRENT_SESSION' used in dynamic table definition.

다이나믹 테이블은 정의에서 <C>CURRENT_SESSION</C>을 지원하지 않아요. 리프레시가 사용자 세션 없이 비동기로 실행되기 때문입니다.

해결 방법:

  • 정의에서 지원되지 않는 함수를 제거하세요.
  • 사용자 수준 필터링이 필요하면, 정의 내부가 아니라 다이나믹 테이블 위의 뷰나 정책에서 적용하세요.
  • 지원·미지원 구문의 전체 목록은 다이나믹 테이블 지원 쿼리를 참고하세요.

CREATE가 "insufficient privileges"로 실패

<C>CREATE DYNAMIC TABLE</C>이 insufficient privileges 오류로 실패하면, 실행 역할에 필요한 권한 부여(GRANT) 중 하나 이상이 빠져 있는 거예요.

SQL access control error: Insufficient privileges to operate on schema 'MY_DB.MY_SCHEMA'.

다이나믹 테이블을 만드는 데 필요한 최소 권한:

권한 객체 용도
CREATE DYNAMIC TABLE 스키마 스키마에서 다이나믹 테이블을 만들 수 있게 함
USAGE 웨어하우스 리프레시를 실행할 수 있게 함
SELECT 기본 테이블 기본 테이블이나 뷰를 읽을 수 있게 함
USAGE 데이터베이스 데이터베이스에 접근할 수 있게 함
USAGE 스키마 스키마에 접근할 수 있게 함
  • 역할이 현재 가진 권한을 확인하세요:
SHOW GRANTS TO ROLE transform_role;
  • 빠진 권한을 부여하세요:
GRANT CREATE DYNAMIC TABLE ON SCHEMA mydb.myschema TO ROLE transform_role;
GRANT USAGE ON WAREHOUSE transform_wh TO ROLE transform_role;
GRANT SELECT ON TABLE mydb.myschema.raw_orders TO ROLE transform_role;

전체 권한 레퍼런스는 다이나믹 테이블 액세스 제어를 참고하세요.

생성 후 다이나믹 테이블에 데이터가 없음

기본값 <C>INITIALIZE = ON_CREATE</C>에서는 CREATE 문이 초기 리프레시가 끝날 때까지 차단됩니다. 성공적으로 생성된 뒤 테이블이 0행을 반환한다면, 가장 흔한 원인은 기본 테이블의 행 액세스 정책이 다이나믹 테이블 소유자 역할(보조 역할 없이 실행됨)로 평가될 때 모든 데이터를 필터링하는 경우예요. 또한 정의의 WHERE 절과 JOIN 로직이 소유자 역할로 실행할 때 행을 반환하는지도 확인하세요.

<C>INITIALIZE = ON_SCHEDULE</C>에서는 초기 리프레시 전까지 테이블이 비어 있습니다. 쿼리는 <C>Dynamic table is not initialized</C> 오류를 반환합니다. 즉시 채우려면 <C>ALTER DYNAMIC TABLE <name> REFRESH</C>를 실행하세요.

INCREMENTAL을 기대했는데 리프레시 모드가 FULL로 해석됨

<C>REFRESH_MODE = AUTO</C>(기본값)으로 다이나믹 테이블을 만들면 Snowflake가 생성 시점에 정의를 평가해 INCREMENTAL 또는 FULL을 선택합니다. 이 결정은 영구적이며 ALTER로 변경할 수 없어요. 정의에 증분 리프레시를 지원하지 않는 구문이 있으면 AUTO는 경고 없이 FULL로 해석됩니다.

  • 해석된 리프레시 모드를 확인하세요:
SHOW DYNAMIC TABLES LIKE 'dt_orders' IN SCHEMA mydb.myschema;
SELECT "name", "refresh_mode" FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
+------------+--------------+
| name       | refresh_mode |
+------------+--------------+
| DT_ORDERS  | FULL         |
+------------+--------------+
  • 증분 리프레시가 필요하다면 <C>REFRESH_MODE = INCREMENTAL</C>을 명시적으로 설정하세요. 이렇게 하면 경고 없이 FULL로 폴백하는 대신, 정의에 지원되지 않는 구문이 있으면 생성이 실패합니다:
CREATE OR REPLACE DYNAMIC TABLE mydb.myschema.dt_orders
    TARGET_LAG = '10 minutes'
    WAREHOUSE = transform_wh
    REFRESH_MODE = INCREMENTAL
AS
SELECT order_id, customer_id, order_date
FROM mydb.myschema.raw_orders;
  • <C>REFRESH_MODE = INCREMENTAL</C>으로 생성이 실패하면 오류 메시지를 검토해 어떤 구문이 미지원인지 식별하세요. 증분 리프레시를 지원하는 구문 목록은 다이나믹 테이블 지원 쿼리를 참고하세요.

팁 전체 리프레시의 예상치 못한 비용을 피하려면 항상 <C>REFRESH_MODE</C>를 명시적으로 설정하세요. 정의가 증분으로 리프레시할 수 없을 때 생성 시점에 명확한 오류를 받으려면 <C>REFRESH_MODE = INCREMENTAL</C>을 사용하세요.

EXECUTE AS USER 오류

<C>CREATE DYNAMIC TABLE</C>에서 <C>EXECUTE AS USER</C> 절을 사용하면 Snowflake는 내부 SYSTEM 사용자 대신 명명된 사용자를 대신해 다이나믹 테이블을 리프레시합니다. 설정 중에 다음 오류가 발생할 수 있어요.

IMPERSONATE 권한 누락:

SQL access control error: Insufficient privileges to operate on user '<USER>'.

소유자 역할에 대상 사용자에 대한 IMPERSONATE 권한이 있어야 합니다. 다음과 같이 부여하세요:

GRANT IMPERSONATE ON USER service_user TO ROLE transform_role;

대상 사용자도 다이나믹 테이블의 소유자 역할을 보유해야 합니다:

GRANT ROLE transform_role TO USER service_user;

사용자가 존재하지 않음:

SQL compilation error: User '<USER>' does not exist or not authorized.

<C>EXECUTE AS USER</C> 절의 사용자 이름이 올바르게 철자됐는지, 사용자가 삭제되지 않았는지 확인하세요. 기존 사용자를 확인하려면:

SHOW USERS LIKE 'service_user';

EXECUTE AS USER 권한과 구성에 대한 자세한 내용은 EXECUTE AS USER를 참고하세요.

다이나믹 Iceberg 테이블 생성 문제

다이나믹 Iceberg 테이블을 만들 때는 표준 다이나믹 테이블보다 추가 구성이 필요합니다. 일반적인 오류는 외부 볼륨, 카탈로그, 기본 위치(base location)와 관련됩니다.

외부 볼륨 오류:

SQL compilation error: External volume '<VOLUME>' does not exist or not authorized.

외부 볼륨이 존재하고 생성 역할이 그에 대한 USAGE를 가졌는지 확인하세요:

SHOW EXTERNAL VOLUMES;
GRANT USAGE ON EXTERNAL VOLUME my_ext_volume TO ROLE transform_role;

카탈로그 통합(catalog integration) 오류:

SQL compilation error: Catalog integration '<CATALOG>' does not exist or not authorized.

카탈로그 통합을 사용한다면 존재하는지 확인하세요. Snowflake 관리 Iceberg 테이블은 보통 카탈로그 통합이 필요하지 않아요.

기본 위치 오류:

SQL compilation error: Invalid base location '<LOCATION>'.

<C>BASE_LOCATION</C>은 외부 볼륨 내의 유효한 상대 경로여야 합니다. 경로가 올바르게 형식화됐는지, 잘못된 문자가 없는지 확인하세요. 전체 생성 구문은 다이나믹 Apache Iceberg™ 테이블 만들기를 참고하세요.

기본 테이블에 change tracking이 활성화되지 않음

증분 리프레시는 정의가 참조하는 모든 기본 테이블의 change tracking이 필요합니다. Snowflake는 생성 역할이 기본 테이블의 OWNERSHIP을 가지면 증분 다이나믹 테이블을 만들 때 change tracking을 자동으로 활성화합니다.

Change tracking is not enabled on table '<TABLE>'.
  • 기본 테이블을 소유하고 있으면 Snowflake가 change tracking을 활성화해 줍니다. 조치가 필요 없어요.
  • 다른 역할이 기본 테이블을 소유하면 소유자에게 change tracking 활성화를 요청하세요:
ALTER TABLE mydb.myschema.raw_orders SET CHANGE_TRACKING = TRUE;
  • 또는 기본 테이블의 OWNERSHIP을 생성 역할에 부여하고, 다이나믹 테이블을 만든 뒤(change tracking이 자동으로 켜짐) OWNERSHIP을 다시 이전하세요.

참고 change tracking이 없는 테이블을 참조하는 뷰도 이 오류를 일으킵니다. 뷰가 참조하는 기본 테이블에서 change tracking을 활성화하세요.

초기화 중 웨어하우스가 쿼리 기록에 나타나지 않음

다이나믹 테이블을 만든 뒤에는 초기화 쿼리가 웨어하우스의 쿼리 기록에 즉시 나타나지 않아요. 초기 스케줄링·설정 작업이 웨어하우스 컴퓨트 크레딧을 소비하지 않는 Snowflake Cloud Services 계층에서 실행되기 때문입니다.

  • 초기화가 실행 중인지 확인하세요:
SELECT name, state, refresh_action
FROM TABLE(INFORMATION_SCHEMA.DYNAMIC_TABLE_REFRESH_HISTORY(NAME_PREFIX => 'mydb.myschema.dt_orders'))
ORDER BY refresh_start_time DESC
LIMIT 1;
  • 웨어하우스는 실제 데이터 계산이 시작될 때만 사용됩니다. 작은 초기화 작업(메타데이터 설정, 스케줄링 등록)은 전적으로 Cloud Services에서 실행됩니다. INITIALIZE 리프레시가 EXECUTING 상태로 전환되면 웨어하우스가 다시 시작되고 쿼리가 쿼리 기록에 나타납니다. 다이나믹 테이블의 데이터 양이 Cloud Services 컴퓨트 할당 안에서 처리될 만큼 작으면 웨어하우스가 전혀 재개되지 않을 수도 있어요.

Cloud Services 컴퓨트에 대한 자세한 내용은 컴퓨트 비용 이해하기를 참고하세요.

다음 단계

더 알아보기 (Learn more)