我正在尝试开发邮件触发器。是否有人可以协助实现这一点,以便当使用插入记录时,检查“速度”字段,以便当插入的值超过100时,邮件将发送到指定的地址。从触发器发送电子邮件
14
A
回答
37
首先,你需要建立数据库邮件 - 如果你还没有这样做,这个问题可能会有所帮助:
然后,你需要一个触发:
CREATE TRIGGER dbo.whatever
ON dbo.wherever
FOR INSERT
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS (SELECT 1 FROM inserted WHERE speed > 100)
BEGIN
EXEC msdb.dbo.sp_send_dbmail
@recipients = '[email protected]',
@profile_name = 'default',
@subject = 'Someone was speeding',
@body = 'Yep, they sure were.';
END
END
GO
现在,您可能会说,您希望插入的数据实际上包含在电子邮件中。你的第一个倾向将是声明一些局部变量,并从inserted
分配它们 - 这不起作用,因为你的触发器可能会响应多行插入。所以正确的方法是:
CREATE TRIGGER dbo.whatever
ON dbo.wherever
FOR INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @body NVARCHAR(MAX) = N'';
SELECT @body += CHAR(13) + CHAR(10) + RTRIM(some_col) FROM inserted;
IF EXISTS (SELECT 1 FROM inserted WHERE speed > 100)
BEGIN
EXEC msdb.dbo.sp_send_dbmail
@recipients = '[email protected]',
@profile_name = 'default',
@subject = 'At least one person was speeding',
@body = @body;
END
END
GO
这一切都说,我不是从触发器发送电子邮件的大扇子。即使数据库邮件使用服务代理,因此也是异步的,但我更倾向于填充队列表,并有一个后台线程来发送并发送所有适当的电子邮件。关于这个 3的好东西是:
- 您最大限度地减少在提交触发触发器外部事务的潜在延迟 - 更复杂的在触发逻辑,慢你作出这样的过程。
- 因为发送电子邮件可能并不是必要的,所以在插入行时微秒,您可以轻松地调整后台进程的时间 - 这样可以避免必须在非常少的时间它将永远不得不做任何事情。
- 作为@goodeye指出的那样,保持此过程分开,能够防止在该方法的电子邮件部分误差从与所述原始DML干扰(在他们的情况下,为了
sp_send_dbmail
无效的参数 - 我建议无意中 - 防止插入)。
相关问题
- 1. 触发失败发送电子邮件
- 2. 发送电子邮件从
- 3. Hana云平台电子邮件触发器不发送电子邮件
- 4. 基于mongodb(查询)触发器事件发送电子邮件
- 5. 上的触发发送邮件的发生(和电子邮件犯规发送)
- 6. 发送电子邮件操作不发送电子邮件
- 7. PHP发送电子邮件多次发送电子邮件
- 8. 插入触发器后如何使用发送电子邮件
- 9. 为什么INSERT触发器只发送一封电子邮件?
- 10. 是否可以使用MySQL触发器发送电子邮件?
- 11. 如何从数据库自动触发电子邮件发送
- 12. 电子邮件不触发
- 13. Jenkins的电子邮件触发器和回复电子邮件
- 14. 确定电子邮件发件人并发送电子邮件
- 15. 发送电子邮件Godaddy
- 16. 发送电子邮件proble
- 17. PHP发送电子邮件
- 18. 发送电子邮件nodemailer
- 19. aspx:发送电子邮件
- 20. 发送电子邮件
- 21. django发送电子邮件
- 22. IIS7 - 发送电子邮件
- 23. SparkPost发送电子邮件
- 24. 发送电子邮件
- 25. 发送电子邮件Progrmmatically
- 26. 发送电子邮件?
- 27. 发送电子邮件
- 28. 发送HTML电子邮件
- 29. vb.net发送电子邮件
- 30. SpringMVC发送电子邮件
如果msdb.dbo.sp_send_dbmail运行在应用中,您还需要为用户授予EXECUTE。 – smoore4