SQLWatch 2.6报告ID56邮件提示无数据但SSMS执行有结果如何排查
SQLWatch 2.6 Report ID 56 邮件无数据排查方案
权限上下文校验
SSMS手动执行查询使用的是当前登录账号权限,SQLWatch调用报告时使用的是独立执行上下文,是最常见的空数据原因:
- 确认SQL Server代理服务运行账号,以及
SQLWatch-Report-Export作业的执行账号,使用该账号登录SSMS执行对应报告查询,验证是否返回结果 - 检查报告查询涉及的自定义业务表、视图,是否给执行账号授予了SELECT权限,SQLWatch默认权限不会自动覆盖自定义业务对象
- 若数据库开启了行级安全(RLS),确认执行账号符合RLS过滤规则,不会被过滤掉全部数据
时间窗口参数校验
SQLWatch报告默认会携带时间范围参数,手动执行时往往省略参数导致结果不一致:
- 从
sqlwatch_config_report表中取出ReportId=56对应的report_exec字段的查询语句,检查是否用到@report_start_time、@report_end_time这类内置时间参数 - 执行以下查询查看报告触发时传入的实际参数:
SELECT * FROM sqlwatch_logger_report_action WHERE report_id = 56 ORDER BY event_time DESC
- 将日志中记录的开始、结束时间代入原始查询语句执行,确认该时间范围内是否有有效数据返回
- 若检查为阈值触发类型,确认触发时间点是否落在报告的时间窗口内,避免跨采集周期、跨天导致的参数偏移
时序一致性校验
检查触发检查时数据是否已完成采集入库:
- 确认SQLWatch基础采集作业、自定义采集作业的历史运行记录,排查触发时间点前后是否有采集失败的情况
- 若报告数据依赖
sqlwatch_logger_开头的日志表,确认检查触发时间点,对应数据是否已经完成采集写入:手动查询时往往已过采集周期数据已入库,但触发邮件时数据还未生成 - 检查
sqlwatch_config_check中对应检查的check_frequency_minutes参数,是否小于报告依赖数据的采集频率,导致触发检查时新数据还未写入
运行日志与隐性错误排查
- 执行以下查询查看SQLWatch运行日志,定位报告执行相关错误:
SELECT * FROM sqlwatch_logger_log WHERE log_message LIKE '%56%' OR log_message LIKE '%report%' ORDER BY log_time DESC
- 查看
SQLWatch-Report-Export作业对应触发时间的步骤输出,排查是否有参数转换错误、对象不存在等隐性错误,这类错误不会导致作业失败,只会返回空数据集 - 若自定义了动作模板,检查
sqlwatch_config_check_action_template中模板的变量拼写是否正确,避免因变量读取失败误判为无数据
2.6版本已知问题适配
SQLWatch 2.6存在几个已知的报告空输出问题,可针对性验证:
- 确认报告查询的返回字段是否包含
sqlwatch_database_id,该版本报告渲染逻辑会默认过滤当前实例不存在的数据库ID,若查询未返回该字段会被误判为跨实例无数据 - 若为跨实例报告,确认
sqlwatch_config_sql_instance中实例配置正常,且执行账号有跨实例访问权限 - 检查报告查询返回结果中是否存在全空行,该版本渲染逻辑会把包含NULL行的数据集整体判定为空,可在查询末尾添加非空过滤规则验证
内容的提问来源于stack exchange,提问作者Charles Candale
相关产品推荐
相关产品推荐

