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:

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

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

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

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.

  1. 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";
    $$;
    
    Copy
  2. 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;
    
    Copy
  3. 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'));
    
    Copy

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

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

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

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

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.