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分鐘發佈一次?
可能外部事務被回滾或中止?您可以回滾更新,但不能回滾發送的電子郵件。也許使用隊列表和後臺進程,而不是立即主動發送電子郵件。 –
無論如何,從proc發送電子郵件似乎是一個冒險的主張。你不能在應用程序代碼中解決這個問題嗎? – usr
@us好吧,如果它是數據庫郵件,它是異步的(利用服務代理),所以唯一的風險就是你無法回滾它。 :-)也就是說,我同意你的看法。這些電子郵件應該發送到其他地方(無論是SQL Server中的後臺進程,還是外部共享)。 –