Zyklusstartaktionen für Budgets¶
Sie können ein Budget so konfigurieren, dass es automatisch eine gespeicherte Prozedur aufruft, wenn der Budgetzyklus neu gestartet wird. Der Zyklus beginnt neu, wenn die Ausgaben zu Beginn des monatlichen Zeitraums des Budgets auf 0 zurückgesetzt werden. So können Sie zu Beginn eines jeden Budgetzeitraums automatische Aktionen durchführen, wie z. B. Warehouses wiederaktivieren oder Benachrichtigungen über den neuen Zyklus versenden.
Zyklusstartaktionen sind besonders nützlich, um Aktionen zu bereinigen oder rückgängig zu machen, die durch kundenspezifische Aktionen während des vorherigen Budgetzyklus ausgelöst wurden.
Wenn Sie eine Zyklusstartaktion definieren, geben Sie die gespeicherte Prozedur an, die aufgerufen werden soll, und die Argumente, die an sie übergeben werden sollen. Die gespeicherte Prozedur wird jedes Mal automatisch ausgeführt, wenn der Budgetzyklus neu gestartet wird.
Anforderungen gespeicherter Prozeduren¶
Die gespeicherte Prozedur, die durch eine Zyklusstart-Aktion aufgerufen wird, muss die folgenden Anforderungen erfüllen:
Die Prozedur muss mit Eigentümerrechten ausgeführt werden, nicht mit Aufruferrechten. Weitere Informationen dazu finden Sie unter Erläuterungen zu gespeicherten Prozeduren mit Aufruferrechten und Eigentümerrechten.
Das Ausführen der Prozedur darf nicht länger als 30 Minuten dauern.
Die Prozedur dar kein OUTPUT-Argument aufweisen.
Gestalten Sie Ihre Prozedur also so, dass sie mehrere Aufrufe problemlos verarbeiten kann, ohne doppelte oder unbeabsichtigte Auswirkungen zu verursachen.
Die erforderlichen Argumente der Prozedur müssen einen der folgenden Datentypen aufweisen:
Nachdem Sie eine gespeicherte Prozedur erstellt haben, die diese Anforderungen erfüllt, müssen Sie der SNOWFLAKE-Anwendung die USAGE-Berechtigung für die Prozedur und deren übergeordnete Datenbank und Schema gewähren. Wenn der vollqualifizierte Name Ihrer gespeicherten Prozedur zum Beispiel code_db.sch1.reset_resources lautet, führen Sie die folgenden Befehle aus:
GRANT USAGE ON DATABASE code_db TO APPLICATION SNOWFLAKE;
GRANT USAGE ON SCHEMA code_db.sch1 TO APPLICATION SNOWFLAKE;
GRANT USAGE ON PROCEDURE code_db.sch1.reset_resources(STRING, STRING) TO APPLICATION SNOWFLAKE;
Bemerkung
Wenn Sie die gespeicherte Prozedur aktualisieren, nachdem Sie sie als eine Zyklusstartaktion hinzugefügt haben, müssen Sie der SNOWFLAKE-Anwendung die USAGE-Berechtigung für die Prozedur erneut gewähren.
Eine Zyklusstartaktion für ein Budget festlegen¶
Sie können eine Aktion zum Starten des Zyklus pro Budget festlegen (entweder das Kontobudget oder ein benutzerdefiniertes Budget). Eine Zyklusstartaktion besteht aus den folgenden Komponenten:
Gespeicherte Prozedur Ein Verweis auf die Prozedur, die aufgerufen werden soll, wenn der Budgetzyklus neu gestartet wird.
Argumente: Ein Array von Argumenten, das an die gespeicherte Prozedur übergeben werden soll.
Um eine Zyklusstartaktion für ein Budget festzulegen, rufen Sie die SET_CYCLE_START_ACTION-Methode für die Budgetinstanz auf. Der folgende Code stellt zum Beispiel eine Zyklusstartaktion ein, die die reset_resources gespeicherte Prozedur aufruft, wenn der Budgetzyklus neu gestartet wird:
CALL budget_db.sch1.my_budget!SET_CYCLE_START_ACTION(
SYSTEM$REFERENCE('PROCEDURE', 'code_db.sch1.reset_resources(STRING, STRING, STRING, STRING)'),
ARRAY_CONSTRUCT('my_int', 'admin@example.com', 'Budget Alert', 'New budget cycle started'));
Ein durchgängiges Beispiel, das das Erstellen der gespeicherten Prozedur enthält, die von der Zyklusstartaktion aufgerufen wird, finden Sie unter:ref:label-budget_cycle_start_actions_extended_example.
Eine Zyklusstartaktion aus einem Budget entfernen¶
Um eine Zyklusstartaktion aus einem Budget zu entfernen, rufen Sie die Methode REMOVE_CYCLE_START_ACTION für die Budgetinstanz auf:
CALL budget_db.sch1.my_budget!REMOVE_CYCLE_START_ACTION();
Erweitertes Beispiel¶
Das folgende Beispiel zeigt, wie Sie eine gespeicherte Prozedur schreiben, die durch eine Zyklusstartaktion aufgerufen wird, wie Sie die erforderlichen Berechtigungen für die Prozedur erteilen und dann die Zyklusstartaktion für das Budget festlegen.
Erstellen Sie eine gespeicherte Prozedur, die allen Anforderungen entspricht:
CREATE OR REPLACE PROCEDURE code_db.sch1.reset_resources( integration_name STRING, email_list STRING, email_subject STRING, email_content STRING) RETURNS STRING LANGUAGE JAVASCRIPT EXECUTE AS OWNER AS $$ // Re-enable warehouses or reset configurations here var enable_wh = "ALTER WAREHOUSE my_warehouse RESUME;"; var statement1 = snowflake.createStatement({sqlText: enable_wh}); statement1.execute(); // Send notification about new cycle var sql_command = "CALL SYSTEM$SEND_EMAIL('" + INTEGRATION_NAME + "', " + "'" + EMAIL_LIST + "', " + "'" + EMAIL_SUBJECT + "'," + "'" + EMAIL_CONTENT + "'" + ");"; var statement2 = snowflake.createStatement({sqlText: sql_command}); statement2.execute(); return "Resources reset for new budget cycle"; $$;
Erteilen Sie der SNOWFLAKE-Anwendung Berechtigungen für die gespeicherte Prozedur:
GRANT USAGE ON DATABASE code_db TO APPLICATION SNOWFLAKE; GRANT USAGE ON SCHEMA code_db.sch1 TO APPLICATION SNOWFLAKE; GRANT USAGE ON PROCEDURE code_db.sch1.reset_resources(STRING, STRING, STRING, STRING) TO APPLICATION SNOWFLAKE;
Legen Sie die Zyklusstartaktion für das Budget fest:
CALL budget_db.sch1.my_budget!SET_CYCLE_START_ACTION( SYSTEM$REFERENCE('PROCEDURE', 'code_db.sch1.reset_resources(STRING, STRING, STRING, STRING)'), ARRAY_CONSTRUCT('my_int', 'admin@example.com', 'Budget Cycle Restarted', 'New budget cycle has begun'));
Problembehandlung bei Zyklusstartaktionen¶
Wenn eine Zyklusstartaktion nicht wie erwartet funktioniert, verwenden Sie die folgenden Methoden, um das Problem zu diagnostizieren.
Die Ausführung von Zyklusstartaktionen überwachen¶
Snowflake verwendet eine Aufgabe, um die Zyklusstartaktion auszuführen. Diese Aufgabe heißt``_budget_cycle_start_task``. Um den Ausführungsstatus der Aktionsaufgabe „Zyklus starten“ für eine Budgetinstanz zu überprüfen, führen Sie die folgende Abfrage aus. Ersetzen Sie budget_name durch den Namen des Budgets.
SELECT th.*, ci.name AS budget_name
FROM SNOWFLAKE.ACCOUNT_USAGE.TASK_HISTORY th
JOIN SNOWFLAKE.ACCOUNT_USAGE.CLASS_INSTANCES ci
ON th.instance_id = ci.id
WHERE ci.class_name = 'BUDGET'
AND th.name ILIKE '_budget_cycle_start_task'
AND ci.name = '<budget_name>'
ORDER BY th.completed_time DESC
LIMIT 10;
Fehlersuche bei Aktionen, die nicht ausgelöst werden¶
Wenn eine Zyklusstartaktion nicht wie erwartet ausgelöst wird, prüfen Sie die folgenden allgemeinen Probleme. Angenommen, Ihr kundenspezifisches Budget lautet``budget_db.sch1.my_budget``.
Gespeicherte Prozedur oder Berechtigungen geändert
Überprüfen Sie, ob die von der Zyklusstartaktion aufgerufene gespeicherte Prozedur noch gültig ist und dass die SNOWFLAKE-Anwendung immer noch über die erforderlichen Berechtigungen verfügt. Sie können die Berechtigungen überprüfen, indem Sie Folgendes ausführen:
SHOW GRANTS ON PROCEDURE code_db.sch1.reset_resources(STRING, STRING, STRING, STRING);
Budget ist nicht aktiviert
Nur für Kontobudgets: Überprüfen Sie, ob das Budget aktiviert ist, indem Sie die Methode GET_CONFIG aufrufen und das Feld is_active überprüfen.
CALL budget_db.sch1.my_budget!GET_CONFIG();
Keine Zyklusstartaktion konfiguriert
Überprüfen Sie, ob für das Budget eine Zyklusstartaktion konfiguriert ist:
CALL budget_db.sch1.my_budget!GET_CYCLE_START_ACTION();
Budgetzyklus wurde noch nicht neu gestartet
Die Zyklusstartaktion wird nur ausgelöst, wenn der Budgetzyklus neu gestartet wird. Prüfen Sie, wann der aktuelle Zyklus begonnen hat und wann er enden wird, um zu bestimmen, wann der nächste Trigger auftreten wird.