2016-09-26 52 views
0

我有一張表,其中包含經銷商代碼和狀態。每天晚上1點到6點,狀態欄可能會更改爲每個經銷商代碼。例如,今天00141.00062的狀態是operational,但是如果商店關閉,明天它將是deactivatedSQL Server:如何跟蹤列中的更改值並只發送更改值的通知電子郵件

簡而言之,我想通過存儲過程來跟蹤更改,併發送通知電子郵件給我,只是爲了更新值。

最後,我不喜歡根據我以前的經驗創建觸發器原因,它會影響我的主應用程序。因此,如果你能解釋我如何通過存儲過程來做到這一點,我會感到欣慰。

DEALER_CODE STATUS 
---------------------------- 
00141.00062 OPERASYONEL 
01033.00061 DEACTIVE 
00070.00002 DEACTIVE 
00524.00002 DEACTIVE 
00387.00020 DEACTIVE 
00543.00001 DEACTIVE 
00310.00061 DEACTIVE 
00247.00062 OPERATIONAL 
+2

您正在使用哪個數據庫管理系統? (SQL本身沒有電子郵件功能。) – jarlh

+0

它可能與在sql中創建配置文件 – Bharat

+0

標準版..其實我可以處理emai問題,我寫了一個代碼..只是我需要知道什麼是跟蹤的最佳方式這些變化 –

回答

1

如果您UPDATE語句影響在一次多行,你會得到觸發器觸發了一次,但在Deleted多行(舊的值UPDATE前)和Inserted僞表(後UPDATE新值)。因此,僅僅比較這些僞表就能找出哪些行已經發生了變化,這是最容易的。

另外:我會強烈建議直接從觸發發送電子郵件,因爲扳機,導致它火UPDATE語句的上下文中執行,因此在發送任何延遲電子郵件只會減慢你的主要應用程序。

相反,只需在表格中添加一行,然後定期(每天晚上一次,每4小時一次或任何適合您需要的)有一個單獨的進程從該表中抓取新行並將其放入電子郵件中,郵件。

因此觸發應該是這個樣子:

CREATE TRIGGER trgUpdateStatus 
ON dbo.YourTableName 
AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    -- insert a row into a "changed" table that will then be 
    -- used to asynchronously send out e-mails 
    INSERT INTO dbo.ChangedDealerStatuses (DealerCode, OldStatus, NewStatus) 
     SELECT 
      old.Dealer_Code, old.Status, new.Status 
     FROM 
      Deleted old 
     INNER JOIN 
      Inserted new ON old.Dealer_Code = new.Dealer_Code 
     WHERE 
      old.Status <> new.Status 

END 
+0

實際上很難插入行,因爲通過不同的web服務創建的表。因此,在這個觸發器之後,我需要創建一個新的查詢,然後發送給更改過的經銷商代碼。如果您可以分享查詢,我會很高興,我將如何做到這一點? –

+0

是否有可能通過存儲過程做到這一點?因爲我想我需要定期獲取此表的副本,並將其稱爲舊錶,然後在1天后創建一個sp,它將在早上工作以檢查更改的值。它的工作原理是什麼? –

+0

@SemihUral:當然,您可以編寫一個存儲過程,**(1)**檢查中間表是否有新條目,**(2)**根據需要發送電子郵件,然後您可以安排此存儲過程根據需要運行 - 每小時一次,每天一次 - 在您的情況下有意義 –

0

您可以使用after update觸發器來實現此目的。這是示例代碼:

CREATE TRIGGER TRIGGERNAME -- NAME OF TRIGGER 
ON TABLENAME -- NAME OF YOUR TABLE 
AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF UPDATE([STATUS]) 
    BEGIN 
     PRINT 'STATUS COLUMN IS UPDATED' 
     ---------------------TODO------------   
     -- INSERT INTO TABLE OR SEND EMAIL------- 
    END 
END 

注意:請注意,如果更新語句將在列狀態更新操作時執行。它從不檢查您是否更新了相同的值。

相關問題