繁体   English   中英

多表SQL触发电子邮件更新

[英]Multiple table SQL trigger an email to update

好的,可以肯定的在这里很近,但是现在它在一次记录更新中发送大量电子邮件了吗? 我知道我在这里想念什么。 首先要对准光标,所以我猜我在那儿做错了什么? 一如既往,感谢您的帮助!

create trigger eMailScheduleChange on dbo.BOOKINGS after update as

set nocount on;

Declare EmailCursor Cursor read_only for
    select r.Name as RName
    , c.Name as CName
    , i.BookingTypeId
    , i.Start
    , i.Finish
    , r.Email
from Wallchart.dbo.BOOKINGS b
inner join Wallchart.dbo.CUSTOMERS c on b.CustomerId = c.CustomerId
inner join Wallchart.dbo.RESOURCES r on b.ResourceId = r.ResourceId
inner join Inserted i on i.CustomerId = b.CustomerId
where i.BookingTypeId <> b.BookingTypeId 

Declare @Email as varchar(50)
Declare @CName as varchar(100)
Declare @Start as datetime
Declare @RName as varchar (100)
Declare @Finish as datetime
Declare @body as varchar (255)
Declare @BookingTypeId as varchar (50)

open EmailCursor
Fetch next from EmailCursor
INTO @Email, @CName, @Start, @RName, @Finish, @BookingTypeId
While @@FETCH_STATUS=0

BEGIN

    Set @body = '<Account cancelled>' + @CName + @Start + @Finish

EXEC msdb.dbo.sp_send_dbmail

@profile_name = 'SQLMail',
@recipients = @Email,
  @subject = 'Account Update',
  @body = @body

FETCH NEXT FROM EmailCursor INTO @Email, @CName, @Start, @RName, @Finish,       @BookingTypeId
SET NOCOUNT OFF
END
Close EmailCursor
Deallocate EmailCursor

SQL Server不支持从脚本直接邮寄。 但是您还有其他选择。

首先,创建一个表以捕获要更改的记录,并设置一个EmailFlag,以便您可以识别是否已将该更改通知给该用户。

创建一个存储过程,该过程将为您提供经过一些更改但未通过电子邮件通知的所有用户的列表(EmailFlag =“ N”或类似的内容)

现在,使用SSIS创建发送邮件任务,以为所有这些用户发送详细信息电子邮件。

发送完每个用户的电子邮件后,可以将该记录的EmailFlag更新为“ Y”。 您可以使SSIS包成为SQL Server中的计划作业,以便它在特定间隔之间自动运行。

您可以为SSIS中的每个循环容器使用,以便可以将邮件分别发送给每个收件人

请参考以下链接以获取更多详细信息SSIS-如何配置发送邮件任务

我认为也许您有一种印象,即不允许触发器中的查询从另一个表读取数据。 事实并非如此,否则触发器将毫无用处。 以下是触发器外观的存根。 我演示了如何获取所需的信息。 从那里只需调用sp_send_dbmail。

create trigger MyTrigger on dbo.BOOKINGS for update as
    set nocount on;

    select r.Name
        , c.Name
        , i.BookingTypeId
        , i.Start
        , i.Finish
        , r.Email
    from Schedule.dbo.BOOKINGS b
    inner join Wallchart.dbo.CUSTOMERS c on b.CustomerId = c.CustomerId
    inner join Schedule.dbo.RESOURCES r on b.ResourceId = r.ResourceId
    inner join Inserted i on i.SomeKeyValue = b.SomeKeyValue
    where i.BookingTypeID <> b.BookingTypeID

    --Now you can see how to capture all the information. All that is left is to call sp_send_dbmail
    --https://msdn.microsoft.com/en-us/library/ms190307.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM