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:

ALTER STREAM, DROP STREAM, SHOW STREAMS, DESCRIBE STREAM

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>' ]
Copy

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 ]
  [ ... ]
Copy

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 die COPY 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örtern OR 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, und File2 hinzugefügt wird, gibt der Stream nur Datensätze für die Zeilen in File2 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;
Copy

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));
Copy

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'));
Copy

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);
Copy

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');
Copy

Erstellen Sie den vorhandenen Stream mystream neu, und behalten Sie dessen aktuellen Offset:

CREATE OR REPLACE STREAM mystream ON TABLE mytable AT(STREAM => 'mystream');
Copy

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');
Copy

Erstellen eines Streams in einer Einzeltabellenansicht

Erstellen Sie einen Stream für die Tabelle myview:

CREATE STREAM mystream ON VIEW myview;
Copy

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"                   |            |                         |         |       |                 |                   |                 |                                             |
| }                                      |            |                         |         |       |                 |                   |                 |                                             |
+----------------------------------------+------------+-------------------------+---------+-------+-----------------+-------------------+-----------------+---------------------------------------------+
Copy

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;
Copy

Aktualisieren Sie die Metadaten der Verzeichnistabelle manuell, um den Stream zu füllen:

ALTER STAGE mystage REFRESH;
Copy

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             |                 |
+-------------------+--------+-------------------------------+----------------------------------+----------------------------------+-------------------------------------------------------------------------------------------+-----------------+-------------------+-----------------+
Copy