予算のサイクル開始アクション¶
予算サイクルが再開したときに、ストアドプロシージャを自動的に呼び出すように予算を構成できます。サイクルは、予算の毎月の期間の始めに支出が0にリセットされると再開します。これにより、各予算の期間の初めに、ウェアハウスの再有効化や新しいサイクルに関する通知の送信などの自動アクションを実行できます。
サイクル開始アクションは、以前の予算サイクル中に:doc:`カスタムアクション</user-guide/budgets/custom-actions>`によってトリガーされたアクションをクリーンアップしたり、取り消したりするのに特に役立ちます。
サイクル開始アクションを定義するときは、呼び出すストアドプロシージャとそれに渡す引数を指定します。ストアドプロシージャは、予算サイクルが再開するたびに自動的に実行されます。
ストアドプロシージャの要件¶
サイクル開始アクションによって呼び出されるストアドプロシージャは、次の要件を満たしている必要があります。
プロシージャは、呼び出し元の権限ではなく、所有者の権限で実行する必要があります。詳細については、 呼び出し元権限と所有者権限のストアドプロシージャについて をご参照ください。
プロシージャの完了には30分以上かかってはなりません。
プロシージャはOUTPUT引数を持つことはできません。
重複や意図しない効果を引き起こすことなく、複数回呼び出されても処理できるようプロシージャを設計します。
プロシージャに必要な引数は、次のいずれかのデータ型である必要があります。
これらの要件を満たすストアドプロシージャを作成したら、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;
注釈
サイクル開始アクションとして追加した後にストアドプロシージャを更新した場合は、プロシージャに対するUSAGE権限をSNOWFLAKEアプリケーションに再付与する必要があります。
予算のサイクル開始アクションを設定する¶
予算ごとに1つのサイクル開始アクションを設定できます(アカウント予算またはカスタム予算のいずれか)。サイクル開始アクションは、次のコンポーネントで構成されます。
ストアドプロシージャ:予算サイクルの再開時に呼び出されるプロシージャへの参照。
引数:ストアドプロシージャに渡す引数の配列。
予算にサイクル開始アクションを設定するには、予算インスタンスの:doc:`SET_CYCLE_START_ACTION</sql-reference/classes/budget/methods/set_cycle_start_action>`メソッドを呼び出します。例えば、次のコードは、予算サイクル再開時に:code:`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'));
サイクル開始アクションによって呼び出されるストアドプロシージャの作成を含むエンドツーエンドの例については、:ref:`label-budget_cycle_start_actions_extended_example`をご参照ください。
予算からサイクル開始アクションを削除する¶
予算からサイクル開始アクションを削除するには、予算インスタンスの:doc:`REMOVE_CYCLE_START_ACTION</sql-reference/classes/budget/methods/remove_cycle_start_action>`メソッドを呼び出します。
CALL budget_db.sch1.my_budget!REMOVE_CYCLE_START_ACTION();
拡張例¶
次の例では、サイクル開始アクションによって呼び出されるストアドプロシージャを記述し、プロシージャに必要な権限を付与してから、予算にサイクル開始アクションを設定する方法を示します。
: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"; $$;
ストアドプロシージャに対する権限を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;
予算のサイクル開始アクションを設定します。
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'));
サイクル開始アクションのトラブルシューティング¶
サイクル開始アクションが期待どおりに機能しない場合は、以下の方法を使用して問題を診断します。
サイクル開始アクションの実行の監視¶
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;
トリガーしないアクションのトラブルシューティング¶
サイクル開始アクションが期待どおりにトリガーされない場合は、以下の一般的な問題を確認してください。カスタム予算は``budget_db.sch1.my_budget``であると仮定します。
ストアドプロシージャまたは権限が変更された
サイクル開始アクションによって呼び出されるストアドプロシージャがまだ有効であり、SNOWFLAKEアプリケーションにまだ必要な権限があることを確認します。次を実行すると、権限を確認できます。
SHOW GRANTS ON PROCEDURE code_db.sch1.reset_resources(STRING, STRING, STRING, STRING);
予算がアクティブ化されていない
アカウント予算の場合のみ、:doc:`GET_CONFIG</sql-reference/classes/budget/methods/get_config>`メソッドを呼び出して``is_active``フィールドをチェックし、予算がアクティブ化されていることを確認します。
CALL budget_db.sch1.my_budget!GET_CONFIG();
サイクル開始アクションが構成されていない
予算のサイクル開始アクションが構成されていることを確認します。
CALL budget_db.sch1.my_budget!GET_CYCLE_START_ACTION();
予算サイクルがまだ再開されていない
サイクル開始アクションは、予算サイクルが再開されたときにのみトリガーされます。次のトリガーが発生するタイミングを判断するには、現在のサイクルがいつ開始され、いつ終了するのかを確認します。