Actions de début de cycle pour les budgets

Vous pouvez configurer un budget pour appeler automatiquement une procédure stockée lorsque le cycle budgétaire redémarre. Le cycle redémarre lorsque les dépenses sont réinitialisées à 0 au début de la période mensuelle du budget. Cela vous permet d’exécuter des actions automatisées au début de chaque période budgétaire, telles que la réactivation des entrepôts ou l’envoi de notifications concernant le nouveau cycle.

Les actions de début de cycle sont particulièrement utiles pour nettoyer ou annuler des actions qui ont été déclenchées par des actions personnalisées au cours du cycle budgétaire précédent.

Lorsque vous définissez une action de début de cycle, vous spécifiez la procédure stockée à appeler et les arguments à lui transmettre. La procédure stockée s’exécute automatiquement chaque fois que le cycle budgétaire redémarre.

Exigences en matière de procédures stockées

La procédure stockée qui est appelée par une action de début de cycle doit répondre aux exigences suivantes :

Après avoir créé une procédure stockée qui répond à ces exigences, vous devez accorder à l’application SNOWFLAKE le privilège USAGE sur la procédure et sa base de données et son schéma parents. Par exemple, si le nom pleinement qualifié de votre procédure stockée est code_db.sch1.reset_resources, exécutez les commandes suivantes :

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

Note

Si vous mettez à jour la procédure stockée après l’avoir ajoutée en tant qu’action de début de cycle, vous devez accorder à nouveau le privilège USAGE sur la procédure à l’application SNOWFLAKE.

Définir une action de début de cycle pour un budget

Vous pouvez définir une action de début de cycle par budget (soit le budget du compte, soit un budget personnalisé). Une action de début de cycle se compose des éléments suivants :

  • Procédure stockée : Une référence à la procédure à appeler lors du redémarrage du cycle budgétaire.

  • Arguments : Tableau d’arguments à transmettre à la procédure stockée.

Pour définir une action de début de cycle pour un budget, appelez la méthode SET_CYCLE_START_ACTION sur l’instance de budget. Par exemple, le code suivant définit une action de début de cycle qui appelle la procédure stockée reset_resources lorsque le cycle budgétaire redémarre :

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

Pour un exemple de bout en bout qui inclut la création de la procédure stockée qui est appelée par l’action de début de cycle, consultez Exemple étendu.

Supprimer une action de début de cycle d’un budget

Pour supprimer une action de début de cycle d’un budget, appelez la méthode REMOVE_CYCLE_START_ACTION sur l’instance de budget :

CALL budget_db.sch1.my_budget!REMOVE_CYCLE_START_ACTION();
Copy

Exemple étendu

L’exemple suivant montre comment écrire une procédure stockée appelée par une action de début de cycle, accorder les privilèges nécessaires à la procédure, puis définir l’action de début de cycle pour le budget.

  1. Créez une procédure stockée qui est conforme à toutes les exigences :

    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. Accordez des privilèges sur la procédure stockée à l’application SNOWFLAKE :

    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. Définissez l’action de début de cycle pour le budget :

    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

Dépannage des actions de début de cycle

Si une action de début de cycle ne fonctionne pas comme prévu, utilisez les méthodes suivantes pour diagnostiquer le problème.

Surveiller l’exécution des actions de début de cycle

Snowflake utilise une tâche pour exécuter l’action de début de cycle. Cette tâche est nommée _budget_cycle_start_task. Pour vérifier l’état d’exécution de la tâche d’action de début de cycle pour une instance de budget, exécutez la requête suivante. Remplacez budget_name par le nom de votre budget.

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

Dépannage des actions qui ne se déclenchent pas

Si une action de début de cycle ne se déclenche pas alors qu’elle est attendue, recherchez les problèmes courants suivants. Supposons que votre budget personnalisé soit budget_db.sch1.my_budget.

Procédure stockée ou privilèges modifiés

Vérifiez que la procédure stockée appelée par l’action de début de cycle est toujours valide et que l’application SNOWFLAKE dispose encore des privilèges nécessaires. Vous pouvez vérifier les privilèges en exécutant :

SHOW GRANTS ON PROCEDURE code_db.sch1.reset_resources(STRING, STRING, STRING, STRING);
Copy

Le budget n’est pas activé

Pour les budgets de compte uniquement, vérifiez que le budget est activé en appelant la méthode GET_CONFIG et en vérifiant le champ is_active.

CALL budget_db.sch1.my_budget!GET_CONFIG();
Copy

Aucune action de début de cycle n’est configurée

Vérifiez qu’une action de début de cycle est configurée pour le budget :

CALL budget_db.sch1.my_budget!GET_CYCLE_START_ACTION();
Copy

Le cycle budgétaire n’a pas encore redémarré

L’action de début de cycle ne se déclenche que lorsque le cycle budgétaire redémarre. Vérifiez quand le cycle en cours a commencé et quand il se terminera pour déterminer quand le déclenchement suivant se produira.