2015-12-03 112 views
-3

我試圖創建一個只有在插入時才發送電子郵件的觸發器。我目前收到一封電子郵件,看看是否有插入內容,我希望只在表格中有插入內容時纔會收到電子郵件。下面是觸發當前的模樣在SQL Server中只插入觸發器

ALTER TRIGGER [dbo].[myTriggerName] 
ON [dbo].[myTableName] 
AFTER INSERT 
AS 
BEGIN 

    EXEC msdb.dbo.sp_send_dbmail 
     @recipients = 'MyRecipients', 
     @profile_name = 'DBAdmins', 
     @subject = 'MySubject', 
     @body = 'Body'; 


END 
+1

向我們展示你有什麼完成。請閱讀[** How to ask **](http://stackoverflow.com/help/how-to-ask) \t \t \t \t \t [**如何創建一個最小,完整和可驗證的示例。 **](http://stackoverflow.com/help/mcve) –

+0

那麼當你嘗試創建這樣一個觸發器時你面臨什麼問題? –

+0

請提供您的觸發功能代碼。 –

回答

1
CREATE TRIGGER dbo.trg_I_tbl 
    ON dbo.tbl 
    AFTER INSERT 
AS 
BEGIN 

    SET NOCOUNT ON; 

    DECLARE @text NVARCHAR(MAX) 

    SELECT @text = STUFF((
     SELECT ', ' + col 
     FROM INSERTED 
     FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') 

    EXEC msdb.dbo.sp_send_dbmail 
     @recipients = '[email protected]', 
     @subject = 'caption', 
     @body = @text 

END 
GO 
+5

我會*非常小心*將廣泛的處理或諸如將電子郵件直接發送到觸發器之類的東西。觸發器在調用事務的上下文中執行,從而延遲該事務的完成,直到觸發完成。如果你有外部依賴關係,你可以很快進入你有超時等情況。觸發器應該是**非常靈活和小** - 記錄到一個單獨的表EmailToSend並有一個單獨的進程(計劃在每小時)檢查該表併發送電子郵件 –

3

我會非常小心,把大量的處理或之類的東西,直接發送電子郵件到一個觸發器。

觸發器在調用事務的上下文中執行,因此會延遲該事務的完成,直到完成爲止。

如果你有外部依賴(如SMTP服務器),可以快速進入,你必須超時等

觸發應該是非常靈活的,小而快的情況。

我的建議是:

  • 記到一個單獨的表EmailToSend所有你需要(收件人,主題,正文,日期存儲)

    CREATE TRIGGER trgYourTableInsert 
    ON dbo.YourTable 
    AFTER INSERT 
    AS 
        INSERT INTO dbo.EmailToSend(Recipient, Subject, Body) 
        VALUES('[email protected]', 'Hello there', '.......') 
    
  • 掌握必要的信息一個單獨的進程(例如一個每小時運行一次的預定存儲過程)檢查該表並進行電子郵件的實際發送(不會阻塞任何其他進程/事務),這些過程如下所示:

    SELECT (list of columns) 
    FROM dbo.EmailToSend 
    WHERE DateSent IS NULL 
    

    或類似的東西 - 它確實在很大程度上取決於什麼究竟你把成表,你想怎麼處理這個....

+0

請您可以編寫將檢查EmailToSend表的存儲過程嗎?謝謝 – TJL