2014-09-30 118 views
0

有誰知道爲什麼這不起作用?這是一個觸發器,用於在插入和更新時檢查字段的值,並從違規行中發送具有id列值的電子郵件。發送郵件的SQL Server 2008觸發器

ALTER TRIGGER [dbo].[DB] 
ON [dbo].[table] 
AFTER INSERT, UPDATE AS 
BEGIN 
IF EXISTS(SELECT 1 FROM inserted WHERE value = 5) 
    BEGIN 
     EXEC msdb.dbo.sp_send_dbmail 
     @recipients = '[email protected]', 
     @profile_name = 'MailProfile', 
     @subject = 'DB.dbo.table trigger', 
     @body = '', 
     @execute_query_database = 'DB', 
     @query = 'USE DB SET NOCOUNT ON SELECT id FROM dbo.table WHERE value = 5'; 
    END 
END 

問題似乎是sp_send_dbmail函數中的@query。當我手動嘗試觸發它時,我收到以下錯誤;

No row was updated. 
The data in row x was not committed. 
Error Source: .Net SqlClient Data Provider. 
Error Message: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
Correct the errors and retry or press ESC to cancel the change(s). 

當我刪除@execute_query_database和@query並添加一些純文本的@body VAR觸發的作品,我收到一封電子郵件。

我也嘗試將@query值改爲一些非常簡單的事情,例如SELECT "Test" as test但這沒有幫助。

我完全新的觸發器,所以如果這個問題是非常明顯......道歉:)

+0

您shoudl不是從觸發發送EMAL。 YOu shoudl將有關電子郵件的信息放入臨時表中,並每隔幾分鐘發送一次這些電子郵件。如果觸發器中有電子郵件,並且電子郵件服務器關閉,則在電子郵件備份之前,您將無法在thr表上添加,更新或刪除記錄。 – HLGEM 2014-09-30 14:22:11

+0

血淋淋的好點的HLGEM! :)如何在嘗試抓包中包裝電子郵件? – Urbley 2014-10-01 11:47:38

+0

贏了;工作。真的,你需要把有關電子郵件的信息放在臨時表中,然後做一個每五分鐘運行一次的工作,以便發送電子郵件。 – HLGEM 2014-10-01 13:15:24

回答

0

你需要分號:

@query = 'USE DB; SET NOCOUNT ON; SELECT id FROM dbo.table WHERE value = 5;'; 
+0

謝謝標籤。我試過了,但我得到了相同的超時錯誤。我也注意到,在觸發失敗後,SQL變得沒有響應。我無法運行任何進一步的查詢,直到我重新啓動SQL Server。在錯誤日誌中似乎也沒有任何用處。還有什麼想法? – Urbley 2014-10-01 11:48:41

+0

HLGEM對於從觸發器發送電子郵件的最佳做法是正確的。但是,我將這個問題視爲學術問題。如果你只是想解決問題,你應該這樣做。也就是說,我的下一步是查看我是否可以單獨執行EXEC msdb.dbo.sp_send_dbmail語句。如果超時,我會爭取DBA和/或網絡管理員來幫助調查爲什麼它不起作用。 – 2014-10-01 13:00:30

+0

我可能最終會將信息存儲在一張單獨的表格中,然後運行一個作業來發送電子郵件,但我仍然想知道它爲什麼不起作用。我以前嘗試在觸發器外部運行SP_SEND_DBMAIL函數,並且它沒有錯誤地工作。 – Urbley 2014-10-02 08:46:58