You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Supabase数据库触发器调用Edge Function实现阈值告警邮件咨询

Supabase 阈值告警实现方案

1. 检测数值首次低于阈值 & 获取变更前后数值

在PostgreSQL触发器中,可直接通过OLD和NEW变量获取行变更前后的完整数据:

  • OLD:存储触发变更前的行记录
  • NEW:存储触发变更后的行记录

要实现“首次低于阈值”的检测,只需在触发器函数中添加判断逻辑:当变更前的数值大于等于阈值,且变更后的数值小于阈值时,才执行后续告警逻辑。

举个实际例子(假设表名为monitor_data,数值字段为metric_value,阈值设为50):

CREATE OR REPLACE FUNCTION check_threshold_breach()
RETURNS TRIGGER AS $$
BEGIN
    -- 检测是否是首次降至阈值以下
    IF OLD.metric_value >= 50 AND NEW.metric_value < 50 THEN
        -- 执行后续告警逻辑,比如调用Edge Function
        PERFORM send_alert_via_edge_function(NEW.id, OLD.metric_value, NEW.metric_value);
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- 创建AFTER UPDATE触发器,监听数值字段变更
CREATE TRIGGER monitor_threshold_trigger
AFTER UPDATE OF metric_value ON monitor_data
FOR EACH ROW
EXECUTE FUNCTION check_threshold_breach();

2. 通过触发器/数据库函数调用Edge Function发送邮件

完全可以实现,步骤如下:

  1. 启用PostgreSQL的http扩展:
    在Supabase控制台的SQL编辑器中执行:
CREATE EXTENSION IF NOT EXISTS http;
  1. 编写数据库函数调用Edge Function:
    假设你的Edge Function路径为/send-alert-email,编写PL/pgSQL函数发起HTTP请求:
CREATE OR REPLACE FUNCTION send_alert_via_edge_function(row_id INT, old_val NUMERIC, new_val NUMERIC)
RETURNS VOID AS $$
DECLARE
    edge_function_url TEXT := 'https://<你的项目ID>.supabase.co/functions/v1/send-alert-email';
    request_body JSON;
    response RECORD;
BEGIN
    -- 构造请求体,传递告警所需数据
    request_body := json_build_object(
        'row_id', row_id,
        'old_value', old_val,
        'new_value', new_val,
        'threshold', 50
    );

    -- 调用Edge Function,使用服务角色密钥鉴权(注意保密)
    SELECT * INTO response FROM http.post(
        edge_function_url,
        request_body::TEXT,
        ARRAY[
            ('Content-Type', 'application/json'),
            ('Authorization', 'Bearer <你的服务角色密钥>')
        ]
    );

    -- 可选:处理响应,记录日志
    IF response.status != 200 THEN
        RAISE NOTICE 'Edge Function调用失败: %', response.content;
    END IF;
END;
$$ LANGUAGE plpgsql;
  1. 编写Edge Function处理邮件发送:
    在Edge Function中,使用Supabase邮件服务或第三方服务发送告警邮件,示例TypeScript代码:
import { createClient } from '@supabase/supabase-js';

export default async function handler(req: Request) {
    const supabase = createClient(
        Deno.env.get('SUPABASE_URL')!,
        Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!
    );

    const { row_id, old_value, new_value, threshold } = await req.json();

    // 构造邮件内容
    const emailContent = `
        告警通知:
        数据行ID: ${row_id}
        数值从 ${old_value} 降至 ${new_value},已低于阈值 ${threshold}
    `;

    // 发送邮件
    const { error } = await supabase.from('emails').insert({
        to: '告警接收邮箱@example.com',
        subject: '数值阈值告警',
        text: emailContent
    });

    if (error) {
        return new Response(JSON.stringify({ error: error.message }), { status: 500 });
    }

    return new Response(JSON.stringify({ message: '告警邮件已发送' }), { status: 200 });
}

注意事项:

  • 服务角色密钥需妥善保管,避免泄露
  • 可在数据库函数中添加错误处理逻辑,避免触发器执行失败影响数据变更
  • Edge Function需配置正确的环境变量(如SUPABASE_URL、SUPABASE_SERVICE_ROLE_KEY)

内容的提问来源于stack exchange,提问作者progNewbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:49:58