다이나믹 테이블 권한 문제 해결하기

다이나믹 테이블 권한 문제 해결하기

권한과 관련된 다이나믹 테이블 실패를 진단하고 해결하는 방법을 알려드릴게요. 권한과 무관한 리프레시 실패는 다이나믹 테이블 리프레시 문제 해결을, 생성 시점 문제는 다이나믹 테이블 생성 문제 해결을 참고하세요.

출처: Snowflake 문서

본문

보조 역할(secondary roles)을 사용하지 않아 리프레시가 실패

대화형으로 성공하는 쿼리도 리프레시 중에는 실패할 수 있어요. 리프레시가 소유자 역할만 사용하기 때문입니다. 보조 역할이 활성화되지 않아요.

일반적인 오류 메시지:

SQL access control error: Insufficient privileges to operate on table 'MY_DB.OTHER_SCHEMA.LOOKUP_TABLE'.
SQL compilation error: Object 'MY_DB.OTHER_SCHEMA.LOOKUP_TABLE' does not exist or not authorized.
  • 리프레시가 접근할 수 없는 객체를 식별하세요. 리프레시 기록에서 오류 세부 정보를 확인하세요:
SELECT name, state, state_message, query_id
FROM TABLE(INFORMATION_SCHEMA.DYNAMIC_TABLE_REFRESH_HISTORY(
  NAME_PREFIX => 'mydb.myschema.dt_orders',
  ERROR_ONLY => TRUE))
ORDER BY refresh_start_time DESC
LIMIT 1;
  • 빠진 권한을 다이나믹 테이블의 소유자 역할에 직접 부여하세요:
-- 소유자 역할 찾기
SHOW DYNAMIC TABLES LIKE 'dt_orders' IN SCHEMA mydb.myschema;

-- 출력에서 "owner" 컬럼 확인

-- 소유자 역할에 빠진 권한 부여
GRANT SELECT ON TABLE mydb.other_schema.lookup_table TO ROLE transform_role;
GRANT USAGE ON SCHEMA mydb.other_schema TO ROLE transform_role;
  • 권한이 데이터베이스 역할에서 온 것이라면, 그 데이터베이스 역할을 다이나믹 테이블의 소유자 역할에 부여하세요.

중요 다이나믹 테이블 액세스에 보조 역할을 의존하지 마세요. 정의에서 참조되는 모든 객체는 소유자 역할의 기본 권한(primary grants)으로 접근할 수 있어야 합니다.

소유권 이전 후 리프레시 실패

<C>GRANT OWNERSHIP</C>으로 다이나믹 테이블의 소유권을 다른 역할로 이전하면, 새 소유자 역할이 원래 소유자가 가졌던 권한을 전부 갖지 못할 수 있어요. 새 역할이 웨어하우스, 기본 테이블, 함수에 접근할 수 없어서 리프레시가 실패하기 시작합니다.

SQL access control error: Insufficient privileges to operate on warehouse 'TRANSFORM_WH'.
  • 이제 어떤 역할이 다이나믹 테이블을 소유하는지 확인하세요:
SHOW DYNAMIC TABLES LIKE 'dt_orders' IN SCHEMA mydb.myschema;
+------------+-------+------------------+
| name       | owner | ...              |
+------------+-------+------------------+
| DT_ORDERS  | NEW_ROLE | ...           |
+------------+-------+------------------+
  • 새 소유자 역할에 다이나믹 테이블 리프레시에 필요한 모든 권한을 부여하세요:
-- 웨어하우스 접근
GRANT USAGE ON WAREHOUSE transform_wh TO ROLE new_role;

-- 기본 테이블 접근
GRANT SELECT ON TABLE mydb.myschema.raw_orders TO ROLE new_role;

-- 정의가 UDF를 사용하는 경우
GRANT USAGE ON FUNCTION mydb.myschema.my_udf(VARCHAR) TO ROLE new_role;

