2012-10-23 61 views
2

我有幾個存儲過程的結構如下所示:存儲過程而不是防禦,因爲它看起來

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分鐘發佈一次?

+2

可能外部事務被回滾或中止?您可以回滾更新,但不能回滾發送的電子郵件。也許使用隊列表和後臺進程,而不是立即主動發送電子郵件。 –

+0

無論如何,從proc發送電子郵件似乎是一個冒險的主張。你不能在應用程序代碼中解決這個問題嗎? – usr

+1

@us好吧,如果它是數據庫郵件,它是異步的(利用服務代理),所以唯一的風險就是你無法回滾它。 :-)也就是說,我同意你的看法。這些電子郵件應該發送到其他地方(無論是SQL Server中的後臺進程,還是外部共享)。 –

回答

0

最終報廢的OP模式,並已應用於OP即的意見提出的亞倫建議創建一個EmailQueue表,並設置了一個後臺進程,循環每5分鐘(通過Agent)。此過程會掃描EmailQueue表中的任何新記錄,並在需要時發送電子郵件。