💨

アラートを通知する

2023/07/10に公開

はじめに

アラートを使ってメールで飛ばせるようになったため触ってみました。最後にこんなこともできたらいいな〜ということを書きました。内容はほぼほぼ公式ドキュメントに書いてある内容です。

諸々の確認

ALERT の確認

ALERT を作成するために CREATE ALERT を確認します。

create or replace alert <alert_name>
  warehouse = <warehouse_name>
  schedule = <schedule>
if (exists (
	<condition>
  ))
then <action>
:
パラメーター
  • <alert_name> alertの名称(アラートが作成されるスキーマに対して一意じゃないとだめ)
  • <warehouse_name> 使用するウェアハウス
  • <schedule> 以下のいずれかで時間を指定します
    • cron
    • minute
# Cron式	
# __________ minute (0-59)
# | ________ hour (0-23)
# | | ______ day of month (1-31, or L)
# | | | ____ month (1-12, JAN-DEC)
# | | | | _ day of week (0-6, SUN-SAT, or L)
# | | | | |
# | | | | |
  * * * * *
  • <condition> アラートの条件を設定します
    • SELECT
    • SHOW <オブジェクト>
    • CALL
  • <action> 条件があった際に実行するSQLを書きます
    • メール通知を送信するには、 SYSTEM$SEND_EMAIL() ストアドプロシージャを呼び出します(今回はメールを飛ばします)

SYSTEM$SEND_EMAIL の確認

SYSTEM$SEND_EMAIL() を使うので、その中身も確認して行きます〜

call system$send_email(
    '<integration_name>',
    '<email_address_1> [ , ... <email_address_n> ]',
    '<email_subject>',
    '<email_content>'
);
パラメーター
  • <integration_name> 通知統合の名前
  • <email_address_1> 受信するためのメールアドレス
  • <email_subject> 件名
  • <email_content> 本文

通知統合 の確認

SYSTEM$SEND_EMAIL()で通知統合を作成しました。なので、通知統合についてもみていきます。

create notification integration
  <name>
  type = email
  enabled = true
  allowed_recipients = ( '<email_address>' )
パラメーター
  • <name> 統合の名前
  • ALLOWED_RECIPIENTS 統合からの通知メールを受信できるメールアドレス

サンプル

私がお試しで使用したコードを載せておきます。

-- 通知統合 の確認
create notification integration daisuke_email
    type=email
    enabled=true
    allowed_recipients=('xxxx@xxxx.jp')
;

-- ALERT の作成
create or replace alert d_harato_db.sf_demo.alert_new_rows
  warehouse = d_harato_wh
  schedule = '1 minute'
if
    (exists
        (
      select *
      from d_harato_db.sf_demo.dummy_table
      group by id
      having count(id) > 0
	)
    )
then call system$send_email(
    'daisuke_email',
    'xxxx@xxxx.jp',
    'テーブルにレコードがあるぞい',
    'なんでレコードがあるの???'
)

-- 作成した ALERT を起動
alter alert d_harato_db.sf_demo.alert_new_rows resume;

-- 通知を飛ばすための処理
create or replace table d_harato_db.sf_demo.dummy_table (
    id number
);

insert into d_harato_db.sf_demo.dummy_table
values (1)
;

無事メールが来ました!(止め忘れると当たり前ですが、毎分メールが飛んできます!!)

ALERT を使う上での注意

もっとほしい

  • 1つの ALERT で複数内容のメッセージを送信できるようになればと思いました
-- イメージ
create or replace alert <name>
	****
-- 条件①
if
    (exists
	  ( レコードがある条件 )
    )
-- 条件①
then call system$send_email(
    'daisuke_email_one',
    'xxxx@xxxx.jp',
    'テーブルにレコードがあるぞい',
    'なんでレコードがあるの???'
)
-- 条件②
else
then call system$send_email(
    'daisuke_email_two',
    'yyyy@yyyy.jp',
    'テーブルにレコードがないぞい',
    'なんでレコードがないの???'
)
;
  • ウェアハウスの指定をしなくても、Snowflake側でよしなにウェアハウスサイズを決定してほしいなぁ

Discussion