-- 데이터베이스 및 스키마 접근
GRANT USAGE ON DATABASE mydb TO ROLE new_role;
GRANT USAGE ON SCHEMA mydb.myschema TO ROLE new_role;
  • 권한을 부여한 뒤, 연속 실패로 자동 일시 중단되었다면 다이나믹 테이블을 재개하세요:
ALTER DYNAMIC TABLE mydb.myschema.dt_orders RESUME;

팁 소유권을 이전하기 전에 <C>SHOW GRANTS TO ROLE <current_owner></C>를 실행해 부여 목록 전체를 기록하세요. 이전 전에 그 부여들을 새 소유자 역할에 복제하세요.

참고 정책 관련 리프레시 문제(행 액세스 정책, 마스킹 정책, 프로젝션 정책)는 다이나믹 테이블 리프레시 문제 해결에 문서화되어 있습니다.

다이나믹 테이블 메타데이터가 안 보임

존재한다고 아는 다이나믹 테이블에 대해 <C>SHOW DYNAMIC TABLES</C>나 <C>INFORMATION_SCHEMA.DYNAMIC_TABLES()</C>가 행을 반환하지 않으면, 문제는 빠진 권한입니다.

  • 다이나믹 테이블이 존재하고 역할이 볼 수 있는지 확인하세요:
SHOW DYNAMIC TABLES LIKE 'dt_orders' IN SCHEMA mydb.myschema;

행이 반환되지 않으면 여러분의 역할에 데이터베이스와 스키마의 USAGE도 필요할 수 있어요.

  • 역할이 다이나믹 테이블에 대한 MONITOR 권한을 가졌는지 확인하세요:
SHOW GRANTS ON DYNAMIC TABLE mydb.myschema.dt_orders;
+-------------------------------+-----------+---------------+------------+------------+--------------+
| created_on                    | privilege | granted_on    | name       | granted_to | grantee_name |
+-------------------------------+-----------+---------------+------------+------------+--------------+
| 2025-01-15 08:00:00.000 -0800 | MONITOR   | DYNAMIC_TABLE | DT_ORDERS  | ROLE       | ANALYST_ROLE |
+-------------------------------+-----------+---------------+------------+------------+--------------+
  • 역할에 MONITOR가 없으면 다이나믹 테이블 소유자에게 부여를 요청하세요:
GRANT MONITOR ON DYNAMIC TABLE mydb.myschema.dt_orders TO ROLE analyst_role;

다이나믹 테이블 작업에 필요한 전체 권한 목록은 다이나믹 테이블 액세스 제어를 참고하세요.

EXECUTE AS USER 권한 오류로 리프레시 실패

다이나믹 테이블이 <C>EXECUTE AS USER</C>를 사용하면, 필요한 권한이나 사용자 구성이 없으면 리프레시가 실패할 수 있어요.

IMPERSONATE 권한 누락. 다이나믹 테이블의 소유자 역할이 대상 사용자에 대한 IMPERSONATE를 보유해야 합니다. 이 권한이 없거나 취소되면 리프레시가 권한 오류로 실패합니다. 대상 사용자에 대한 IMPERSONATE를 다이나믹 테이블 소유자 역할에 부여하세요:

GRANT IMPERSONATE ON USER service_user TO ROLE transform_role;

사용자가 존재하지 않음. EXECUTE AS USER에 지정된 사용자가 존재해야 합니다. 사용자가 삭제되었거나 만들어진 적이 없으면 리프레시가 실패합니다. 사용자를 다시 만들고 다이나믹 테이블의 소유자 역할을 보유하게 하세요:

CREATE USER IF NOT EXISTS service_user;
GRANT ROLE transform_role TO USER service_user;

문제를 해결한 뒤, 자동 일시 중단되었다면 다이나믹 테이블을 재개하세요:

ALTER DYNAMIC TABLE mydb.myschema.dt_orders RESUME;

다음 단계

더 알아보기 (Learn more)