2011-05-11 35 views
1

我創建了一個觸發器,用於在Aantal字段更改時發送電子郵件,但問題是它不會將刪除並插入的數據放置在電子郵件的正文中。 我被告知這是因爲刪除並插入包含多行。 請建議解決方案「獲取包含更改數據的行」。數據更改時的電子郵件觸發器

IM使用SQL Server 2008R2

CODE:

 --DE TRIGGERT-- 
ALTER TRIGGER [dbo].[RVABestellingenAantalWijzigenTrigger] 
ON [dbo].[RVA_Bestellingen] 
AFTER UPDATE 
AS 
--Vars 
DECLARE @body varchar(500) 
DECLARE @BestellingID int 
DECLARE @CategorieID int 
DECLARE @SubCategorieID int 
DECLARE @AantalOrigineel int 
DECLARE @AantalNieuw int 
DECLARE @LocatieNaam varchar(255) 
DECLARE @ComponentNaam varchar(255) 
DECLARE @CategorieNaam varchar(255) 
DECLARE @SubCategorieNaam varchar(255) 
DECLARE @Datum datetime 

if update(Aantal) /*and (SELECT Datum FROM inserted) = cast(floor(cast(dateadd(day,1,getdate()) as float)) as datetime) */ and (convert(varchar,getdate(),108)>'11:00') 
begin 

    --Zetten aantallen 
    SET @AantalOrigineel   = (SELECT Aantal FROM deleted) 
    SET @AantalNieuw    = (SELECT Aantal FROM inserted) 
    SET @BestellingID    = (SELECT BestellingID FROM inserted) 
    SET @CategorieID    = (SELECT CategorieID FROM inserted)  
    SET @SubCategorieID    = (SELECT SubCategorieID FROM inserted) 

    --Zetten locatienaam en componentnaam 
    SELECT @LocatieNaam = ('RVA Aanpassingen Locatie: '+LocatieNaam), @ComponentNaam=OfficieleNaam, @Datum=Datum 
    FROM RVA_Bestellingen r 
    LEFT OUTER JOIN Locaties l on l.LocatieID = r.LocatieID 
    LEFT OUTER JOIN Componenten c on c.ComponentID = r.ComponentID 
    WHERE r.BestellingID = @BestellingID  


    SELECT @CategorieNaam = Categorie 
    FROM RVA_HoofdCategorie 
    WHERE HoofdCategorieID = @CategorieID 

    SELECT @SubCategorieNaam = Categorie 
    FROM dbo.RVA_SubCategorie 
    WHERE SubCategorieID = @SubCategorieID  

    --Zet boyd 
    SET @body = (
        SELECT 
         'HoofdCategorie: ' + @CategorieNaam+ char(10)+char(13) 
         +'SubCategorie: ' + @SubCategorieNaam+ char(10)+char(13) 
         + 'Componentnaam: ' 
         + @ComponentNaam + char(10)+char(13) 
         + 'Origineel aantal: ' 
         + CAST(@AantalOrigineel as varchar(50)) + char(10)+char(13) 
         + 'Nieuw aantal: ' 
         + CAST(@AantalNieuw as varchar(50)) + char(10)+char(13) 
         + 'Leverdatum: ' + 
         + convert(varchar(50),@Datum,105)      
       ) 

    --Mailen naar Adeline 
    EXEC master..xp_sendmail 
      @recipients = '[email protected]', 
      @message = @body, 
      @subject = @LocatieNaam 
end 
+0

你也可能想更改該電子郵件地址,垃圾郵件發送者抓取這樣的網站來獲取電子郵件地址 – SQLMenace 2011-05-11 13:13:15

回答

4

您理解,觸發火警每批次,而不是每行吧?這通常是一個壞主意。數據轉儲到另一個表,寫檢查表中的每一分鐘的工作,有發送電子郵件

你想扳機,儘可能快地將不被髮送電子郵件

參見:Best Practice: Coding SQL Server triggers for multi-row operations

您的其他選項(這也是一個壞主意)是循環遍歷觸發器的刪除和插入表格併發送郵件的每一行

你也應該使用sp_send_dbmailxp_sendmail,因爲您是在2008年,xp_sendmail的被棄用

正如一個供參考

像這樣

SET @BestellingID    = (SELECT BestellingID FROM inserted) 
SET @CategorieID    = (SELECT CategorieID FROM inserted)  
SET @SubCategorieID    = (SELECT SubCategorieID FROM inserted) 

可以用1來進行選擇

SELECT @BestellingID = BestellingID, 
     @CategorieID = CategorieID, 
     @SubCategorieID = SubCategorieID 
FROM inserted 

無需在執行3查詢...這不會幫助你,因爲你必須爲多行代碼,但只是爲了告訴你,你可以分配多個變量1選擇

+0

謝謝我會試試這個 – 2011-05-11 13:17:00

0

由於您可以修改多行,因此無法僅根據要求獲取更改的數據。

舉例來說,如果你執行以下命令:

UPDATE MyTable 
SET Col2 = Col2 + 1 

每一行都將有col2的增加了一個。你想要哪一行作爲你的例子?

你可以在你選擇的是分配值到頂部的變量使用TOP 1條款,但只有這樣,才能做你想做的是使用WHILE環或光標每行發送一封電子郵件,其中將成爲很多電子郵件的潛在來源。

此外,這是一個相當糟糕的做法,因爲您的所有交易都將在此電子郵件過程中爲每個更新/刪除/插入觸發。

相關問題