有誰知道爲什麼這不起作用?這是一個觸發器,用於在插入和更新時檢查字段的值,並從違規行中發送具有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
但這沒有幫助。
我完全新的觸發器,所以如果這個問題是非常明顯......道歉:)
您shoudl不是從觸發發送EMAL。 YOu shoudl將有關電子郵件的信息放入臨時表中,並每隔幾分鐘發送一次這些電子郵件。如果觸發器中有電子郵件,並且電子郵件服務器關閉,則在電子郵件備份之前,您將無法在thr表上添加,更新或刪除記錄。 – HLGEM 2014-09-30 14:22:11
血淋淋的好點的HLGEM! :)如何在嘗試抓包中包裝電子郵件? – Urbley 2014-10-01 11:47:38
贏了;工作。真的,你需要把有關電子郵件的信息放在臨時表中,然後做一個每五分鐘運行一次的工作,以便發送電子郵件。 – HLGEM 2014-10-01 13:15:24