有谁知道为什么这不起作用?这是一个触发器,用于在插入和更新时检查字段的值,并从违规行中发送具有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