如何在Snowflake的SYSTEM$SEND_EMAIL中嵌入查询结果至邮件正文?
将Snowflake告警查询结果嵌入邮件正文的最优实现方式
问题背景
我的Snowflake通知集成已正常运行,能通过CREATE ALERT发送邮件。现在需要把每日监控表DB.LOAD_SUCCESS_TRACKING的所有行内容放到SYSTEM$SEND_EMAIL的邮件正文中,实现告警时附带查询结果。
测试告警代码如下:
CREATE OR REPLACE ALERT test WAREHOUSE = ITSM_LWH SCHEDULE = '1 minute' IF (EXISTS ( SELECT * FROM DB.LOAD_SUCCESS_TRACKING)) THEN CALL SYSTEM$SEND_EMAIL( 'ITSM_EMAIL', 'nyoung@XXXXXX.net', 'Game Alert: Possible degraded games on GS.', 'Email Body.' ); ALTER ALERT test RESUME;
最优实现步骤
1. 创建存储过程生成格式化邮件内容
创建存储过程,查询目标表并将结果转换为邮件客户端友好的HTML表格格式(也可按需改为纯文本CSV):
CREATE OR REPLACE PROCEDURE GENERATE_LOAD_TRACKING_EMAIL_BODY() RETURNS STRING LANGUAGE SQL EXECUTE AS CALLER AS $$ DECLARE email_body STRING; BEGIN -- 将表数据转换为HTML表格 SELECT '<html><body><h3>每日加载监控结果</h3><table border="1"><tr>' || ARRAY_TO_STRING(ARRAY_AGG('<th>' || COLUMN_NAME || '</th>'), '') || '</tr>' || ARRAY_TO_STRING(ARRAY_AGG('<tr>' || ARRAY_TO_STRING(ARRAY_AGG('<td>' || NVL(VALUE::STRING, '') || '</td>'), '') || '</tr>'), '') || '</table></body></html>' INTO email_body FROM DB.LOAD_SUCCESS_TRACKING, LATERAL FLATTEN(INPUT => OBJECT_CONSTRUCT(*)) GROUP BY SEQ8(); -- 表为空时返回默认提示 IF email_body IS NULL THEN RETURN '今日无加载监控数据。'; END IF; RETURN email_body; END; $$;
2. 修改告警调用存储过程生成正文
更新原有告警逻辑,在SYSTEM$SEND_EMAIL中调用存储过程获取动态生成的邮件正文:
CREATE OR REPLACE ALERT test WAREHOUSE = ITSM_LWH SCHEDULE = '1 minute' IF (EXISTS ( SELECT * FROM DB.LOAD_SUCCESS_TRACKING)) THEN CALL SYSTEM$SEND_EMAIL( 'ITSM_EMAIL', 'nyoung@XXXXXX.net', 'Game Alert: Possible degraded games on GS.', GENERATE_LOAD_TRACKING_EMAIL_BODY() -- 调用存储过程获取动态正文 ); ALTER ALERT test RESUME;
补充说明
- 若偏好纯文本格式,可将存储过程中的HTML逻辑替换为CSV格式,用
ARRAY_TO_STRING拼接逗号分隔的字段与行。 - 确保告警使用的仓库有足够资源执行查询,且存储过程调用者拥有
DB.LOAD_SUCCESS_TRACKING表的查询权限。 - 可根据需求调整邮件正文样式,比如添加日期标记、高亮异常行等。
内容的提问来源于stack exchange,提问作者NRY
相关产品推荐
相关产品推荐

