从触发器发送电子邮件

Jam*_*uma 20 email triggers sql-server-2008-r2

我正在尝试开发邮件触发器.有人可以协助如何实现这一点,以便当用户插入记录时,它会检查"速度"字段,以便当插入的值超过100时,将邮件发送到指定的地址.

Aar*_*and 51

首先,您需要设置数据库邮件 - 如果您还没有这样做,这个问题可能会有所帮助:

然后你需要一个触发器:

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 = 'whoever@yourcompany.com', 
          @profile_name = 'default',
          @subject = 'Someone was speeding', 
          @body = 'Yep, they sure were.';
    END
END
GO
Run Code Online (Sandbox Code Playgroud)

现在,您可能会说您希望插件中的数据实际包含在电子邮件中.你的第一个倾向是声明一些局部变量并从中分配它们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 = 'whoever@yourcompany.com', 
          @profile_name = 'default',
          @subject = 'At least one person was speeding', 
          @body = @body;
    END
END
GO
Run Code Online (Sandbox Code Playgroud)

总而言之,我不是从触发器发送电子邮件的忠实粉丝.即使数据库邮件使用服务代理也是异步的,我更倾向于填充队列表,并且有一个后台线程,并发送所有相应的电子邮件.关于这两件事的两件好事是:

  1. 您最小化了提交触发触发器的外部事务的潜在延迟 - 触发器中的逻辑越复杂,您执行该过程的速度就越慢.
  2. 由于电子邮件可能不是必需的,微秒插入行,你可以很容易地调整后台处理的时间 - 这样就可以避免必须在非常短的时间内查看表格永远不得不做任何事情.
  3. 作为@goodeye指出,保持此过程分开,可以防止在这个过程中的电子邮件部分错误从原来的DML干扰(在他们的情况下,无效的参数sp_send_dbmail-这是我无意中建议-防止插入).