2016-02-22 202 views
0

我有一個現有的流量管理系統(不是我設計的),並且想要設置一個自動發送電子郵件以用於交付證明 - 我們有將電子簽名等發送到我們的Web服務器並更新的應用程序在幾張不同的表格中提供相關信息。插入後的SQL Server觸發器

我想現在創建一個SP,向客戶發送電子郵件以提供交付詳情。 我在一張桌子上創建了一個觸發器,其中給出了狀態和簽名詳細信息,即名稱和gps位置。

USE [Transport_Comp1] 
GO 
/****** Object: Trigger [dbo].[TRG_InsertPodEmail2] Script Date: 02/22/2016 23:18:56 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[TRG_InsertPodEmail2] 
    ON [dbo].[DscPalletDetails] 
    AFTER INSERT 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    insert into dbo.Pod2Email ([dwDscPalletDetailsId] 
     ,[dwPalletIdFK] 
     ,[dwJobItemIdFK] 
     ,[dwLegIdFK] 
     ,[dwDscStatusIdFK] 
     ,[szDscStatusCode] 
     ,[szNotes] 
     ,[bIsCollection] 
     ,[dtUpdateDate] 
     ,[szScannedBarcode] 
     ,[dwSignatureIdFK] 
     ,[dwScanStatusIdFk] 
     ,[nScanRef] 
     ,[szPalletNum]) 
    SELECT [dwDscPalletDetailsId] 
     ,[dwPalletIdFK] 
     ,[dwJobItemIdFK] 
     ,[dwLegIdFK] 
     ,[dwDscStatusIdFK] 
     ,[szDscStatusCode] 
     ,[szNotes] 
     ,[bIsCollection] 
     ,[dtUpdateDate] 
     ,[szScannedBarcode] 
     ,[dwSignatureIdFK] 
     ,[dwScanStatusIdFk] 
     ,[nScanRef] 
     ,[szPalletNum] 
     FROM INSERTED 
    -- Insert statements for trigger here 

END 

我可以擴展PodEmail表來包含來自另一個表的數據,即賬戶信息嗎?

我想創建一個表格,我可以使用它作爲遊標的基礎來循環通過記錄從帳戶表發送電子郵件到電子郵件 - 這是要走的路還是我遠離基地?

任何指針非常感謝

BR

保羅

+2

不知道你在問什麼,但你可以加入插入到另一個表,以獲得額外的領域,如果這是你想要的。你必須有一個共同的關鍵領域。 – HLGEM

+2

您正處在正確的軌道上 - 在觸發器中進行最少的處理。稍後將複雜的處理留給單獨的批處理作業,該批處理作業將通過「Pod2Email」表進行批處理。這是您應該在其中加入帳戶信息的地方 - 在之後的批處理作業中。通過批處理作業,我的意思是例如一個存儲過程,它處理表Pod2Email,很可能在遊標中,這是從SQL代理作業調用的。簡而言之,請將帳戶信息加入您的後續批處理作業。除非該信息僅在觸發時間可用,否則不要在觸發器中進行。 –

回答

2

你的做法是合理的,但要保證觸發簡單而有效的,特別是:

  1. 您使用的set nocount on好作爲一些應用程序來練習,取決於它們如何寫入可能會被多次報告給他們的行數所混淆。根據rowcount的先前設置,觸發插入將返回適當的行數或無行數。該設置在觸發器終止時自動恢復爲其先前的值(如通常存儲過程一樣)。
  2. 正如@HGLEM在上面的評論中指出的那樣,您可以將其與其他表格一起插入以獲得更多的insert into DML列。
  3. 將觸發器保持爲一系列多行DML語句。 從不在觸發器中使用光標。
  4. 要小心加入繁忙的表格,這些繁忙的表格可能長時間處理長時間運行的鎖定並與之一起工作。這可能會導致觸發器性能不佳,甚至導致死鎖,因爲完成但未提交的插入可能會作爲死鎖受害者回滾。
  5. 我會考慮不直接在目標insert into表上運行遊標,而是通過將「email」光標處理的行選擇到臨時表(甚至可能是表變量)並在該表上運行光標以便避免即使在目標insert into表上長時間運行鎖定的可能性。

祝您的項目順利。

+0

肯 - 非常感謝你的指點 - 給我一些思考的食物 - 我會堅持不懈 - 永遠覺得你已經脫掉了比你可以咀嚼!! ?? – PaulyboyUK