こちらのページで基本的な使い方を把握した Snowflake において、cron のように定期的に SQL を実行する仕組みとして Task が提供されています。基本的な使い方を記載します。
データベースとテーブルを作成しておきます。
CREATE DATABASE mydb;
CREATE TABLE mytbl (c1 DATETIME, c2 STRING);
1分毎に INSERT を実行する task を作成します。WAREHOUSE
パラメータを省略すると、Snowflake-managed な Compute リソースを利用して稼働します。
CREATE TASK mytask
SCHEDULE = '1 MINUTE'
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = XSMALL
AS
INSERT INTO mytbl (c1, c2) VALUES (CURRENT_TIMESTAMP(), system$current_user_task_name());
初期状態では開始されていないため、以下の SQL を実行します。
ALTER TASK mytask RESUME;
参考資料:
Task は schema オブジェクトの配下に位置するオブジェクトです。USE されている schema に関する task を show するコマンドは以下のとおりです。
USE DATABASE mydb;
SHOW TASKS;
USE されていない schema の task も表示するためには以下のようにします。
SHOW TASKS IN ACCOUNTS;
タスクの実行履歴は以下のコマンドで確認します。
SELECT * FROM TABLE(information_schema.task_history());
SELECT * FROM TABLE(information_schema.serverless_task_history());
監査用の Snowflake DB から SELECT する場合は以下のようにします。
SELECT * FROM snowflake.account_usage.task_history LIMIT 10;
Snowflake におけるセキュリティ関連の機能 に記載の snowflake database を利用する場合は遅延が発生します。Information Schema を利用する場合は、保持期限が存在することに注意します。
参考資料:
ACCOUNTADMIN を用いずに、他のロールに権限を委譲する設定を記載します。
Task が格納される database および schema の USAGE 権限に加えて、Task の OWNERSHIP 権限を持つ場合、以下のクエリが実行できます。
SELECT * FROM TABLE(information_schema.task_history());
または MONITOR EXECUTION
権限を持つ場合にも、上記クエリを実行可能です。
GRANT MONITOR EXECUTION ON ACCOUNT TO ROLE myrole;
上記は Information Schema に関する記載です。snowflake database から SELECT するための権限は、こちらのページをご参照ください。
参考資料:
以下のようなカスタムロール taskadmin
を作成して、権限を委譲できます。
// accountadmin である必要はありません。
USE ROLE securityadmin;
// ロールの作成。
CREATE ROLE taskadmin;
// useradmin が grant できるように、OWNERSHIP を移管しています。
GRANT OWNERSHIP ON ROLE taskadmin TO ROLE useradmin;
// accountadmin の直下に配置することで、taskadmin が OWNERSHIP を持つオブジェクトが発生しても accountadmin で管理できるようにしておきます。
GRANT ROLE taskadmin TO ROLE accountadmin;
// 以下の grant には accountadmin が必要です。
USE ROLE accountadmin;
GRANT EXECUTE TASK, EXECUTE MANAGED TASK ON ACCOUNT TO ROLE taskadmin;
上記 taskadmin
に加えて、必要な権限は以下のとおりです。
Task の OWNERSHIP 権限は user ではなく role が持ちます。特定の user が管理する task というものはなく、role を持つ複数の user で管理する task ということになります。
例えば ACCOUNTADMIN で create した task の OWNERSHIP は ACCOUNTADMIN となるため、taskadmin
では drop 等ができません。
shared database 配下に task を作成することはできませんが、task の SQL 内で参照することはできます。
CREATE TASK mytask
SCHEDULE = '1 MINUTE'
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = XSMALL
AS
INSERT INTO mytbl (c1, c2) SELECT CURRENT_TIMESTAMP(), query_text FROM snowflake.account_usage.query_history LIMIT 1;
参考資料: