监控存储过程执行

一、背景

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

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

二、监控方式

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

四、结束

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

原文地址:https://www.cnblogs.com/qianslup/p/15085771.html