2014-09-30 45 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