带有连接的SQL触发器,用于发送电子邮件通知

时间:2018-02-14 13:48:56

标签: sql-server sql-server-2016

我希望每次创建记录时在表上运行一个插入触发器,并在我正在寻找特定的critereia时发送电子邮件通知。但是,标准基于与另一个表的连接。如何使用插入触发器进行设置?

以下是在callforservice表中创建记录时需要运行的查询:

SELECT dbo.CallForService.CreateDateTime, dbo.CallForService.CommonName, 
dbo.CallLog.Description
FROM dbo.CallForService LEFT OUTER JOIN
dbo.CallLog ON dbo.CallForService.CFSID = dbo.CallLog.CFSID
WHERE(dbo.CallForService.CallTypeID = 80) and description like %ABL%'

然后我将使用sql邮件通过电子邮件发送这3个字段。

我该如何设置呢?

1 个答案:

答案 0 :(得分:0)

有一些解决方案,但是,正如我们在评论中所说,使用TRIGGER发送电子邮件是一个糟糕的主意。这意味着任何可能导致触发器触发的人都需要使用sp_send_dbmail的权限,并且还可以使用您从中发送电子邮件的特定个人资料。

此外,如果电子邮件无法发送,无论出于何种原因(可能是您的邮件服务器已关闭,或者没有及时响应),那么该事务将被回滚。这意味着任何INSERTUPDATE(导致触发器触发)也将被回滚,并且错误将返回用户/应用程序。

我个人的偏好是使用日志表来存储您通过电子邮件发送的记录的详细信息(根本没有触发器)。让进程通过电子邮件发送相关记录的详细信息,并记下这些记录的ID。如果您需要为每条记录发送单独的电子邮件,则可能需要使用CURSOR来执行此操作,但这不是一件坏事。实际上,这就是游标的用途。

这是PSEUDO T-SQL,但是,应该让您了解您可能想要做的过程。

--DECLARE CURSOR
DECLARE CallLog_email CURSOR FOR
SELECT [RelevantColumns] --you'll need to put all the columns you need here
FROM dbo.CallForService CFS
WHERE CFS.CallTypeID = 80
  AND CFS.[description] like '%ABL%'
  AND CFS.[ID COLUMN] NOT IN (SELECT sq.[ID COLUMN]
                              FROM dbo.CallForService_EmailLog sq); --This table won't exist at the moment

OPEN CallLog_email;

FETCH NEXT FROM CallLog_email
INTO @ID, @Email, @Name, @OtherVariablesYouNeed; --Again, you'll need variables for your relevant columns

WHILE @@FETCH_STATUS = 0 BEGIN

    --Send email to person(s). This is your email process here.

    INSERT INTO dbo.CallForService_EmailLog ([ID COLUMN], TimeEmailed)
    VALUES (@ID, GETDATE());

    FETCH NEXT FROM CallLog_email
    INTO @ID, @Email, @Name, @OtherVariablesYouNeed;

END

CLOSE CallLog_email;
DEALLOCATE CallLog_email;

如果您要以表格格式发送所有数据,那么就不需要CURSOR;我非常猜测你的需求是什么。您仍然需要登录到另一张桌子。

另一种方法是先通过触发器将数据插入到Log表中,然后在发送电子邮件后更新这些行;但是这种方法看起来更清晰,因为触发器可能会导致比解决方案更多的问题(如果设计得很差)。