CREATE DYNAMIC TABLE¶
Erstellt eine dynamische Tabelle auf Basis einer angegebenen Abfrage.
Unter diesem Thema:
Syntax¶
CREATE [ OR REPLACE ] [ TRANSIENT ] DYNAMIC TABLE [ IF NOT EXISTS ] <name> (
-- Column definition
<col_name> <col_type>
[ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
[ COMMENT '<string_literal>' ]
-- Additional column definitions
[ , <col_name> <col_type> [ ... ] ]
)
TARGET_LAG = { '<num> { seconds | minutes | hours | days }' | DOWNSTREAM }
WAREHOUSE = <warehouse_name>
[ REFRESH_MODE = { AUTO | FULL | INCREMENTAL } ]
[ INITIALIZE = { ON_CREATE | ON_SCHEDULE } ]
[ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
[ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
[ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
[ COMMENT = '<string_literal>' ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
AS <query>
Syntaxvariante¶
CREATE DYNAMIC TABLE … CLONE¶
Erstellt eine neue dynamische Tabelle mit den gleichen Spaltendefinitionen und allen in der dynamischen Quelltabelle vorhandenen Daten, aber ohne die Daten tatsächlich zu kopieren. Diese Variante kann auch verwendet werden, um eine dynamische Tabelle zu einem bestimmten Zeitpunkt in der Vergangenheit zu klonen. Siehe Hinweise zum Klonen.
CREATE [ OR REPLACE ] [ TRANSIENT ] DYNAMIC TABLE <name>
CLONE <source_dynamic_table>
[ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ]
[
COPY GRANTS
TARGET_LAG = { '<num> { seconds | minutes | hours | days }' | DOWNSTREAM }
WAREHOUSE = <warehouse_name>
]
Wenn die dynamische Quelltabelle Gruppierungsschlüssel hat, dann hat auch die geklonte dynamische Tabelle Gruppierungsschlüssel. Standardmäßig wird Automatic Clustering für die neue Tabelle angehalten, auch wenn Automatic Clustering für die Quelltabelle nicht angehalten wurde.
Weitere Details zum Klonen finden Sie unter CREATE <Objekt> … CLONE.
CREATE DYNAMIC ICEBERG TABLE¶
Erzeugt eine neue dynamische Apache Iceberg™-Tabelle. Informationen zu Iceberg-Tabellen finden Sie unter Apache Iceberg™-Tabellen und CREATE ICEBERG TABLE (Snowflake als Iceberg-Katalog).
CREATE [ OR REPLACE ] DYNAMIC ICEBERG TABLE <name> (
-- Column definition
<col_name> <col_type>
[ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
[ COMMENT '<string_literal>' ]
-- Additional column definitions
[ , <col_name> <col_type> [ ... ] ]
)
TARGET_LAG = { '<num> { seconds | minutes | hours | days }' | DOWNSTREAM }
WAREHOUSE = <warehouse_name>
[ EXTERNAL_VOLUME = '<external_volume_name>' ]
[ CATALOG = 'SNOWFLAKE' ]
BASE_LOCATION = '<directory_for_table_files>'
[ REFRESH_MODE = { AUTO | FULL | INCREMENTAL } ]
[ INITIALIZE = { ON_CREATE | ON_SCHEDULE } ]
[ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
[ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
[ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
[ COMMENT = '<string_literal>' ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
AS <query>
Weitere Informationen zur Verwendung und zu Beschränkungen finden Sie unter Dynamische Apache Iceberg™-Tabellen erstellen.
Erforderliche Parameter¶
name
Gibt den Bezeichner (d. h. den Namen) für die dynamische Tabelle an. Dieser muss für das Schema, in dem die dynamische Tabelle 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.
TARGET_LAG = { num { seconds | minutes | hours | days } | DOWNSTREAM }
Gibt die Verzögerung für die dynamische Tabelle an:
'num seconds | minutes | hours | days'
Gibt die maximale Zeit an, die der Inhalt der dynamischen Tabelle hinter den Aktualisierungen der Quelltabellen zurückbleiben darf.
Beispiel:
Wenn die Daten in der dynamischen Tabelle nicht mehr als 5 Minuten zurückbleiben sollen, geben Sie
5 minutes
an.Wenn die Daten in der dynamischen Tabelle nicht mehr als 5 Stunden zurückbleiben sollen, geben Sie
5 hours
an.
Wenn die dynamische Tabelle von einer anderen dynamischen Tabelle abhängt, muss die minimale Zielverzögerung größer oder gleich der Zielverzögerung der dynamischen Tabelle sein, von der sie abhängt.
DOWNSTREAM
Gibt an, dass die dynamische Tabelle nur aktualisiert werden soll, wenn dynamische Tabellen, die von ihr abhängen, aktualisiert werden.
WAREHOUSE = warehouse_name
Gibt den Namen des Warehouses an, das die Computeressourcen für die Aktualisierung der dynamischen Tabelle bereitstellt.
Sie müssen eine Rolle verwenden, die über die USAGE- Berechtigung für dieses Warehouse verfügt, um die dynamische Tabelle erstellen zu können. Für Beschränkungen und weitere Informationen siehe Berechtigungen zum Erstellen einer dynamischen Tabelle.
AS query
Gibt die Abfrage an, deren Ergebnisse die dynamische Tabelle enthalten soll.
Optionale Parameter¶
TRANSIENT
Gibt an, dass die Tabelle transient ist.
Wie permanente dynamische Tabellen existieren auch transiente dynamische Tabellen, bis sie explizit gelöscht werden, und sind für jeden Benutzer mit den entsprechenden Berechtigungen verfügbar. Bei transienten dynamischen Tabellen werden die Daten nicht in einem Fail-safe-Speicher aufbewahrt, wodurch die Speicherkosten gesenkt werden können, insbesondere bei Tabellen, die häufig aktualisiert werden. Aufgrund dieser geringeren Dauerhaftigkeit eignen sich transiente dynamische Tabellen am besten für vorübergehende Daten, die nicht dasselbe Maß an Datensicherheit und Wiederherstellung benötigen wie permanente Tabellen.
Standard: Kein Wert. Wenn eine dynamische Tabelle nicht als
TRANSIENT
deklariert ist, ist sie permanent.REFRESH_MODE = { AUTO | FULL | INCREMENTAL }
Gibt den Aktualisierungsmodus für die dynamische Tabelle an.
Diese Eigenschaft kann nicht mehr geändert werden, nachdem Sie die dynamische Tabelle erstellt haben. Um die Eigenschaft zu ändern, erstellen Sie die dynamische Tabelle mit einem CREATE OR REPLACE DYNAMIC TABLE-Befehl neu.
AUTO
Wenn der Modus
AUTO
eingestellt ist, versucht das System standardmäßig, eine inkrementelle Aktualisierung durchzuführen. Wenn jedoch eine inkrementelle Aktualisierung nicht unterstützt wird oder keine gute Leistung zu erwarten ist, wählt die dynamische Tabelle stattdessen automatisch eine vollständige Aktualisierung. Weitere Informationen finden Sie unter Beschränkungen bei der inkrementellen Aktualisierung.Um den besten Modus für Ihren Anwendungsfall zu ermitteln, experimentieren Sie mit Aktualisierungsmodi und automatischen Empfehlungen. Um eine konsistente Verhaltensweise in allen Snowflake-Releases zu gewährleisten, legen Sie Aktualisierungsmodus aller dynamischen Tabellen explizit fest.
Informationen zum Verifizieren des Aktualisierungsmodus für Ihre dynamischen Tabellen finden Sie unter Aktualisierungsmodus von dynamischen Tabellen anzeigen.
FULL
Erzwingt eine vollständige Aktualisierung der dynamischen Tabelle, auch wenn die dynamische Tabelle inkrementell aktualisiert werden kann.
INCREMENTAL
Erzwingt eine inkrementelle Aktualisierung der dynamischen Tabelle. Wenn die Abfrage, die der dynamischen Tabelle zugrunde liegt, keine inkrementelle Aktualisierung ausführen kann, schlägt das Erstellen der dynamischen Tabelle fehl und es wird eine Fehlermeldung angezeigt.
Standard:
AUTO
INITIALIZE
Spezifiziert das Verhalten der erstmaligen Aktualisierung der dynamischen Tabelle. Diese Eigenschaft kann nicht mehr geändert werden, nachdem Sie die dynamische Tabelle erstellt haben. Um die Eigenschaft zu ändern, ersetzen Sie die dynamische Tabelle mit einem CREATE OR REPLACE DYNAMIC TABLE-Befehl.
ON_CREATE
Aktualisiert die dynamische Tabelle synchron beim Erstellen. Wenn diese Aktualisierung fehlschlägt, schlägt das Erstellen der dynamischen Tabelle fehl und es wird eine Fehlermeldung angezeigt.
ON_SCHEDULE
Aktualisiert die dynamische Tabelle bei der nächsten geplanten Aktualisierung.
Die dynamische Tabelle wird aufgefüllt, wenn der Aktualisierungsprozess ausgeführt wird. Beim Erstellen der dynamischen Tabelle werden keine Daten eingefügt. Wenn Sie versuchen, die Tabelle mit
SELECT * FROM DYNAMIC TABLE
abzufragen, wird möglicherweise der folgende Fehler angezeigt, da die erste geplante Aktualisierung noch nicht stattgefunden hat.Dynamic Table is not initialized. Please run a manual refresh or wait for a scheduled refresh before querying.
Standard:
ON_CREATE
COMMENT 'string_literal'
Gibt einen Kommentar für die Spalte an.
(Beachten Sie, dass Kommentare auf Spaltenebene oder auf Tabellenebene angegeben werden können. Die Syntax ist jeweils leicht unterschiedlich.)
MASKING POLICY = policy_name
Gibt die Maskierungsrichtlinie an, die für eine Spalte festgelegt werden soll.
column_list
Wenn Sie in der dynamischen Tabelle den Namen einer Spalte ändern oder einen Kommentar zu einer Spalte hinzufügen möchten, fügen Sie eine Spaltenliste ein die Spaltennamen und ggf. Kommentare zu den Spalten angibt. Sie müssen nicht die Datentypen der Spalten angeben.
Wenn eine der Spalten in der dynamischen Tabelle auf Ausdrücken basiert, z. B. nicht auf einfachen Spaltennamen, müssen Sie für jede Spalte in der dynamischen Tabelle einen Spaltennamen angeben. Beispielsweise sind die Spaltennamen im folgenden Fall erforderlich:
CREATE DYNAMIC TABLE product (pre_tax_profit, taxes, after_tax_profit) TARGET_LAG = '20 minutes' WAREHOUSE = mywh AS SELECT revenue - cost, (revenue - cost) * tax_rate, (revenue - cost) * (1.0 - tax_rate) FROM staging_table;
Sie können für jede Spalte einen optionalen Kommentar angeben. Beispiel:
CREATE DYNAMIC TABLE product (pre_tax_profit COMMENT 'revenue minus cost', taxes COMMENT 'assumes taxes are a fixed percentage of profit', after_tax_profit) TARGET_LAG = '20 minutes' WAREHOUSE = mywh AS SELECT revenue - cost, (revenue - cost) * tax_rate, (revenue - cost) * (1.0 - tax_rate) FROM staging_table;
CLUSTER BY ( expr [ , expr , ... ] )
Gibt eine oder mehrere Spalten oder Spaltenausdrücke in der dynamischen Tabelle als Gruppierungsschlüssel an. Bevor Sie Gruppierungsschlüssel für eine dynamische Tabelle angeben, sollten Sie sich erst mit Mikropartitionen vertraut machen. Weitere Informationen dazu finden Sie unter Grundlegendes zu Tabellenstrukturen in Snowflake.
Bei der Verwendung von Gruppierungsschlüsseln mit dynamischen Tabellen müssen Sie Folgendes beachten:
Spaltendefinitionen sind erforderlich und müssen in der Anweisung ausdrücklich angegeben werden.
Standardmäßig wird Automatic Clustering für die neue dynamische Tabelle nicht angehalten, auch wenn Automatic Clustering für die Quelltabelle angehalten wurde.
Gruppierungsschlüssel sind nicht für alle Tabellen vorgesehen oder empfehlenswert. Sie eignen sich vorrangig für sehr große Tabellen (z. B. im Multi-Terabyte-Bereich).
Durch die Angabe von CLUSTER BY werden die Daten beim Erstellen nicht geclustert. Stattdessen verlässt sich CLUSTER BY auf das Automatic Clustering, um die Daten im Laufe der Zeit neu zu clustern.
Weitere Informationen dazu finden Sie unter Gruppierungsschlüssel und geclusterte Tabellen.
Standard: Kein Wert (für die Tabelle ist kein Gruppierungsschlüssel definiert)
DATA_RETENTION_TIME_IN_DAYS = integer
Gibt die Aufbewahrungsfrist für die Tabelle an, sodass Time Travel-Aktionen (SELECT, CLONE) auf historischen Daten der dynamischen Tabelle ausgeführt werden können. Time Travel verhält sich bei dynamischen Tabellen genauso wie bei herkömmlichen Tabellen. Weitere Informationen dazu finden Sie unter Verstehen und Verwenden von Time Travel.
Eine ausführliche Beschreibung dieses Parameters auf Objektebene sowie weitere Informationen zu Objektparametern finden Sie unter Parameter.
Werte:
Standardausführung:
0
oder1
Enterprise Edition:
0
bis90
für permanente Tabellen0
oder1
für temporäre und transiente Tabellen
Standard:
Standardausführung:
1
Enterprise Edition (oder höher):
1
(es sei denn, es wurde ein anderer Standardwert auf Schema-, Datenbank- oder Kontoebene angegeben).
Bemerkung
Der Wert
0
deaktiviert Time Travel für die Tabelle.MAX_DATA_EXTENSION_TIME_IN_DAYS = integer
Ein Objektparameter, der die maximale Anzahl von Tagen festlegt, für die Snowflake die Datenaufbewahrungsfrist verlängern kann, um zu verhindern, dass die Streams in der dynamischen Tabelle veraltet sind.
Eine detaillierte Beschreibung dieses Parameters finden Sie unter MAX_DATA_EXTENSION_TIME_IN_DAYS.
COMMENT = 'string_literal'
Gibt einen Kommentar für die dynamische Tabelle an.
(Beachten Sie, dass Kommentare auf Spaltenebene oder auf Tabellenebene angegeben werden können. Die Syntax ist jeweils leicht unterschiedlich.)
Standard: Kein Wert.
COPY GRANTS
Gibt an, dass die Zugriffsrechte aus der ursprünglichen dynamischen Tabelle beibehalten werden, wenn eine neue dynamische Tabelle mit der Syntaxvariante CREATE DYNAMIC TABLE … CLONE erstellt wird.
Der Parameter kopiert alle Berechtigungen außer OWNERSHIP aus der bestehenden dynamischen Tabelle in die neue dynamische Tabelle. Die neue dynamische Tabelle übernimmt keine zukünftigen Berechtigungszuweisungen, die für den Objekttyp im Schema definiert wurden. Standardmäßig ist die Rolle, die die CREATE DYNAMIC TABLE-Anweisung ausführt, Eigentümer der neuen dynamischen Tabelle.
Wenn dieser Parameter nicht in der CREATE DYNAMIC TABLE-Anweisung enthalten ist, erbt die neue Tabelle keine expliziten Zugriffsrechte für die ursprüngliche dynamische Tabelle, übernimmt aber alle zukünftigen Berechtigungszuweisungen, die für den Objekttyp in dem Schema definiert wurden.
Hinweis:
Mit Datenfreigabe:
Wenn die bestehende dynamische Tabelle für ein anderes Konto freigegeben wurde, wird auch die neue dynamische Tabelle freigegeben.
Wenn die bestehende dynamische Tabelle für Ihr Konto als Datenverbraucher freigegeben wurde und der Zugriff auf andere Rollen im Konto weiter gewährt wurde (unter Verwendung von
GRANT IMPORTED PRIVILEGES
auf der übergeordneten Datenbank), wird auch der Zugriff auf die neue dynamische Tabelle gewährt.
Die SHOW GRANTS-Ausgabe für die neue dynamische Tabelle listet den Berechtigungsempfänger für die kopierten Berechtigungen als Rolle auf, die die CREATE TABLE-Anweisung ausgeführt hat, mit dem aktuellen Zeitstempel für den Zeitpunkt, an dem die Anweisung ausgeführt wurde.
Die SHOW GRANTS-Ausgabe für die neue dynamische Tabelle listet den Berechtigungsempfänger für die kopierten Berechtigungen als Rolle auf, die die CREATE TABLE-Anweisung ausgeführt hat, mit dem aktuellen Zeitstempel für den Zeitpunkt, an dem die Anweisung ausgeführt wurde.
Die Operation zum Kopieren von Berechtigungen erfolgt atomar im Befehl CREATE DYNAMIC TABLE (d. h. innerhalb derselben Transaktion).
ROW ACCESS POLICY policy_name ON ( col_name [ , col_name ... ] )
Gibt die Zeilenzugriffsrichtlinie an, die für eine dynamische Tabelle festgelegt werden soll.
TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )
Gibt den Namen des Tags und den Wert der Tag-Zeichenfolge an.
Der Tag-Wert ist immer eine Zeichenfolge, die maximale 256 Zeichen lang sein kann.
Weitere Informationen zur Angabe von Tags in einer Anweisung finden Sie unter Tag-Kontingente für Objekte und Spalten.
Anforderungen an die Zugriffssteuerung¶
Eine Rolle, die zur Ausführung dieses SQL-Befehls verwendet wird, muss mindestens die folgenden Berechtigungen haben:
Berechtigung |
Objekt |
Anmerkungen |
---|---|---|
CREATE DYNAMIC TABLE |
Schema, in dem die dynamische Tabelle erstellt werden soll. |
|
SELECT |
Tabellen, Ansichten und dynamische Tabellen, die für die neue dynamische Tabelle abgefragt werden sollen. |
|
USAGE |
Warehouse, das zum Aktualisieren der Tabelle verwendet werden soll. |
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 einer bestimmten Gruppe 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¶
Wenn Sie den Befehl CREATE DYNAMIC TABLE ausführen, wird die aktuell verwendete Rolle zum Eigentümer der dynamischen Tabelle. Diese Rolle wird verwendet, um Aktualisierungen der dynamischen Tabelle im Hintergrund auszuführen.
Sie können keine Änderungen am Schema vornehmen, nachdem Sie eine dynamische Tabelle erstellt haben.
Dynamische Tabellen werden aktualisiert, wenn sich die zugrunde liegenden Datenbankobjekte ändern. Die Änderungsverfolgung muss für alle zugrunde liegenden Objekte, die von einer dynamischen Tabelle verwendet werden, aktiviert sein. Siehe Änderungsverfolgung aktivieren.
Wenn Sie eine vorhandene dynamische Tabelle ersetzen möchten und dazu deren aktuelle Definition anzeigen müssen, rufen Sie die Funktion GET_DDL auf.
Die Verwendung von ORDER BY in der Definition einer dynamischen Tabelle kann zu Ergebnissen führen, die in einer unerwarteten Reihenfolge sortiert sind. Sie können ORDER BY verwenden, wenn Sie Ihre dynamische Tabelle abfragen, um sicherzustellen, dass die ausgewählten Zeilen in einer bestimmten Reihenfolge zurückgegeben werden.
Snowflake unterstützt nicht die Verwendung von ORDER BY zum Erstellung einer Ansicht, die aus einer dynamischen Tabelle erstellt wird.
Einige Ausdrücke, Klauseln und Funktionen werden derzeit in dynamischen Tabellen nicht unterstützt. Eine vollständige Liste finden Sie unter Bekannte Einschränkungen für dynamische Tabellen.
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.
Beispiele¶
Erstellen Sie eine dynamische Tabelle mit dem Namen product
:
CREATE OR REPLACE DYNAMIC TABLE product TARGET_LAG = '20 minutes' WAREHOUSE = mywh AS SELECT product_id, product_name FROM staging_table;
Im obigen Beispiel:
Die dynamische Tabelle materialisiert die Ergebnisse einer Abfrage der Spalten
product_id
undproduct_name
der Tabellestaging_table
.Die Zielverzögerungszeit beträgt 20 Minuten, was bedeutet, dass die Daten in der dynamischen Tabelle idealerweise nicht mehr als 20 Minuten älter sein sollten als die Daten in
staging_table
.Der automatische Aktualisierungsprozess nutzt die Computeressourcen im Warehouse
mywh
zum Aktualisieren der Daten in der dynamischen Tabelle.
Erstellen Sie eine dynamische Iceberg-Tabelle mit dem Namen product
, die aus my_iceberg_table
liest:
CREATE DYNAMIC ICEBERG TABLE product (date TIMESTAMP_NTZ, id NUMBER, content STRING) TARGET_LAG = '20 minutes' WAREHOUSE = mywh EXTERNAL_VOLUME = 'my_external_volume' CATALOG = 'SNOWFLAKE' BASE_LOCATION = 'my_iceberg_table' AS SELECT product_id, product_name FROM staging_table;
Erstellen Sie eine Tabelle mit einem mehrspaltigen Gruppierungsschlüssel:
CREATE DYNAMIC TABLE product (date TIMESTAMP_NTZ, id NUMBER, content VARIANT) TARGET_LAG = '20 minutes' WAREHOUSE = mywh CLUSTER BY (date, id) AS SELECT product_id, product_name FROM staging_table;
Klonen Sie eine dynamische Tabelle so, wie sie genau zu Datum und Uhrzeit des angegebenen Zeitstempels existierte:
CREATE DYNAMIC TABLE product_clone CLONE product AT (TIMESTAMP => TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'mm/dd/yyyy hh24:mi:ss'));