【发布时间】:2017-03-21 18:39:12
【问题描述】:
好的,这里肯定更近了,但现在它会在一次记录更新中发送大量电子邮件?我知道我在这里遗漏了一些东西。第一次射击光标,所以我猜我在那里做错了什么?一如既往,感谢您的帮助!!
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
【问题讨论】:
-
您应该做的第一件事是停止在任何地方使用 "。这会使阅读变得更加困难,并且实际上可能会导致问题。此外,如果您要使用表别名,您实际上应该提供不同的名称或者提供别名是没有意义的。这就像说你的名字是 Travis(又名 Travis)。
-
现在...您的实际问题是什么?在我看来,如果您需要在 BookingTypeID 更改时发送电子邮件,您将在 BOKINGS 上创建触发器。这似乎是保存 BookingTypeID 的表。
-
我明白,那里有奇怪的习惯力量。正确,当 BookTypeId 更改时,它在 bookings 表中更改。但是,客户名称在客户表中,资源名称和电子邮件在资源表中。使用触发器,我可以向自己发送一封电子邮件并说它已更改,但我不知道客户名称、资源是谁等。因此,如果预订类型 ID 已更改,请通过电子邮件发送资源电子邮件、客户名称和预订开始。
-
那么触发器在逻辑上只能属于BOOKINGS表吧?您希望它触发的时间是值更改的时间。您希望触发器发送电子邮件吗?为什么不能简单地将这个查询放在触发器中以检索您需要的值?没有规定触发器内的代码只能引用自身。
标签: sql sql-server triggers sql-server-2008-r2 automation