Kategorien:

Datenpipeline DDL

CREATE TASK

Erstellt eine neue Aufgabe im aktuellen/angegebenen Schema oder ersetzt eine bestehende Aufgabe.

Dieser Befehl unterstützt auch die folgende Variante:

  • CREATETASK … CLONE (erstellt einen Klon einer bestehenden Aufgabe)

Siehe auch:

ALTER TASK, DROP TASK, SHOW TASKS

Unter diesem Thema:

Syntax

CREATE [ OR REPLACE ] TASK [ IF NOT EXISTS ] <name>
  WAREHOUSE = <string>
  [ SCHEDULE = '{ <num> MINUTE | USING CRON <expr> <time_zone> }' ]
  [ <session_parameter> = <value> [ , <session_parameter> = <value> ... ] ]
  [ USER_TASK_TIMEOUT_MS = <num> ]
  [ COPY GRANTS ]
  [ COMMENT = '<string_literal>' ]
  [ AFTER <string> ]
[ WHEN <boolean_expr> ]
AS
  <sql>

Syntaxvariante

CREATE TASK … CLONE

Erstellt eine neue Aufgabe mit denselben Parameterwerten:

CREATE [ OR REPLACE ] TASK <name> CLONE <source_task>
  [ COPY GRANTS ]
  [ ... ]

Weitere Details dazu finden Sie unter CREATE <Objekt> … CLONE.

Erforderliche Parameter

Name

Zeichenfolge, die den Bezeichner (d. h. den Namen) für die Aufgabe angibt. Der Wert muss für das Schema, in dem die Aufgabe 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ß- und Kleinschreibung zu beachten.

Weitere Details dazu finden Sie unter Anforderungen an Bezeichner.

WAREHOUSE = Zeichenfolge

Gibt das virtuelle Warehouse an, das zum Ausführen der Aufgabe verwendet wird.

SQL

Eine einzelne SQL-Anweisung oder ein Aufruf einer gespeicherten Prozedur, die im Rahmen einer Aufgabenbearbeitung ausgeführt wird.

Bemerkung

Die SQL-Anweisung oder die gespeicherte Prozedur muss eigenständig ausführbar sein. Wir empfehlen dringend, dass Sie überprüfen, ob sql wie erwartet ausgeführt wird, bevor Sie die Aufgabe erstellen. Aufgaben sollen SQL-Anweisungen und gespeicherte Prozeduren automatisieren, die bereits gründlich getestet wurden.

Optionale Parameter

SCHEDULE ... gibt den Zeitplan für die regelmäßige Ausführung der Aufgabe an:

Bemerkung

Ein Zeitplan kann nicht für untergeordnete Aufgaben in einem einfachen Aufgabenbaum angegeben werden (d. h. Aufgaben, für die mit dem Parameter AFTER eine Vorgängeraufgabe festgelegt wurde).

  • USING CRON Ausdruck Zeitzone

    Gibt einen Cron-Ausdruck und eine Zeitzone für die regelmäßige Ausführung der Aufgabe an. Unterstützt eine Teilmenge der Standardsyntax des Cron-Dienstprogramms.

    Eine Liste der Zeitzonen finden Sie unter List of tz database time zones (Liste der Zeitzonen aus der IANA-Zeitzonen-Datenbank) (Wikipedia).

    Der Cron-Ausdruck besteht aus folgenden Feldern:

    # __________ minute (0-59)
    # | ________ hour (0-23)
    # | | ______ day of month (1-31, or L)
    # | | | ____ month (1-12, JAN-DEC)
    # | | | | _ day of week (0-6, SUN-SAT, or L)
    # | | | | |
    # | | | | |
      * * * * *
    

    Folgende Sonderzeichen werden unterstützt:

    *

    Platzhalter. Gibt jedes vorkommende Feld an.

    L

    Steht für „last“ (letzte). Bei Verwendung im Feld Wochentag können Sie Konstrukte wie „den letzten Freitag“ („5L“) eines bestimmten Monats angeben. Im Feld Tag des Monats wird der letzte Tag des Monats angegeben.

    /n

    Gibt die n-te Instanz einer bestimmten Zeiteinheit an. Wenn beispielsweise im Monatsfeld 4/3 angegeben ist, ist die Aufgabe für April, Juli und Oktober geplant (d. h. alle 3 Monate, beginnend mit dem 4. Monat des Jahres).

    Bemerkung

    • Der Cron-Ausdruck wird derzeit nur für die angegebene Zeitzone ausgewertet. Durch Ändern des TIMEZONE-Parameterwerts für das Konto (oder Festlegen des Werts auf Benutzer- oder Sitzungsebene) wird die Zeitzone für die Aufgabe nicht geändert.

    • Der Cron-Ausdruck definiert alle gültigen Ausführungszeiten für die Aufgabe. Snowflake versucht, eine Aufgabe basierend auf diesem Zeitplan auszuführen. Eine gültige Laufzeit wird jedoch übersprungen, wenn eine vorherige Laufzeit nicht vor dem Start der nächsten gültigen Laufzeit abgeschlossen wurde.

    • Wenn sowohl ein bestimmter Tag des Monats als auch ein bestimmter Wochentag im Cron-Ausdruck enthalten sind, wird die Aufgabe an Tagen geplant, die entweder dem Tag des Monats oder dem Wochentag entsprechen. Beispielsweise plant SCHEDULE = 'USING CRON 0 0 10-20 * TUE,THU UTC' eine Aufgabe um 0AM an jedem 10. bis 20. Tag des Monats und auch an jedem Dienstag oder Donnerstag außerhalb dieser Daten.

  • Zahl MINUTE

    Gibt ein Intervall (in Minuten) für die Wartezeit an, die zwischen Ausführungen der Aufgabe eingefügt wird. Akzeptiert nur positive ganze Zahlen.

    Unterstützt auch die Zahl M-Syntax.

    Um Mehrdeutigkeiten zu vermeiden, wird in folgenden Fällen eine Basisintervallzeit festgelegt:

    Die Basisintervallzeit startet den Intervallzähler ab der aktuellen Uhrzeit. Wenn beispielsweise ein INTERVAL-Wert von 10 festgelegt ist und die Aufgabe um 9:03 Uhr aktiviert wird, wird die Aufgabe um 9:13 Uhr, 9:23 Uhr usw. ausgeführt. Beachten Sie, dass wir uns nach besten Kräften bemühen, absolute Präzision sicherzustellen, aber nur garantieren, dass Aufgaben nicht vor ihrem festgelegten Intervall ausgeführt werden (im aktuellen Beispiel könnte es sein, dass die Aufgabe erst 9:14 Uhr ausgeführt wird, aber definitiv nicht 9:12 Uhr).

Sitzungsparameter = Wert [ , Sitzungsparameter = Wert ... ]

Gibt eine durch Kommas getrennte Liste von Sitzungsparametern an, die für die Sitzung festgelegt werden sollen, wenn die Aufgabe ausgeführt wird. Eine Aufgabe unterstützt alle Sitzungsparameter. Die vollständige Liste finden Sie unter Sitzungsparameter.

USER_TASK_TIMEOUT_MS = Zahl

Gibt das Zeitlimit für die einzelne Ausführung der Aufgabe an, bevor das Zeitlimit überschritten wird (in Millisekunden).

Bemerkung

Bevor Sie das Zeitlimit für eine Aufgabe erheblich erhöhen, sollten Sie prüfen, ob die von der Aufgabe initiierte SQL-Anweisung optimiert werden kann (entweder durch Umschreiben der Anweisung oder mithilfe einer gespeicherten Prozedur) oder ob die Warehouse-Größe erhöht werden sollte.

Werte: 086400000 (1 Tag)

Standard: 3600000 (1 Stunde)

COPY GRANTS

Gibt an, dass die Zugriffsberechtigungen aus der Originalaufgabe beibehalten werden, wenn eine neue Aufgabe mit einer der folgenden CREATE TASK-Varianten erstellt wird:

  • CREATE OR REPLACE TASK

  • CREATE TASK … CLONE

Der Parameter kopiert alle Berechtigungen, mit Ausnahme von OWNERSHIP, aus der bestehenden Aufgabe in die neue Aufgabe. Standardmäßig ist die Rolle, die den Befehl CREATE TASK ausführt, Eigentümer der neuen Aufgabe.

Anmerkung:

  • Wenn die CREATE TASK-Anweisung auf mehr als eine Aufgabe verweist (z. B. create or replace task t1 clone t2;), gibt die COPY GRANTS-Klausel der zu ersetzenden Aufgabe den Vorrang.

  • Die SHOW GRANTS-Ausgabe für die Ersetzungsaufgabe listet den Berechtigten für die kopierten Berechtigungen als Rolle auf, die die CREATE TASK-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 TASK (d. h. innerhalb derselben Transaktion).

Bemerkung

Dieser Parameter wird derzeit nicht unterstützt.

COMMENT = 'Zeichenfolgenliteral'

Gibt einen Kommentar für die Aufgabe an.

Standard: Kein Wert

AFTER Zeichenfolge

Gibt die Vorgängeraufgabe für die aktuelle Aufgabe an. Wenn die Ausführung der Vorgängeraufgabe erfolgreich abgeschlossen wurde, wird diese Aufgabe (nach einer kurzen Verzögerung) ausgelöst.

Mit diesem Parameter können Sie einen einfachen Aufgabenstrukturbaum definieren, d. h. einen Satz von Aufgaben, die nach ihren Abhängigkeiten organisiert sind. In diesem Zusammenhang ist eine Baumstruktur eine Reihe von Aufgaben, die mit einer geplanten Stammaufgabe beginnen und durch ihre Abhängigkeiten miteinander verbunden sind.

Bemerkung

  • Die Stammaufgabe in der Baumstruktur sollte einen definierten Zeitplan haben. Jede der anderen Aufgaben in der Baumstruktur hat eine definierte Vorgängeraufgabe (d. h. eine Aufgabe, die mit dem Parameter AFTER angegeben wurde), um sie miteinander zu verknüpfen.

  • Eine Aufgabe kann genau eine Vorgängeraufgabe haben. Eine Aufgabe kann jedoch maximal 100 untergeordnete Aufgaben haben (d. h. andere Aufgaben, die die Aufgabe als Vorgänger identifizieren). Darüber hinaus ist ein einfacher Aufgabenstrukturbaum auf maximal 1.000 Aufgaben insgesamt (einschließlich der Stammaufgabe) beschränkt, die entweder fortgesetzt (d. h. im Status „Gestartet“) oder angehalten wurden.

    Beispielsweise ist die Aufgabe T2 auf eine einzelne Vorgängeraufgabe beschränkt, z. B. T1. T1 kann jedoch als Vorgängeraufgabe für die Aufgaben T2, T3, T4 usw. dienen.

  • Alle Aufgaben einer einfachen Baumstruktur müssen denselben Aufgabeneigentümer haben (d. h. eine einzelne Rolle muss über die Berechtigung OWNERSHIP für alle Aufgaben in der Baumstruktur verfügen).

  • Alle Aufgaben in einer einfachen Baumstruktur müssen im gleichen Schema vorhanden sein.

  • Die Stammaufgabe in einem Aufgabenstrukturbaum muss angehalten werden, bevor eine beliebige Aufgabe im Strukturbaum neu erstellt wird (mithilfe der CREATE OR REPLACE TASK-Syntax) oder eine untergeordnete Aufgabe hinzugefügt wird (mithilfe von CREATE TASK … AFTER).

  • Wenn eine Aufgabe in einer Baumstruktur geklont wird, wird die Rolle, die die Aufgabe klont, standardmäßig zum neuen Eigentümer.

    • Wenn der Eigentümer der ursprünglichen Aufgabe den Klon erstellt, behält der Aufgabenklon die Verknüpfung zwischen der Aufgabe und der Vorgängeraufgabe bei. Dies bedeutet, dass dieselbe Vorgängeraufgabe sowohl die ursprüngliche Aufgabe als auch den Aufgabenklon auslöst.

    • Wenn eine andere Rolle den Klon erstellt, kann der Aufgabenklon einen Zeitplan haben, aber keinen Vorgänger.

  • Konten sind derzeit auf maximal 10.000 fortgesetzte Aufgaben beschränkt.

  • Aktuelle Einschränkungen:

    • Snowflake sichert zu, dass höchstens eine Instanz einer Aufgabe mit einem definierten Zeitplan zu einem bestimmten Zeitpunkt ausgeführt wird. Für Aufgaben mit einer definierten Vorgängeraufgabe können wir jedoch nicht dieselbe Zusicherung bieten.

WHEN Boolescher_Ausdruck

Gibt einen booleschen SQL-Ausdruck an. Es werden mehrere mit AND/OR verknüpfte Bedingungen unterstützt. Wenn eine Aufgabe ausgelöst wird (basierend auf ihrer SCHEDULE- oder AFTER-Einstellung), prüft sie die Bedingungen des Ausdrucks, um zu bestimmen, ob sie ausgeführt werden soll. Wenn die Bedingungen des Ausdrucks nicht erfüllt sind, überspringt die Aufgabe die aktuelle Ausführung. Alle Aufgaben, die diese Aufgabe als Vorgänger identifizieren, werden ebenfalls nicht ausgeführt.

Derzeit wird nur die folgende Funktion für die Auswertung im SQL-Ausdruck unterstützt:

SYSTEM$STREAM_HAS_DATA

Gibt an, ob ein angegebener Stream Änderungsnachverfolgungsdaten enthält. Wird verwendet, um den aktuellen Aufgabenlauf zu überspringen, wenn der Stream keine Änderungsdaten enthält.

Wenn das Ergebnis FALSE ist, wird die Aufgabe nicht ausgeführt.

Das Überprüfen der Bedingungen des WHEN-Ausdrucks erfordert kein virtuelles Warehouse, verwendet jedoch einen geringen Verarbeitungsaufwand in der Clouddienstschicht. Eine nominale Gebühr fällt jedes Mal an, wenn eine Aufgabe ihre WHEN-Bedingung auswertet und nicht ausgeführt wird. Die Gebühren fallen jedes Mal an, sobald die Aufgabe ausgelöst wird, bis sie ausgeführt wird. Zu diesem Zeitpunkt wird die Gebühr in Snowflake-Credits umgewandelt und der Computeressourcennutzung für die Ausführung der Aufgabe hinzugefügt.

Nutzungshinweise

  • Das Ausführen dieses Befehls erfordert die folgenden Berechtigungen:

    • CREATE TASK für das Schema.

    • USAGE auf dem Warehouse in der Aufgabendefinition.

    Der Aufgabeneigentümer (d. h. die Rolle mit OWNERSHIP-Berechtigung für die Aufgabe) muss die globale Berechtigung EXECUTE TASK haben, damit Aufgaben ausgeführt werden können. Durch das Widerrufen der Berechtigung EXECUTE TASK für eine Rolle wird verhindert, dass alle nachfolgenden Aufgaben unter dieser Rolle gestartet werden.

    Wir empfehlen, dass Sie eine SQL-Anweisung ausführen oder eine gespeicherte Prozedur aufrufen, bevor Sie in eine Aufgabendefinition einfügen. Führen Sie diesen Schritt in der Rolle als Aufgabeneigentümer aus, um sicherzustellen, dass die Rolle über alle erforderlichen Berechtigungen für alle Objekte verfügt, auf die von SQL verwiesen wird.

  • Nach dem Erstellen einer Aufgabe müssen Sie erst ALTER TASK … RESUME ausführen, bevor die Aufgabe basierend auf den in der Aufgabendefinition angegebenen Parametern ausgeführt wird. Beachten Sie, dass Konten derzeit auf maximal 10.000 fortgesetzte Aufgaben beschränkt sind.

    Wenn eine Aufgabe geklont wird, wird die Ausführung der geklonten Aufgabe standardmäßig angehalten und muss mit demselben Befehl explizit aktiviert werden.

  • Aufgaben werden mit der Rolle ausgeführt, die die OWNERSHIP-Berechtigung für die Aufgabe besitzt. SQL-Anweisungen, die von der Aufgabe ausgeführt werden, können nur auf Snowflake-Objekten ausgeführt werden, für die die Rolle die erforderlichen Berechtigungen besitzt.

  • Standardmäßig wird eine DML-Anweisung, die ohne explizites Starten einer Transaktion ausgeführt wird, bei Erfolg automatisch committet oder bei einem Fehler am Ende der Anweisung zurückgesetzt. Dieses Verhalten wird Autocommit genannt und mit dem Parameter AUTOCOMMIT gesteuert. Dieser Parameter muss auf TRUE gesetzt sein. Wenn der Parameter AUTOCOMMIT auf Kontoebene auf FALSE eingestellt ist, legen Sie den Parameter für die individuelle Aufgabe auf TRUE fest (mit ALTER TASK … SET AUTOCOMMIT = TRUE). Andernfalls schlägt jede von der Aufgabe ausgeführte DML-Anweisung fehl.

  • Mehrere Aufgaben, die Änderungsdaten aus einem einzelnen Tabellenstream verwenden, rufen verschiedene Deltas ab. Wenn eine Aufgabe die Änderungsdaten in einem Stream mithilfe einer DML-Anweisung verarbeitet, erhöht der Stream den Offset. Die Änderungsdaten stehen für die nächste Aufgabe nicht mehr zur Verfügung. Derzeit wird empfohlen, dass die Änderungsdaten aus einem Stream nur durch eine einzige Aufgabe verarbeitet werden. Für dieselbe Tabelle können mehrere Streams erstellt und von verschiedenen Aufgaben verarbeitet werden.

  • Bei Verwendung der Syntax CREATE OR REPLACE wird die vorhandene Aufgabe gelöscht und unter Verwendung der angegebenen Definition neu erstellt. Jede aktuelle Ausführung der Task (d. h. ein Ausführung mit dem Status EXECUTING in der TASK_HISTORY-Ausgabe) wird abgeschlossen. Führen Sie die Funktion SYSTEM$USER_TASK_CANCEL_ONGOING_EXECUTIONS aus, um die Ausführung der angegebenen Aufgabe abzubrechen.

