存储过程不像它看起来那样具有防御性

时间:2012-10-23 21:55:13

标签: sql sql-server tsql stored-procedures sql-server-2008-r2

我有几个存储过程,结构如下:

USE [WHouse]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[pr_Alert_Dly]
AS
    IF (SELECT LastRunDate FROM WHouse.dbo.AlertRunDates WHERE NameDescription = 'X' ) < (SELECT CONVERT(DATE, GETDATE()))
    BEGIN
       --================
       --need to comment the following out if trying to re-run
       UPDATE x 
       SET  x.LastRunDate = CONVERT(DATE,GETDATE())
       FROM WHouse.dbo.AlertRunDates x
       WHERE [NameDescription] = 'X' 
       --================

       --===============
       --DO A LOAD OF STUFF IN HERE 
       --INCLUDING USING DB_SENDMAIL TO EMAIL 20 PEOPLE
       --===============

    END

我的同事建立了一个报告系统(使用过程/ SSIS),每10分钟循环一次,只要存储过程完成而没有错误,它就会在控制表中标记为完成。

我不明白的是,即使上面引发错误,为什么它会在同一批次中多次重复BEGIN / END之间的部分?

如果防守不够,怎么防范我的同事系统导致同样的电子邮件每10分钟发送一次?!

1 个答案:

答案 0 :(得分:0)

最终取消了OP中的模式并使用了Aaron在OP的评论中提出的建议,即创建了一个EmailQueue表,并设置了一个每5分钟循环一次的后台进程(通过{{1 }})。此过程会扫描Agent表中的任何新记录,并在需要时发送电子邮件。