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发送邮件
完全可以实现,步骤如下:
- 启用PostgreSQL的http扩展:
在Supabase控制台的SQL编辑器中执行:
CREATE EXTENSION IF NOT EXISTS http;
- 编写数据库函数调用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;
- 编写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
相关产品推荐
相关产品推荐