Beispiele

Erstellen Sie eine Aufgabe, bei der der aktuelle Zeitstempel stündlich in eine Tabelle eingefügt wird, beginnend Sonntag 9:00 Uhr bis Sonntag 17:00 Uhr (Zeitzone Amerika/Los Angeles) Die Aufgabe legt den Parameter TIMESTAMP_INPUT_FORMAT für die Sitzung fest, in der die Aufgabe ausgeführt wird:

CREATE TASK mytask_hour
  WAREHOUSE = mywh
  SCHEDULE = 'USING CRON 0 9-17 * * SUN America/Los_Angeles'
  TIMESTAMP_INPUT_FORMAT = 'YYYY-MM-DD HH24'
AS
INSERT INTO mytable(ts) VALUES(CURRENT_TIMESTAMP);

Zusätzliche Zeitbeispiele

SCHEDULE-Wert

Beschreibung

* * * * * UTC

Jede Minute. UTC-Zeitzone.

0 2 * * * UTC

Jede Nacht um 2:00 Uhr. UTC-Zeitzone.

0 5,17 * * * UTC

Zweimal täglich um 5:00 Uhr und um 17:00 Uhr (jeweils zur vollen Stunde). UTC-Zeitzone.

30 2 L 6 * UTC

Im Juni, am letzten Tag des Monats, um 2:30 Uhr. UTC-Zeitzone.

Erstellen Sie eine Aufgabe, die alle 5 Minuten den aktuellen Zeitstempel in eine Tabelle einfügt:

CREATE TASK mytask_minute
  WAREHOUSE = mywh
  SCHEDULE = '5 MINUTE'
AS
INSERT INTO mytable(ts) VALUES(CURRENT_TIMESTAMP);

Erstellen Sie eine Aufgabe, die alle 5 Minuten Änderungsnachverfolgungsdaten für INSERT-Operationen aus einem Stream in eine Tabelle einfügt. Die Aufgabe fragt den Stream mit der Funktion SYSTEM$STREAM_HAS_DATA ab, um festzustellen, ob Änderungsdaten vorhanden sind, und überspringt den aktuellen Lauf, wenn das Ergebnis FALSE lautet:

CREATE TASK mytask1
  WAREHOUSE = mywh
  SCHEDULE = '5 minute'
WHEN
  SYSTEM$STREAM_HAS_DATA('MYSTREAM')
AS
  INSERT INTO mytable1(id,name) SELECT id, name FROM mystream WHERE METADATA$ACTION = 'INSERT';

Erstellen Sie für die Aufgaben eine einfache Baumstruktur, indem Sie die vorhandene mytask1-Aufgabe als Vorgängeraufgabe angeben, die bei erfolgreicher Ausführung die neue mytask2-Aufgabe auslöst. Die neue Aufgabe fragt die Tabelle mytable ab und fügt die Abfrageergebnisse in eine weitere Tabelle ein:

CREATE TASK mytask2
  WAREHOUSE = mywh
  AFTER mytask1
AS
INSERT INTO mytable2(id,name) SELECT id, name FROM mytable1;

Erstellen Sie eine Aufgabe mit dem Namen my_copy_task, die stündlich eine gespeicherte Prozedur aufruft, um Daten aus der Tabelle mytable in den Stagingbereich mit dem Namen mystage zu entladen (mithilfe von COPY INTO <Speicherort>):

-- Create a stored procedure that unloads data from a table
-- The COPY statement in the stored procedure unloads data to files in a path identified by epoch time (using the Date.now() method)
create or replace procedure my_unload_sp()
  returns string not null
  language javascript
  as
  $$
    var my_sql_command = ""
    var my_sql_command = my_sql_command.concat("copy into @mystage","/",Date.now(),"/"," from mytable overwrite=true;");
    var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
    var result_set1 = statement1.execute();
  return my_sql_command; // Statement returned for info/debug purposes
  $$;

-- Create a task that calls the stored procedure every hour
create task my_copy_task
  warehouse = mywh
  schedule = '60 minute'
as
  call my_unload_sp();