Ações de início de ciclo para orçamentos

Você pode configurar um orçamento para chamar automaticamente um procedimento armazenado quando o ciclo orçamentário é reiniciado. O ciclo é reiniciado quando os gastos são redefinidos para 0 no início do período mensal do orçamento. Isso permite que você execute ações automatizadas no início de cada período de orçamento, como habilitar warehouses novamente ou enviar notificações sobre o novo ciclo.

As ações de início de ciclo são úteis principalmente para limpar ou reverter ações que foram acionadas por ações personalizadas durante o ciclo orçamentário anterior.

Ao definir uma ação de início de ciclo, você especifica o procedimento armazenado a ser chamado e os argumentos a serem passados para ele. O procedimento armazenado é executado automaticamente toda vez que o ciclo orçamentário é reiniciado.

Requisitos do procedimento armazenado

O procedimento armazenado que é chamado por uma ação de início de ciclo deve atender aos seguintes requisitos:

Depois de criar um procedimento armazenado que atenda a esses requisitos, você deverá conceder ao aplicativo SNOWFLAKE o privilégio USAGE no procedimento e nos respectivos banco de dados e esquema pai. Por exemplo, se o nome totalmente qualificado do procedimento armazenado é code_db.sch1.reset_resources, execute os seguintes comandos:

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

Nota

Se você atualizar o procedimento armazenado depois de adicioná-lo como uma ação de início de ciclo, deverá conceder novamente o privilégio USAGE no procedimento para o aplicativo SNOWFLAKE.

Definir uma ação de início de ciclo para um orçamento

Você pode definir uma ação de início de ciclo por orçamento (seja o orçamento da conta ou um personalizado). Uma ação de início de ciclo consiste nos seguintes componentes:

  • Procedimento armazenado: Uma referência ao procedimento a ser chamado quando o ciclo orçamentário é reiniciado.

  • Argumentos: Uma matriz de argumentos a ser passada para o procedimento armazenado.

Para definir uma ação de início de ciclo para um orçamento, chame o método SET_CYCLE_START_ACTION na instância do orçamento. Por exemplo, o código a seguir define uma ação de início de ciclo que chama o procedimento armazenado reset_resources quando o ciclo orçamentário é reiniciado:

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

Para um exemplo completo que inclui a criação do procedimento armazenado chamado pela ação de início de ciclo, consulte Exemplo estendido.

Remover uma ação de início de ciclo de um orçamento

Para remover uma ação de início de ciclo de um orçamento, chame o método REMOVE_CYCLE_START_ACTION na instância do orçamento:

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

Exemplo estendido

O exemplo a seguir demonstra como escrever um procedimento armazenado chamado por uma ação de início de ciclo, conceder os privilégios necessários no procedimento e definir a ação de início de ciclo para o orçamento.

  1. Crie um procedimento armazenado que esteja em conformidade com todos os requisitos:

    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. Conceda privilégios no procedimento armazenado para o aplicativo 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. Defina a ação de início de ciclo para o orçamento:

    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

Solução de problemas das ações de início de ciclo

Se uma ação de início de ciclo não estiver funcionando como esperado, use os métodos a seguir para diagnosticar o problema.

Monitorar a execução da ação de início de ciclo

O Snowflake usa uma tarefa para executar a ação de início de ciclo. Essa tarefa é chamada _budget_cycle_start_task. Para verificar o status de execução da tarefa de ação de início de ciclo para uma instância de orçamento, execute a seguinte consulta. Substitua budget_name pelo nome do seu orçamento.

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

Solução de problemas das ações que não são acionadas

Se uma ação de início de ciclo não estiver sendo acionada quando esperado, verifique os seguintes problemas comuns. Suponha que seu orçamento personalizado seja budget_db.sch1.my_budget.

Procedimento armazenado ou privilégios alterados

Verifique se o procedimento armazenado chamado pela ação de início de ciclo ainda é válido e se o aplicativo SNOWFLAKE ainda tem os privilégios necessários. Você pode verificar os privilégios executando:

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

O orçamento não está ativado*

Somente para orçamentos de conta, verifique se o orçamento está ativado chamando o método GET_CONFIG e verificando o campo is_active.

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

Nenhuma ação de início de ciclo foi configurada

Verifique se uma ação de início de ciclo foi configurada para o orçamento:

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

O ciclo orçamentário ainda não foi reiniciado

A ação de início de ciclo é acionada somente quando o ciclo orçamentário é reiniciado. Verifique quando o ciclo atual começou e terminará para determinar quando o próximo acionamento ocorrerá.