CREATE STREAM¶
Erstellt einen neuen Stream im aktuellen/angegebenen Schema oder ersetzt einen bestehenden Stream. Ein Stream erfasst Änderungen an einer Tabelle, einer Verzeichnistabelle, einer externen Tabelle oder den zugrunde liegenden Tabellen einer Ansicht (einschließlich sicherer Ansichten) auf, die mit Data Manipulation Language (DML) ausgeführt wurden. Das Objekt, für das Änderungen erfasst werden, wird als Quellobjekt bezeichnet.
Darüber hinaus unterstützt dieser Befehl die folgende Variante:
CREATE STREAM … CLONE (erstellt einen Klon eines bestehenden Streams)
- Siehe auch:
Syntax¶
Die Befehlssyntax unterscheidet sich je nach dem Objekt, auf dem der Stream erstellt wird:
-- 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>' ]
Syntaxvariante¶
CREATE STREAM … CLONE
Erstellt einen neuen Stream mit derselben Definition wie der Quellstream. Der Klon erbt den aktuellen Offset (d. h. die aktuelle Tabellenversion der Transaktion) vom Quell-Stream.
CREATE [ OR REPLACE ] STREAM <name> CLONE <source_stream> [ COPY GRANTS ] [ ... ]
Weitere Informationen zum Klonen finden Sie unter CREATE <Objekt> … CLONE.
Erforderliche Parameter¶
name
Zeichenfolge, die den Bezeichner (d. h. den Namen) für den Stream angibt. Der Wert muss für das Schema, in dem der Stream erstellt wird, eindeutig sein.
Darüber hinaus muss der Bezeichner mit einem Buchstaben beginnen und darf keine Leer- oder Sonderzeichen enthalten, es sei denn, die gesamte Bezeichnerzeichenfolge wird in doppelte Anführungszeichen gesetzt (z. B.
"My object"
). Bei Bezeichnern, die in doppelte Anführungszeichen eingeschlossen sind, ist auch die Groß-/Kleinschreibung zu beachten.Weitere Details dazu finden Sie unter Anforderungen an Bezeichner.
table_name
Zeichenfolge, die den Bezeichner (d. h. den Namen) für die Tabelle angibt, deren Änderungen vom Stream verfolgt werden (d. h. die Quelltabelle).
- Zugriffssteuerung:
Um einen Stream abzufragen, muss eine Rolle über die Berechtigung SELECT für die zugrunde liegende Tabelle verfügen.
external_table_name
Zeichenfolge, die den Bezeichner (d. h. den Namen) für die Tabelle angibt, deren Änderungen vom Stream verfolgt werden sollen (d. h. die externe Quelltabelle).
- Zugriffssteuerung:
Um einen Stream abzufragen, muss eine Rolle über die Berechtigung SELECT für die zugrunde liegende externe Tabelle verfügen.
stage_name
Zeichenfolge, die den Bezeichner (d. h. den Namen) für den Stagingbereich angibt, dessen Änderungen der Verzeichnistabelle vom Stream verfolgt werden (d. h. die Quellverzeichnistabelle).
- Zugriffssteuerung:
Um einen Stream abzufragen, muss eine Rolle über die Berechtigung USAGE (externer Stagingbereich) oder READ (interner Stagingbereich) für die zugrunde liegende Tabelle verfügen.
view_name
Zeichenfolge, die den Bezeichner (d. h. den Namen) für die Quellansicht angibt. Der Stream verfolgt DML-Änderungen an den zugrunde liegenden Tabellen der Ansicht.
Weitere Informationen zu Streams auf Ansichten finden Sie unter Streams on Views.
- Zugriffssteuerung:
Um einen Stream abzufragen, muss eine Rolle über die Berechtigung SELECT für die Ansicht verfügen.
Optionale Parameter¶
COPY GRANTS
Gibt an, dass die Zugriffsberechtigungen aus dem Original-Stream beibehalten werden, wenn mit einer der folgenden CREATE STREAM-Varianten ein neuer Stream erstellt wird:
CREATE OR REPLACE STREAM
CREATE STREAM … CLONE
Der Parameter kopiert alle Berechtigungen, mit Ausnahme von OWNERSHIP, aus dem bestehenden Stream in den neuen Stream. Standardmäßig ist die Rolle, die den Befehl CREATE STREAM ausführt, Eigentümer des neuen Streams.
Bemerkung
Wenn die CREATE STREAM-Anweisung auf mehr als einen Stream verweist (z. B.
create or replace stream t1 clone t2;
), gibt dieCOPY GRANTS
-Klausel dem zu ersetzenden Stream den Vorrang.Die SHOW GRANTS-Ausgabe für den Ersetzungsstream listet den Berechtigten für die kopierten Berechtigungen als Rolle auf, die die CREATE STREAM-Anweisung ausgeführt hat, und mit dem aktuellen Zeitstempel für die Ausführung der Anweisung.
Die Operation zum Kopieren von Berechtigungen erfolgt atomar im Befehl CREATE STREAM (d. h. innerhalb derselben Transaktion).
Bemerkung
Dieser Parameter wird derzeit nicht unterstützt.
AT ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> | STREAM => '<name>' ) | BEFORE ( TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> ) }
Erstellt einen Stream zu einem bestimmten Zeitpunkt in der Vergangenheit (mittels Time Travel). Die AT | BEFORE-Klausel bestimmt den Zeitpunkt in der Vergangenheit, ab dem historische Daten angefordert werden:
Das Schlüsselwort
AT
gibt an, dass die Anforderung alle Änderungen beinhaltet, die durch eine Anweisung oder Transaktion mit einem Zeitstempel gleich dem angegebenen Parameter vorgenommen werden.Der Wert
STREAM => '<Name>'
ist speziell. Wenn er bereitgestellt wird, erstellt die CREATE STREAM-Anweisung den neuen Stream mit demselben Offset, den auch der angegebene Stream hat. Sie können diesen Wert auch angeben, wenn Sie einen vorhandenen Stream neu erstellen (mit den SchlüsselwörternOR REPLACE
), um den aktuellen Offset des Streams nach der Neuerstellung beizubehalten.'<Name>'
ist der Bezeichner (d. h. der Name) des vorhandenen Streams, dessen Offset in den neuen oder erneut erstellten Stream kopiert wird.Der neue oder erneut erstellte Stream rückt den Offset wie üblich vor, wenn der Stream in einer DML-Transaktion verwendet wird.
Das Schlüsselwort
BEFORE
gibt an, dass sich die Anforderung auf einen Zeitpunkt unmittelbar vor dem angegebenen Parameter bezieht.
Bemerkung
Wenn zu dem in der AT | BEFORE-Klausel angegebenen Zeitpunkt für das Quellobjekt keine Änderungsverfolgungsdaten vorlagen, lieferte die CREATE STREAM-Anweisung einen Fehler. Ein Stream zu einem Zeitpunkt in der Vergangenheit kann nur erstellt werden, wenn dieser Zeitpunkt nach Beginn der Änderungsverfolgung liegt.
APPEND_ONLY = TRUE | FALSE
Wird nur für Streams auf Standardtabellen oder Streams auf Ansichten unterstützt, die Standardtabellen abfragen.
Gibt an, ob es sich um einen Nur-Anfügen-Stream handelt. Nur-Anfügen-Streams verfolgen nur Zeileneinfügungen. Aktualisierungs- und Löschoperationen (einschließlich Tabellenkürzungen) werden nicht aufgezeichnet. Wenn beispielsweise 10 Zeilen in eine Tabelle eingefügt werden und dann 5 dieser Zeilen gelöscht werden, bevor der Offset für einen Nur-Anfügen-Stream erweitert wird, zeichnet der Stream 10 Zeilen auf.
Diese Art von Stream verbessert die Abfrageleistung gegenüber Standardstreams und ist sehr nützlich für das Extrahieren, Laden, Transformieren (ELT) und ähnliche Szenarien, die ausschließlich von Zeileneinfügungen abhängen.
Ein Standardstream verknüpft die gelöschten und eingefügten Zeilen im Änderungsset, um zu bestimmen, welche Zeilen gelöscht und welche aktualisiert wurden. Ein Nur-Anfügen-Stream gibt nur die angefügten Zeilen zurück und kann daher viel leistungsfähiger als ein Standardstream sein. Beispiel: Die Quelltabelle kann unmittelbar nach dem Verarbeiten der Zeilen eines Nur-Anfügen-Streams abgeschnitten werden, und das Löschen von Datensätzen produziert keinen Overhead, wenn der Stream das nächste Mal abgefragt oder verarbeitet wird.
- Standard:
FALSE
INSERT_ONLY = TRUE | FALSE
Für Streams auf externen Tabellen erforderlich. Wird bei Streams auf anderen Objekten nicht unterstützt.
Gibt an, ob dies ein Nur-Einfügen-Stream ist. Bei Nur-Einfügen-Streams werden nur Zeileneinfügungen verfolgt. Löschoperationen, bei denen Zeilen aus einem eingefügten Set entfernt werden, werden nicht erfasst (d. h. NoOps). Wenn beispielsweise zwischen zwei beliebigen Offsets
File1
aus dem Cloudspeicherort entfernt wird, auf den in der externen Tabelle verwiesen wird, undFile2
hinzugefügt wird, gibt der Stream nur Datensätze für die Zeilen inFile2
zurück. Im Gegensatz zur Verfolgung von CDC-Daten (Change Data Capture, Erfassen von Datenänderungen) für Standardtabellen kann Snowflake nicht auf die historischen Datensätze von Dateien im Cloudspeicher zugreifen.- Standard:
FALSE
SHOW_INITIAL_ROWS = TRUE | FALSE
Gibt die Datensätze an, die beim ersten Abruf des Streams zurückgegeben werden sollen.
TRUE
Der Stream gibt nur die Zeilen zurück, die zum Zeitpunkt der Erstellung des Streams im Quellobjekt vorhanden waren. Die Spalte METADATA$ISUPDATE zeigt in diesen Zeilen einen FALSE-Wert an. Anschließend gibt der Stream alle DML-Änderungen am Quellobjekt seit dem letzten Offset zurück. Das ist das normale Verhalten des Streams.
Dieser Parameter ermöglicht die Initialisierung eines beliebigen nachgeschalteten Prozesses mit dem Inhalt des Quellobjekts für den Stream.
FALSE
Der Stream gibt alle DML-Änderungen an dem Quellobjekt seit dem letzten Offset zurück.
- Standard:
FALSE
COMMENT = 'string_literal'
Zeichenfolge (Literal), die einen Kommentar zum Stream enthält.
Standard: Kein Wert
Ausgabe¶
Die Ausgabe für einen Stream enthält dieselben Spalten wie das Quellobjekt sowie die folgenden zusätzlichen Spalten:
METADATA$ACTION: Gibt die Aktion an (INSERT oder DELETE).
METADATA$ISUPDATE: Gibt an, ob die erfasste Aktion (INSERT oder DELETE) Teil einer Aktualisierung (UPDATE) ist, die auf die Zeilen in der Quelltabelle oder -ansicht angewendet wird.
Beachten Sie, dass Streams die Unterschiede zwischen zwei Offsets aufzeichnen. Wenn eine Zeile hinzugefügt und dann im aktuellen Offset aktualisiert wird, ist die Deltaänderung eine neue Zeile. Die METADATA$ISUPDATE-Zeile zeichnet einen FALSE-Wert auf.
METADATA$ROW_ID: Gibt die eindeutige und unveränderliche ID für die Zeile an, mit der Änderungen an bestimmten Zeilen im Laufe der Zeit verfolgt werden können.
Anforderungen an die Zugriffssteuerung¶
Eine Rolle, die zur Ausführung dieses SQL-Befehls verwendet wird, muss mindestens die folgenden Berechtigungen haben:
Streams auf Standardtabellen:
Objekt
Berechtigung
Anmerkungen
Schema
CREATE STREAM
Tabelle
SELECT
Wenn die Änderungsverfolgung für die Quelltabelle nicht aktiviert wurde (mit ALTER TABLE … SET CHANGE_TRACKING = TRUE), kann nur der Tabelleneigentümer (d. h. die Rolle mit der Berechtigung OWNERSHIP für die Tabelle) den ursprünglichen Stream für die Tabelle erstellen. Beim Erstellen des ersten Streams wird automatisch die Änderungsverfolgung auf der Tabelle aktiviert.
Beachten Sie, dass für die Bearbeitung eines Objekts in einem Schema auch die Berechtigung USAGE für die übergeordnete Datenbank und das Schema erforderlich ist.
Streams auf Ansichten:
Objekt
Berechtigung
Anmerkungen
Schema
CREATE STREAM
Ansicht
SELECT
Wenn die Änderungsverfolgung für die Quellansicht und deren zugrunde liegenden Tabellen nicht aktiviert wurde, kann nur eine Rolle, die über die Berechtigung OWNERSHIP für die Ansicht und den Eigentümer der zugrunde liegenden Tabellen verfügt, den ursprünglichen Stream auf der Ansicht erstellen. Beim Erstellen des ersten Streams wird automatisch die Änderungsverfolgung auf der Tabelle aktiviert. Eine Anleitung zum Aktivieren der Änderungsverfolgung für eine Ansicht und deren zugrunde liegende Tabellen finden Sie unter Aktivieren der Änderungsverfolgung für Ansichten und zugrunde liegende Tabellen. Beachten Sie, dass durch Aktivierung der Änderungsverfolgung die zugrunde liegenden Tabellen so lange gesperrt werden, solange die Änderungsverfolgung aktiviert ist. Sperren auf den zugrunde liegenden Objekten können bei DDL/DML-Operationen mit diesen Objekten eine Latenz verursachen. Weitere Informationen dazu finden Sie unter Ressourcensperrung.
Beachten Sie, dass für die Bearbeitung eines Objekts in einem Schema auch die Berechtigung USAGE für die übergeordnete Datenbank und das Schema erforderlich ist.
Streams auf Verzeichnistabellen:
Objekt
Berechtigung
Anmerkungen
Schema
CREATE STREAM
Stagingbereich
USAGE (externer Stagingbereich) oder READ (interner Stagingbereich)
Beachten Sie, dass für die Bearbeitung eines Objekts in einem Schema auch die Berechtigung USAGE für die übergeordnete Datenbank und das Schema erforderlich ist.
Streams auf externen Tabellen:
Objekt
Berechtigung
Anmerkungen
Schema
CREATE STREAM
Externe Tabelle
SELECT
Beachten Sie, dass für die Bearbeitung eines Objekts in einem Schema auch die Berechtigung USAGE für die übergeordnete Datenbank und das Schema erforderlich ist.
Eine Anleitung zum Erstellen einer kundenspezifischen Rolle mit einem bestimmten Satz von Berechtigungen finden Sie unter Erstellen von kundenspezifischen Rollen.
Allgemeine Informationen zu Rollen und Berechtigungen zur Durchführung von SQL-Aktionen auf sicherungsfähigen Objekten finden Sie unter Übersicht zur Zugriffssteuerung.
Nutzungshinweise¶
Ein Stream kann mehrmals abgefragt werden, um mehrere Objekte in derselben Transaktion zu aktualisieren, und er gibt dieselben Daten zurück.
Die Stream-Position (d. h. der Offset) wird erhöht, wenn der Stream in einer DML -Anweisung verwendet wird. Die Position wird am Ende der Transaktion auf den Anfangszeitstempel der Transaktion aktualisiert. Der Stream beschreibt Änderungsdatensätze, die an der aktuellen Position des Streams beginnen und mit dem aktuellen Transaktionszeitstempel enden.
Um sicherzustellen, dass verschiedene Anweisungen auf dieselben Änderungsdatensätze im Stream zugreifen, müssen Sie sie mit einer expliziten Transaktionsanweisung (BEGIN .. COMMIT) umgeben. Eine explizite Transaktion sperrt den Stream, sodass DML-Aktualisierungen des Quellobjekts erst nach dem Commit der Transaktion an den Stream gemeldet werden.
Bei Streams gibt es keine Fail-safe-Frist oder Time Travel-Aufbewahrungsfrist. Wenn ein Stream gelöscht wird, können die Metadaten in diesen Objekten nicht wiederhergestellt werden.
Streams auf freigegebenen Tabellen:
Die Aufbewahrungsfrist für eine Quelltabelle wird nicht automatisch verlängert, um das Veralten der Streams auf der Tabelle zu verhindern.
Standardstreams können keine Änderungsdaten für Geodaten abrufen. Es wird empfohlen, auf Objekten, die Geodaten enthalten, Nur-Anfügen-Streams zu erstellen.
Streams auf Ansichten:
Das Erstellen des ersten Streams einer Ansicht mit der Rolle des Ansichtseigentümers (d. h. der Rolle mit OWNERSHIP-Berechtigung für die Ansicht) ermöglicht die Änderungsverfolgung für die Ansicht. Wenn dieselbe Rolle auch Eigentümer der zugrunde liegenden Tabellen ist, wird die Änderungsverfolgung auch für die Tabellen aktiviert. Wenn die Rolle nicht über die Berechtigung OWNERSHIP sowohl für die Ansicht als auch für die zugrunde liegenden Tabellen erhalten hat, muss die Änderungsverfolgung für die entsprechenden Objekte manuell aktiviert werden. Eine Anleitung dazu finden Sie unter Aktivieren der Änderungsverfolgung für Ansichten und zugrunde liegende Tabellen.
Je nach Anzahl der Verknüpfungen (Joins) in einer Ansicht kann eine einzige Änderung in den zugrunde liegenden Tabellen zu einer großen Anzahl von Änderungen in der Stream-Ausgabe führen.
Jeder Stream auf einer bestimmten Ansicht bricht ab, wenn die Quellansicht oder die zugrunde liegenden Tabellen gelöscht oder neu erstellt werden (unter Verwendung von CREATE OR REPLACE VIEW).
Alle Streams auf einer sicheren Ansicht wenden die Einschränkungen der sicheren Ansicht an.
Wenn der Eigentümer einer nicht sicheren Ansicht (d. h. die Rolle mit OWNERSHIP-Berechtigung für die Ansicht) diese in eine sichere Ansicht ändert (unter Verwendung von ALTER VIEW … SET SECURE), werden für jeden Stream auf der Ansicht automatisch die Einschränkungen der sicheren Ansicht durchgesetzt.
Außerdem wird die Aufbewahrungsfrist für die zugrunde liegenden Tabellen nicht automatisch verlängert, um zu verhindern, dass die Streams auf der sicheren Ansicht veralten.
Streams, die auf Ansichten basieren, bei denen die Ansicht nicht deterministische Funktionen verwendet, können zu nicht deterministischen Ergebnissen führen.
So sind beispielsweise die Ergebnisse von Kontextfunktionen wie CURRENT_DATE und CURRENT_USER nicht deterministisch. Die Ergebnisse von Datengenerierungsfunktionen wie RANDOM sind ebenfalls nicht deterministisch. Wenn eine Ansicht eine nicht deterministische Funktion enthält, dann ist jeder Stream auf dieser Ansicht kein konstanter Snapshot der Funktionsausgabe. Stattdessen kann sich der Wert im Stream bei Ausführung einer Abfrage ändern.
Wir empfehlen, dass Sie sicherstellen, dass der Nicht-Determinismus in den Ergebnissen einer Ansicht keine Auswirkungen auf die Korrektheit der Stream-Abfrageergebnisse hat.
Ein Beispiel dazu finden Sie unter Stream auf einer Ansicht, die eine nicht deterministische SQL-Funktion aufruft.
Streams auf Verzeichnistabellen: Die METADATA$ROW_ID-Spaltenwerte in der Stream-Ausgabe sind leer.
Metadaten:
Achtung
Kunden müssen sicherstellen, dass bei der Nutzung des Snowflake-Dienstes keine personenbezogenen Daten (außer für ein Objekt „Benutzer“), sensible Daten, exportkontrollierte Daten oder andere regulierte Daten als Metadaten eingegeben werden. Weitere Informationen dazu finden Sie unter Metadatenfelder in Snowflake.
CREATE OR REPLACE <Objekt>-Anweisungen sind atomar. Das heißt, wenn ein Objekt ersetzt wird, erfolgt das Löschen des alten Objekts und das Erstellen des neuen Objekts in einer einzigen Transaktion.
Beispiele¶
Erstellen eines Tabellenstreams¶
Erstellen Sie einen Stream für die Tabelle mytable
:
CREATE STREAM mystream ON TABLE mytable;
Verwenden von Time Travel mit der Quelltabelle¶
Erstellen Sie einen Stream für die Tabelle mytable
so, wie sie vor dem Datum und der Uhrzeit im angegebenen Zeitstempel existierte:
CREATE STREAM mystream ON TABLE mytable BEFORE (TIMESTAMP => TO_TIMESTAMP(40*365*86400));
Erstellen Sie einen Stream für die Tabelle mytable
so, wie sie genau zum Datum und zur Uhrzeit des angegebenen Zeitstempels existierte:
CREATE STREAM mystream ON TABLE mytable AT (TIMESTAMP => TO_TIMESTAMP_TZ('02/02/2019 01:02:03', 'mm/dd/yyyy hh24:mi:ss'));
Erstellen Sie einen Stream für die Tabelle mytable
so, wie sie vor 5 Minuten existiert hat:
CREATE STREAM mystream ON TABLE mytable AT(OFFSET => -60*5);
Erstellen Sie einen Stream in der Tabelle mytable
mit demselben Offset, den auch der vorhandene Stream oldstream
in derselben Quelltabelle hat:
CREATE STREAM mystream ON TABLE mytable AT(STREAM => 'oldstream');
Erstellen Sie den vorhandenen Stream mystream
neu, und behalten Sie dessen aktuellen Offset:
CREATE OR REPLACE STREAM mystream ON TABLE mytable AT(STREAM => 'mystream');
Erstellen Sie einen Stream für die Tabelle mytable
mit Transaktionen bis zu, aber ohne Änderungen, die von der angegebenen Transaktion vorgenommen wurden:
CREATE STREAM mystream ON TABLE mytable BEFORE(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');
Erstellen eines Streams in einer Einzeltabellenansicht¶
Erstellen Sie einen Stream für die Tabelle myview
:
CREATE STREAM mystream ON VIEW myview;
Weitere Beispiele finden Sie unter Stream-Beispiele.
Erstellen eines Nur-Einfügen-Streams auf einer externen Tabelle¶
Erstellen Sie einen Stream auf einer externen Tabelle, und fragen Sie die Datensätze zur Änderungsdatenerfassung des Datenstreams ab, mit denen die Datensätze verfolgt werden, die zu den Metadaten der externen Tabelle hinzugefügten wurden:
-- 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" | | | | | | | | |
| } | | | | | | | | |
+----------------------------------------+------------+-------------------------+---------+-------+-----------------+-------------------+-----------------+---------------------------------------------+
Erstellen eines Standard-Streams in einer Verzeichnistabelle¶
Erstellen Sie einen Stream in der Verzeichnistabelle eines Stagingbereichs namens mystage
:
CREATE STREAM dirtable_mystage_s ON STAGE mystage;
Aktualisieren Sie die Metadaten der Verzeichnistabelle manuell, um den Stream zu füllen:
ALTER STAGE mystage REFRESH;
Fragen Sie den Stream ab, nachdem eine oder mehrere Dateien nach dem letzten Offset für den Stream zum Stagingbereich hinzugefügt wurden:
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 | |
+-------------------+--------+-------------------------------+----------------------------------+----------------------------------+-------------------------------------------------------------------------------------------+-----------------+-------------------+-----------------+