예산에 대한 주기 시작 작업

예산 주기가 다시 시작될 때 저장 프로시저를 자동으로 호출하도록 예산을 구성할 수 있습니다. 예산의 월간 기간이 시작될 때 지출이 0으로 재설정되면 주기가 다시 시작됩니다. 이를 통해 각 예산 기간이 시작될 때 웨어하우스 다시 활성화 또는 새 주기에 대한 알림 전송과 같은 자동화된 작업을 실행할 수 있습니다.

주기 시작 작업은 이전 예산 주기 동안 :doc:`사용자 지정 작업 </user-guide/budgets/custom-actions>`에 의해 트리거된 작업을 정리하거나 되돌리는 데 특히 유용합니다.

주기 시작 작업을 정의할 때 호출할 저장 프로시저와 여기에 전달할 인자를 지정합니다. 저장 프로시저는 예산 주기가 다시 시작될 때마다 자동으로 실행됩니다.

저장 프로시저 요구 사항

주기 시작 작업에 의해 호출되는 저장 프로시저는 다음 요구 사항을 충족해야 합니다.

이러한 요구 사항을 충족하는 저장 프로시저를 생성한 후에는 프로시저 및 해당 상위 데이터베이스와 스키마에 대한 SNOWFLAKE 애플리케이션 USAGE 권한을 부여해야 합니다. 예를 들어, 저장 프로시저의 정규화된 이름이 ``code_db.sch1.reset_resources``인 경우 다음 명령을 실행합니다.

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

참고

저장 프로시저를 주기 시작 작업으로 추가한 후 업데이트하는 경우 SNOWFLAKE 애플리케이션에 프로시저에 대한 USAGE 권한을 다시 부여해야 합니다.

예산에 대한 주기 시작 작업 설정

예산(계정 예산 또는 사용자 지정 예산)당 하나의 주기 시작 작업을 설정할 수 있습니다. 주기 시작 작업은 다음 구성 요소로 구성됩니다.

  • 저장 프로시저: 예산 주기가 다시 시작될 때 호출될 프로시저에 대한 참조입니다.

  • 인자: 저장 프로시저에 전달할 인자의 배열입니다.

예산에 대한 주기 시작 작업을 설정하려면 예산 인스턴스에서 SET_CYCLE_START_ACTION 메서드를 호출합니다. 예를 들어, 다음 코드는 예산 주기가 다시 시작될 때 reset_resources 저장 프로시저를 호출하는 주기 시작 작업을 설정합니다.

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

주기 시작 작업에 의해 호출되는 저장 프로시저 생성을 포함하는 전체 예제는 확장된 예 섹션을 참조하세요.

예산에서 주기 시작 작업 제거

예산에 대한 주기 시작 작업을 제거하려면 예산 인스턴스에서 REMOVE_CYCLE_START_ACTION 메서드를 호출합니다.

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

확장된 예

다음 예제에서는 주기 시작 작업으로 호출되는 저장 프로시저를 작성하고, 프로시저에 필요한 권한을 부여한 다음, 예산에 대한 주기 시작 작업을 설정하는 방법을 보여줍니다.

  1. :ref:`모든 요구 사항을 준수 <label-budget_cycle_start_actions_stored_procedure>`하는 저장 프로시저를 생성합니다.

    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. 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. 예산에 대한 주기 시작 작업을 설정합니다.

    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

주기 시작 작업 문제 해결

주기 시작 작업이 예상대로 작동하지 않으면 다음 방법을 사용하여 문제를 진단합니다.

주기 시작 작업 실행 모니터링

Snowflake는 태스크를 사용하여 주기 시작 작업을 실행합니다. 이 태스크의 이름은 ``_budget_cycle_start_task``입니다. 예산 인스턴스에 대한 주기 시작 작업 작업의 실행 상태를 확인하려면 다음 쿼리를 실행합니다. :samp:`budget_name`을 예산의 이름으로 바꿉니다.

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

트리거되지 않는 작업 문제 해결

주기 시작 작업이 예상대로 트리거되지 않으면 다음과 같은 일반적인 문제가 있는지 확인합니다. 사용자 지정 예산이 ``budget_db.sch1.my_budget``인 것으로 가정합니다.

저장 프로시저 또는 권한이 변경됨

주기 시작 작업에 의해 호출된 저장 프로시저가 여전히 유효한지와 SNOWFLAKE 애플리케이션에 여전히 필요한 권한이 있는지 확인합니다. 다음을 실행하여 권한을 확인할 수 있습니다.

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

예산이 활성화되지 않음

계정 예산의 경우에만 GET_CONFIG 메서드를 호출하고 is_active 필드를 확인하여 예산이 활성화되었는지 확인합니다.

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

주기 시작 작업이 구성되지 않음

예산에 대해 주기 시작 작업이 구성되었는지 확인합니다.

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

예산 주기가 아직 다시 시작되지 않음

주기 시작 작업은 예산 주기가 다시 시작될 때만 트리거됩니다. 현재 주기가 시작된 시점과 종료 시점을 확인하여 다음 트리거가 발생할 시점을 결정합니다.