一、背景
存储过程执行的结果需要被监控起来,防止一顿操作猛如虎,回头一看表没有;
有些时候表格出现错误,原因是存储过程跑失败了。这个时间就需要监控起存储过程的执行结果。
二、监控方式
2.1 MSSQ
2.1.1 可以在后台查看上次的执行结果
2.1.2 发送邮件
可以根据不同情况给目标人群发邮件
2.2 Navicate
2.2.1 定时查看
在电脑自带的任务程序计划中查看
2.2.2 发送邮件
Navicat中有发送邮件的功能,无论结果运行的成功与否,都会发送。无法做到只有执行错误才会发送。
2.2 埋点
也是写这篇博客的原因,下面会详细介绍。
三、埋点监控
3.1 基本思路
建立一个表,将运行的开始时间,结束时间等都放到这个表里面。
3.2 建表
Drop table if exists test.qiansl.sp_running_monitor; Create table test.qiansl.sp_running_monitor ( id int identity(1,2) primary key, sp_name nvarchar(255), begin_time datetime, end_time datetime, running_second int, running_time varchar(20), result int Default 0, comment varchar(500) )
3.3 代码展示
USE [test] GO /****** Object: StoredProcedure [qiansl].[sp_name_1] Script Date: 2021/7/31 23:48:23 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [qiansl].[sp_name_1] AS BEGIN -- 获取执行开始时间 insert into [test].[qiansl].sp_running_monitor(sp_name,begin_time) values ('sp_name_1',getdate()); -- 执行内容 WAITFOR DELAY N'00:00:10.000' ; -- 获取执行结束时间 UPDATE [test].[qiansl].sp_running_monitor SET end_time = getdate(), running_second = DATEDIFF(SECOND,begin_time,GETDATE()), running_time=CONVERT(VARCHAR(8),CONVERT(TIME,DATEADD(ss,DATEDIFF(SECOND,begin_time,GETDATE()),'1900-01-01'))) , result=1 where sp_name='sp_name_1' and id = (select max(id) from [test].[qiansl].sp_running_monitor where sp_name='sp_name_1' ) END
3.4 进一步处理
大部分时间我们是想看到最近一次的执行结果,可以用开窗函数在建个视图
3.4.1 代码展示
USE [test] GO /****** Object: View [qiansl].[v_sp_running_monitor_last] Script Date: 2021/7/31 23:57:31 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE VIEW [qiansl].[v_sp_running_monitor_last] AS select * from ( select *,row_number() over(partition by sp_name order by id desc) as 'id逆排' from [test].[qiansl].sp_running_monitor ) as A WHERE id逆排=1 GO
3.4.2 结果展示
3.4.2.1 查看表格代码
select * from [test].[qiansl].sp_running_monitor
3.4.2.2 查看视图代码
SELECT * FROM [test].[qiansl].[v_sp_running_monitor_last] order by id desc
3.5 用途
主要是两个用途
- 运行结果是否正确
- 是否在设定的时间运行
简单的说:判断是否在正确的时间运行出正确的结果
3.6 遗憾
如果能够找到运行代码的电脑IP就更好了。
如果有哪位同学知道锁定运行代码的IP,请在下方留言。谢谢。
四、结束
三种方式各有优劣。各有适用的场景,我一般是组合使用的。