CREATE STREAM¶
현재/지정된 스키마에 새 스트림을 만들거나 기존 스트림 을 대체합니다. 스트림은 테이블, 디렉터리 테이블, 외부 테이블 또는 뷰(보안 뷰 포함)의 기본 테이블에 대한 데이터 조작 언어(DML) 변경 사항을 기록합니다. 변경 사항이 기록되는 오브젝트를 소스 오브젝트 라고 합니다.
또한, 이 명령은 다음 베리언트를 지원합니다.
CREATE STREAM … CLONE(기존 스트림의 복제본 생성)
- 참고 항목:
구문¶
명령 구문은 스트림이 생성되는 오브젝트에 따라 다릅니다.
-- table
CREATE [ OR REPLACE ] STREAM [IF NOT EXISTS]
<name>
[ COPY GRANTS ]
ON TABLE <table_name>
[ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> | STREAM => '<name>' } ) ]
[ APPEND_ONLY = TRUE | FALSE ]
[ SHOW_INITIAL_ROWS = TRUE | FALSE ]
[ COMMENT = '<string_literal>' ]
-- External table
CREATE [ OR REPLACE ] STREAM [IF NOT EXISTS]
<name>
[ COPY GRANTS ]
ON EXTERNAL TABLE <external_table_name>
[ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> | STREAM => '<name>' } ) ]
[ INSERT_ONLY = TRUE ]
[ COMMENT = '<string_literal>' ]
-- Directory table
CREATE [ OR REPLACE ] STREAM [IF NOT EXISTS]
<name>
[ COPY GRANTS ]
ON STAGE <stage_name>
[ COMMENT = '<string_literal>' ]
-- View
CREATE [ OR REPLACE ] STREAM [IF NOT EXISTS]
<name>
[ COPY GRANTS ]
ON VIEW <view_name>
[ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> | STREAM => '<name>' } ) ]
[ APPEND_ONLY = TRUE | FALSE ]
[ SHOW_INITIAL_ROWS = TRUE | FALSE ]
[ COMMENT = '<string_literal>' ]
베리언트 구문¶
CREATE STREAM … CLONE
원본 스트림과 똑같은 정의로 새 스트림을 만듭니다. 복제본은 소스 스트림에서 현재 오프셋 (즉, 현재 트랜잭션 테이블 버전)을 상속합니다.
CREATE [ OR REPLACE ] STREAM <name> CLONE <source_stream> [ COPY GRANTS ] [ ... ]
복제에 대한 자세한 내용은 CREATE <오브젝트> … CLONE 을 참조하십시오.
필수 매개 변수¶
name
스트림의 식별자(즉, 이름)를 지정하는 문자열로, 스트림이 생성되는 스키마에 대해 고유해야 합니다.
또한, 식별자는 알파벳 문자로 시작해야 하며 전체 식별자 문자열을 큰따옴표(예:
"My object"
)로 묶지 않는 한 공백이나 특수 문자를 포함할 수 없습니다. 큰따옴표로 묶인 식별자도 대/소문자를 구분합니다.자세한 내용은 식별자 요구 사항 섹션을 참조하십시오.
table_name
스트림(즉, 원본 테이블)으로 변경 내용이 추적되는 테이블의 식별자(예: 이름)를 지정하는 문자열입니다.
- 액세스 제어:
스트림을 쿼리하려면 역할에 기본 테이블에 대한 SELECT 권한이 있어야 합니다.
external_table_name
스트림(즉, 원본 외부 테이블)으로 변경 내용이 추적되는 외부 테이블의 식별자(예: 이름)를 지정하는 문자열입니다.
- 액세스 제어:
스트림을 쿼리하려면 역할에 기본 외부 테이블에 대한 SELECT 권한이 있어야 합니다.
stage_name
스트림(즉, 원본 디렉터리 테이블)으로 디렉터리 테이블 변경 내용이 추적되는 스테이지의 식별자(즉, 이름)를 지정하는 문자열입니다.
- 액세스 제어:
스트림을 쿼리하려면 역할에는 기본 스테이지에 대한 USAGE(외부 스테이지) 또는 READ(내부 스테이지) 권한이 있어야 합니다.
view_name
소스 뷰의 식별자(즉, 이름)를 지정하는 문자열입니다. 스트림은 뷰의 기본 테이블에 대한 DML 변경 사항을 추적합니다.
뷰의 스트림에 대한 자세한 내용은 Streams on Views 섹션을 참조하십시오.
- 액세스 제어:
스트림을 쿼리하려면 역할에 뷰에 대한 SELECT 권한이 있어야 합니다.
선택적 매개 변수¶
COPY GRANTS
다음 CREATE STREAM 베리언트 중 하나를 사용하여 새 스트림을 만들 때 원본 스트림의 액세스 허가를 유지하도록 지정합니다.
CREATE OR REPLACE STREAM
CREATE STREAM … CLONE
이 매개 변수는 OWNERSHIP을 제외한 모든 권한을 기존 스트림에서 새 스트림으로 복사합니다. 기본적으로, CREATE STREAM 명령을 실행하는 역할은 새 스트림을 소유합니다.
참고
CREATE STREAM 문이 둘 이상의 스트림(예:
create or replace stream t1 clone t2;
)을 참조하는 경우COPY GRANTS
절은 바뀌는 스트림을 우선합니다.대체 스트림에 대한 SHOW GRANTS 출력에는 CREATE STREAM 문이 실행될 때 현재 타임스탬프를 포함한 이 문을 실행한 역할로서 복사된 권한의 피부여자가 나열됩니다.
권한 부여 복사 작업은 CREATE STREAM 명령에서 원자적으로(즉, 같은 트랜잭션 내에서) 발생합니다.
참고
이 매개 변수는 현재 지원되지 않습니다.
AT ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> | STREAM => '<name>' ) | BEFORE ( TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> ) }
과거의 특정 시간/지점에서 스트림을 만듭니다(Time Travel 사용). AT | BEFORE 절은 과거 데이터가 요청되는 과거 지점을 결정합니다.
AT
키워드는 요청이 지정된 매개 변수와 똑같은 타임스탬프를 가진 문이나 트랜잭션에 의한 모든 변경 사항을 포함하도록 지정합니다.STREAM => '<이름>'
값은 특별합니다. 제공될 경우 CREATE STREAM 문은 지정된 스트림과 동일한 오프셋에 새 스트림을 만듭니다. (OR REPLACE
키워드를 사용하여) 기존 스트림을 다시 만들 때 이 값을 제공하여 기존 스트림이 다시 생성된 후 스트림의 현재 오프셋을 유지할 수도 있습니다.'<이름>'
은 오프셋이 새 스트림이나 다시 생성된 스트림에 복사되는 기존 스트림의 식별자(즉, 이름)입니다.새 스트림이나 다시 생성된 스트림은 스트림이 DML 트랜잭션에서 사용될 때 평소와 같이 오프셋을 진행합니다.
BEFORE
키워드는 요청이 지정된 매개 변수 바로 앞의 지점을 참조하도록 지정합니다.
참고
AT | BEFORE 절에 지정된 과거 지점의 소스 오브젝트에서 변경 내용 추적 데이터를 사용할 수 없으면 CREATE STREAM 문이 실패합니다. 변경 내용 추적이 기록되기 전의 과거 시점에 스트림을 한 번에 만들 수 없습니다.
APPEND_ONLY = TRUE | FALSE
표준 테이블의 스트림 또는 표준 테이블을 쿼리하는 뷰의 스트림에 대해서만 지원됩니다.
이것이 Append-only 스트림인지 여부를 지정합니다. Append-only 스트림은 행 삽입만 추적합니다. 업데이트 및 삭제 작업(테이블 자르기 포함)은 기록되지 않습니다. 예를 들어, 테이블에 행 10개를 삽입한 후 Append-only 스트림에 대한 오프셋이 이동되기 전 해당 행 중 5개를 삭제하면 스트림은 10개 행을 기록합니다.
이 유형의 스트림은 표준 스트림에 비해 쿼리 성능을 향상하고 행 삽입에만 의존하는 추출, 로드, 변환(ELT) 및 이와 유사한 상황에 매우 유용합니다.
표준 스트림은 변경 세트에서 삭제 및 삽입된 행을 조인하여 삭제된 행과 업데이트된 행을 확인합니다. Append-only 스트림은 추가된 행만 반환하므로, 표준 스트림보다 성능이 훨씬 더 우수할 수 있습니다. 예를 들어, Append-only 스트림에서 행을 사용한 직후 원본 테이블을 자를 수 있으며, 이러한 레코드 삭제는 다음 번 스트림 쿼리 또는 사용 시의 오버헤드에 영향을 주지 않습니다.
- 기본값:
FALSE
INSERT_ONLY = TRUE | FALSE
외부 테이블의 스트림에 필요합니다. 다른 오브젝트의 스트림에서는 지원되지 않습니다.
이것이 Insert-only 스트림인지 여부를 지정합니다. Insert-only 스트림은 행의 삽입만 추적하며, 삽입된 세트에서 행을 제거하는 삭제 작업을 기록하지 않습니다(즉, no-op). 예를 들어 두 오프셋 사이에서, 외부 테이블이 참조하는 클라우드 저장소 위치에서
File1
이 제거되고File2
가 추가되면 스트림은File2
의 행에 대한 기록만 반환합니다. 표준 테이블에 대한 CDC(변경 데이터 캡처) 데이터를 추적할 때와는 달리, Snowflake는 클라우드 저장소의 파일에 대한 과거 레코드에 액세스할 수 없습니다.- 기본값:
FALSE
SHOW_INITIAL_ROWS = TRUE | FALSE
스트림이 처음 소비될 때 반환할 레코드를 지정합니다.
TRUE
스트림은 오로지 자신이 생성된 순간에 원본 오브젝트에 존재했던 행만 반환합니다. METADATA$ISUPDATE 열은 이들 행의 FALSE 값을 표시합니다. 그 뒤에 스트림은 가장 최근 오프셋(즉, 정상적인 스트림 동작) 이후로 원본 오브젝트에 대한 DML 변경 사항을 반환합니다.
이 매개 변수를 사용하면 스트림에 대한 소스 오브젝트의 내용으로 모든 다운스트림 프로세스를 초기화할 수 있습니다.
FALSE
스트림은 가장 최근 오프셋 이후로 원본 오브젝트에 대한 DML 변경 사항을 반환합니다.
- 기본값:
FALSE
COMMENT = 'string_literal'
스트림에 대한 설명을 지정하는 문자열(리터럴)입니다.
기본값: 값 없음
출력¶
스트림에 대한 출력에는 다음 추가 열과 함께 소스 오브젝트와 동일한 열이 포함됩니다.
METADATA$ACTION: 작업(INSERT 또는 DELETE)을 지정합니다.
METADATA$ISUPDATE: 기록된 작업(INSERT 또는 DELETE)이 소스 테이블 또는 뷰의 행에 적용된 UPDATE의 일부인지 여부를 지정합니다.
스트림은 두 오프셋 사이의 차이를 기록한다는 점에 유의하십시오. 행이 추가된 후 현재 오프셋에서 업데이트되면 델타 변경 사항이 새 행이 됩니다. METADATA$ISUPDATE 행은 FALSE 값으로 기록됩니다.
METADATA$ROW_ID: 행의 고유하고 변경이 불가능한 ID를 지정하며, 시간 경과에 따른 특정 행의 변경 사항을 추적하기 위해 사용할 수 있습니다.
액세스 제어 요구 사항¶
이 SQL 명령을 실행하는 데 사용되는 역할 에는 최소한 다음 권한 이 있어야 합니다.
표준 테이블의 스트림:
오브젝트
권한
참고
스키마
CREATE STREAM
테이블
SELECT
원본 테이블에서 변경 내용 추적을 사용하지 않도록 설정되면(ALTER TABLE … SET CHANGE_TRACKING = TRUE 사용), 테이블 소유자(즉, 테이블에 대한 OWNERSHIP 권한이 있는 역할)만 테이블에 초기 스트림을 생성할 수 있습니다. 초기 스트림을 자동으로 생성하면 자동으로 테이블의 변경 사항을 추적할 수 있습니다.
스키마의 모든 오브젝트에 대해 작업하려면 상위 데이터베이스 및 스키마에 대한 USAGE 권한도 필요합니다.
뷰의 스트림:
오브젝트
권한
참고
스키마
CREATE STREAM
뷰
SELECT
원본 뷰와 기본 테이블에서 변경 내용 추적이 활성화되지 않은 경우, 뷰에 대한 OWNERSHIP 권한이 있는 역할과 그 기본 테이블 소유자만 뷰에서 초기 스트림을 만들 수 있습니다. 초기 스트림을 자동으로 생성하면 자동으로 테이블의 변경 사항을 추적할 수 있습니다. 뷰 및 그 기본 테이블에서 변경 내용 추적을 활성화하는 방법에 대한 지침은 뷰와 기본 테이블에서 변경 내용 추적 활성화하기 섹션을 참조하십시오. 변경 내용 추적을 활성화하면 변경 내용 추적이 활성화되는 동안 기본 테이블이 잠깁니다. 기본 오브젝트에 대한 잠금으로 인해 이러한 오브젝트에 대한 DDL/DML 작업에서 지연이 발생할 수 있습니다. 자세한 내용은 리소스 잠금 섹션을 참조하십시오.
스키마의 모든 오브젝트에 대해 작업하려면 상위 데이터베이스 및 스키마에 대한 USAGE 권한도 필요합니다.
디렉터리 테이블의 스트림:
오브젝트
권한
참고
스키마
CREATE STREAM
스테이지
USAGE(외부 스테이지) 또는 READ(내부 스테이지)
스키마의 모든 오브젝트에 대해 작업하려면 상위 데이터베이스 및 스키마에 대한 USAGE 권한도 필요합니다.
외부 테이블의 스트림:
오브젝트
권한
참고
스키마
CREATE STREAM
외부 테이블
SELECT
스키마의 모든 오브젝트에 대해 작업하려면 상위 데이터베이스 및 스키마에 대한 USAGE 권한도 필요합니다.
지정된 권한 세트로 사용자 지정 역할을 만드는 방법에 대한 지침은 사용자 지정 역할 만들기 섹션을 참조하십시오.
보안 오브젝트 에 대해 SQL 작업을 수행하기 위한 역할과 권한 부여에 대한 일반적인 정보는 액세스 제어의 개요 섹션을 참조하십시오.
사용법 노트¶
같은 트랜잭션에서 여러 오브젝트를 업데이트하기 위해 스트림을 여러 번 쿼리할 수 있으며 스트림은 같은 데이터를 반환합니다.
스트림이 DML 문에 사용될 때 스트림 위치(즉, 오프셋)가 이동됩니다. 위치는 트랜잭션이 끝날 때 트랜잭션의 시작 타임스탬프로 업데이트됩니다. 스트림은 스트림의 현재 위치에서 시작하여 현재 트랜잭션 타임스탬프에서 끝나는 변경 레코드를 설명합니다.
여러 문이 스트림의 똑같은 변경 레코드에 액세스하도록 하려면 명시적 트랜잭션 문(BEGIN .. COMMIT)으로 감싸십시오. 명시적 트랜잭션은 스트림을 잠그므로, 트랜잭션이 커밋될 때까지 소스 오브젝트에 대한 DML 업데이트가 스트림에 보고되지 않습니다.
스트림은 Fail-safe 기간 또는 Time Travel 보존 기간이 없습니다. 스트림이 삭제되면 이러한 오브젝트의 메타데이터를 복구할 수 없습니다.
공유 테이블의 스트림:
소스 테이블의 보존 기간은 테이블의 스트림이 부실해지는 것을 방지하기 위해 자동으로 연장되지 않습니다.
표준 스트림은 지리 공간 데이터에 대한 변경 데이터를 검색할 수 없습니다. 지리 공간 데이터가 포함된 오브젝트에 추가 전용 스트림을 생성하는 것이 좋습니다.
뷰의 스트림:
뷰 소유자 역할(즉, 뷰에 대한 OWNERSHIP 권한이 있는 역할)을 사용하여 뷰에서 첫 번째 스트림을 만들면 뷰에서 변경 내용을 추적할 수 있습니다. 같은 역할이 기본 테이블도 소유하는 경우 테이블에서도 변경 내용 추적이 활성화됩니다. 뷰와 기본 테이블 둘 다에 대한 OWNERSHIP 권한이 역할에 부여되지 않은 경우 해당 오브젝트에서 변경 내용 추적을 수동으로 활성화해야 합니다. 자세한 지침은 뷰와 기본 테이블에서 변경 내용 추적 활성화하기 섹션을 참조하십시오.
뷰의 조인 수에 따라 기본 테이블의 단일 변경으로 인해 스트림 출력이 많이 변경될 수 있습니다.
소스 뷰 또는 기본 테이블이 삭제되거나 다시 만들어지면(CREATE OR REPLACE VIEW 사용) 지정된 뷰의 모든 스트림이 중단됩니다.
보안 뷰의 모든 스트림은 보안 뷰 제약 조건을 준수합니다.
비보안 뷰의 소유자(즉, 뷰에 대한 OWNERSHIP 권한이 있는 역할)가 이를 보안 뷰로 변경하면(ALTER VIEW … SET SECURE 사용) 뷰의 모든 스트림은 자동으로 보안 뷰 제약 조건을 적용합니다.
또한 기본 테이블의 보존 기간은 보안 뷰의 스트림이 부실해지는 것을 방지하기 위해 자동으로 연장되지 않습니다.
뷰가 비결정적 함수를 사용하는 뷰를 기반으로 하는 스트림은 비결정적 결과를 반환할 수 있습니다.
예를 들어 CURRENT_DATE 및 CURRENT_USER 와 같은 컨텍스트 함수 의 결과는 비결정적입니다. RANDOM 과 같은 데이터 생성 함수 의 결과도 비결정적입니다. 뷰에 비결정적 함수가 포함된 경우 해당 뷰의 모든 스트림은 함수 출력의 지속적인 스냅샷이 아닙니다. 대신 쿼리 시에 스트림의 값이 변경될 수 있습니다.
뷰 결과의 비결정성이 스트림 쿼리 결과의 정확성에 영향을 미치지 않도록 하는 것이 좋습니다.
예를 보려면 비결정적 SQL 함수를 호출하는 뷰의 스트림 를 참조하십시오.
디렉터리 테이블의 스트림: 스트림 출력의 METADATA$ROW_ID 열 값이 비어 있습니다.
메타데이터 관련:
주의
고객은 Snowflake 서비스를 사용할 때 개인 데이터(사용자 오브젝트 제외), 민감한 데이터, 수출 통제 대상 데이터 또는 기타 규제 데이터가 메타데이터로 입력되지 않도록 해야 합니다. 자세한 내용은 Snowflake의 메타데이터 필드 섹션을 참조하십시오.
CREATE OR REPLACE <오브젝트> 문은 원자성입니다. 즉, 오브젝트가 바뀔 때 단일 트랜잭션으로 이전 오브젝트가 삭제되고 새 오브젝트가 생성됩니다.
예¶
테이블 스트림 만들기¶
mytable
테이블에 스트림 만들기:
CREATE STREAM mystream ON TABLE mytable;
원본 테이블과 함께 Time Travel 사용하기¶
스트림이 지정된 타임스탬프의 날짜 및 시간 이전에 존재했던 대로 mytable
테이블에 스트림 만들기:
CREATE STREAM mystream ON TABLE mytable BEFORE (TIMESTAMP => TO_TIMESTAMP(40*365*86400));
스트림이 지정된 타임스탬프의 날짜 및 시간에 정확히 존재했던 대로 mytable
테이블에 스트림 만들기:
CREATE STREAM mystream ON TABLE mytable AT (TIMESTAMP => TO_TIMESTAMP_TZ('02/02/2019 01:02:03', 'mm/dd/yyyy hh24:mi:ss'));
스트림이 5분 전에 존재했던 대로 mytable
테이블에 스트림 만들기:
CREATE STREAM mystream ON TABLE mytable AT(OFFSET => -60*5);
동일한 원본 테이블의 기존 스트림 oldstream
과 오프셋이 동일한 mytable
테이블에 스트림을 만듭니다.
CREATE STREAM mystream ON TABLE mytable AT(STREAM => 'oldstream');
기존 mystream
스트림을 다시 만들되, 현재 오프셋은 유지합니다.
CREATE OR REPLACE STREAM mystream ON TABLE mytable AT(STREAM => 'mystream');
그때까지의 트랜잭션은 포함하지만 지정된 트랜잭션으로 변경된 내용은 포함하지 않고 mytable
테이블에 스트림 만들기:
CREATE STREAM mystream ON TABLE mytable BEFORE(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');
단일 테이블 뷰에서 스트림 만들기¶
myview
뷰에서 스트림을 만듭니다.
CREATE STREAM mystream ON VIEW myview;
추가적인 예를 보려면 스트림 예 섹션을 참조하십시오.
외부 테이블에 Insert-only 스트림 만들기¶
외부 테이블 스트림을 만들고 스트림에서 외부 테이블 메타데이터에 추가된 레코드를 추적하는 변경 데이터 캡처 레코드 쿼리하기:
-- Create an external table that points to the MY_EXT_STAGE stage.
-- The external table is partitioned by the date (in YYYY/MM/DD format) in the file path.
CREATE EXTERNAL TABLE my_ext_table (
date_part date as to_date(substr(metadata$filename, 1, 10), 'YYYY/MM/DD'),
ts timestamp AS (value:time::timestamp),
user_id varchar AS (value:userId::varchar),
color varchar AS (value:color::varchar)
) PARTITION BY (date_part)
LOCATION=@my_ext_stage
AUTO_REFRESH = false
FILE_FORMAT=(TYPE=JSON);
-- Create a stream on the external table
CREATE STREAM my_ext_table_stream ON EXTERNAL TABLE my_ext_table INSERT_ONLY = TRUE;
-- Execute SHOW streams
-- The MODE column indicates that the new stream is an INSERT_ONLY stream
SHOW STREAMS;
+-------------------------------+------------------------+---------------+-------------+--------------+-----------+------------------------------------+-------+-------+-------------+
| created_on | name | database_name | schema_name | owner | comment | table_name | type | stale | mode |
|-------------------------------+------------------------+---------------+-------------+--------------+-----------+------------------------------------+-------+-------+-------------|
| 2020-08-02 05:13:20.174 -0800 | MY_EXT_TABLE_STREAM | MYDB | PUBLIC | MYROLE | | MYDB.PUBLIC.EXTTABLE_S3_PART | DELTA | false | INSERT_ONLY |
+-------------------------------+------------------------+---------------+-------------+--------------+-----------+------------------------------------+-------+-------+-------------+
-- Add a file named '2020/08/05/1408/log-08051409.json' to the stage using the appropriate tool for the cloud storage service.
-- Manually refresh the external table metadata.
ALTER EXTERNAL TABLE my_ext_table REFRESH;
-- Query the external table stream.
-- The stream indicates that the rows in the added JSON file were recorded in the external table metadata.
SELECT * FROM my_ext_table_stream;
+----------------------------------------+------------+-------------------------+---------+-------+-----------------+-------------------+-----------------+---------------------------------------------+
| VALUE | DATE_PART | TS | USER_ID | COLOR | METADATA$ACTION | METADATA$ISUPDATE | METADATA$ROW_ID | METADATA$FILENAME |
|----------------------------------------+------------+-------------------------+---------+-------+-----------------+-------------------+-----------------+---------------------------------------------|
| { | 2020-08-05 | 2020-08-05 15:57:01.000 | user25 | green | INSERT | False | | test/logs/2020/08/05/1408/log-08051409.json |
| "color": "green", | | | | | | | | |
| "time": "2020-08-05 15:57:01-07:00", | | | | | | | | |
| "userId": "user25" | | | | | | | | |
| } | | | | | | | | |
| { | 2020-08-05 | 2020-08-05 15:58:02.000 | user56 | brown | INSERT | False | | test/logs/2020/08/05/1408/log-08051409.json |
| "color": "brown", | | | | | | | | |
| "time": "2020-08-05 15:58:02-07:00", | | | | | | | | |
| "userId": "user56" | | | | | | | | |
| } | | | | | | | | |
+----------------------------------------+------------+-------------------------+---------+-------+-----------------+-------------------+-----------------+---------------------------------------------+
디렉터리 테이블에 표준 스트림 만들기¶
mystage
로 명명된 스테이지의 디렉터리 테이블에 스트림을 만듭니다.
CREATE STREAM dirtable_mystage_s ON STAGE mystage;
스트림을 채우기 위해 디렉터리 테이블 메타데이터를 수동으로 새로 고칩니다.
ALTER STAGE mystage REFRESH;
스트림에 대한 가장 최근 오프셋 이후에 하나 이상의 파일이 스테이지에 추가된 후 스트림을 쿼리합니다.
SELECT * FROM dirtable_mystage_s;
+-------------------+--------+-------------------------------+----------------------------------+----------------------------------+-------------------------------------------------------------------------------------------+-----------------+-------------------+-----------------+
| RELATIVE_PATH | SIZE | LAST_MODIFIED | MD5 | ETAG | FILE_URL | METADATA$ACTION | METADATA$ISUPDATE | METADATA$ROW_ID |
|-------------------+--------+-------------------------------+----------------------------------+----------------------------------+-------------------------------------------------------------------------------------------+-----------------+-------------------+-----------------|
| file1.csv.gz | 1048 | 2021-05-14 06:09:08.000 -0700 | c98f600c492c39bef249e2fcc7a4b6fe | c98f600c492c39bef249e2fcc7a4b6fe | https://myaccount.snowflakecomputing.com/api/files/MYDB/MYSCHEMA/MYSTAGE/file1%2ecsv%2egz | INSERT | False | |
| file2.csv.gz | 3495 | 2021-05-14 06:09:09.000 -0700 | 7f1a4f98ef4c7c42a2974504d11b0e20 | 7f1a4f98ef4c7c42a2974504d11b0e20 | https://myaccount.snowflakecomputing.com/api/files/MYDB/MYSCHEMA/MYSTAGE/file2%2ecsv%2egz | INSERT | False | |
+-------------------+--------+-------------------------------+----------------------------------+----------------------------------+-------------------------------------------------------------------------------------------+-----------------+-------------------+-----------------+