VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
vsql_http 拡張機能を使うと、トリガーが HTTP リクエストを直接送れるため、行が変わった瞬間に外部システムへ通知が届き、アプリケーション層でのイベント発行は不要になります。
セットアップ
基本的な Webhook トリガー
Webhook エンドポイントにペイロードを POST するAFTER INSERT トリガーです。
@ignored に代入されます。トリガーはレスポンスを使いませんが、代入によって「結果が使われていない」という警告が抑えられます。NULL は接続が失敗したことを意味します。いずれの場合もトリガーは完了し、INSERT は実行されます。
タイムアウトの制御
デフォルトでは、vsql_http は 30 秒のタイムアウトを使います。遅い、または利用できない Webhook エンドポイントは、その間書き込みをブロックします。より厳しい期限を設定するには、オプションを指定する JSON を付けて http_request() を使います。
UPDATE と DELETE のトリガー
同じパターンは更新と削除でも機能します。以前の値を含めるにはOLD を使います。
IF NEW.status != OLD.status のガードは、ステータスを変更しない UPDATE ステートメントで Webhook が発火するのを防ぎ、Webhook の量を意味のある変更に比例させます。
認証
API キーやベアラートークンは、http_request() の headers_json 引数で渡します。
重要な注意点
トリガーは同期的です。 HTTP 呼び出しは、完了するかタイムアウトするまでブロックします。遅い、または停止している Webhook エンドポイントは、そのテーブルへのすべての書き込みを止めます。常に短いタイムアウト(2〜5 秒)を設定し、エンドポイントは即座に応答するように設計してください(処理をインラインで行うのではなく、キューに入れます)。 失敗してもデフォルトではエラーになりません。 HTTP 呼び出しが NULL を返した場合(接続の失敗)、トリガーはエラーを発生させず、書き込みは成功します。警告には curl のエラーメッセージが含まれますが、トリガーの中でそれを検査するものはありません。2xx 以外のレスポンスもエラーを出さずに返ります。http_post() はステータスコードにかかわらず JSON を返し、トリガーはそれを検査しません。確実な配信が重要な場合は、代わりにトランザクショナルアウトボックスパターンを使ってください。同じトランザクションの中で outbox テーブルにイベントを書き、別のプロセスで配信します。
トリガーは行ごとに発火します。 FOR EACH ROW は、一括の UPDATE orders SET status = 'shipped' が 1000 行に当たると、1000 回の Webhook 呼び出しを送ることを意味します。これはエンドポイントに過負荷をかけ、接続数の上限を使い果たすことがあります。一括操作では、トリガーを抑止するかアウトボックスパターンを使ってください。
再試行のロジックはありません。 失敗したリクエストは失敗したままです。再試行とデッドレターの処理は、トリガーではなく、受信側のシステムかアウトボックスのプロセスに組み込んでください。
トラブルシューティング
次のステップ
- SQL から HTTP リクエストを送信する — レスポンスの解析を含む完全な関数リファレンス
- API データで行を拡充する — 外部データをテーブルに取り込む
- MySQL のトリガー — 一般的なトリガーのパターンと BEFORE と AFTER の意味
関連項目
- SQL からの HTTP リクエストの送信 — Webhook トリガーで使う vsql_http の関数
- MySQL のトリガー — Webhook を発火させるトリガーの仕組み
- MySQL での HMAC 署名 — 受信側の検証のために Webhook ペイロードに署名する