监控存储过程执行

一、背景

存储过程执行的结果需要被监控起来,防止一顿操作猛如虎,回头一看表没有;

有些时候表格出现错误,原因是存储过程跑失败了。这个时间就需要监控起存储过程的执行结果。

 

二、监控方式

监控存储过程执行

 

 

 

 

 

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,请在下方留言。谢谢。

 

 

 

四、结束

三种方式各有优劣。各有适用的场景,我一般是组合使用的。

 

上一篇:leg


下一篇:QT 环形等待