我有四个表:
活动:
ActivityID(PK) ActivityName CustomerID(FK) UserId(FK)
1 Lead Gen 1st 50 U1
2 Lead Gen 2nd 60 U2
客户:
CustomerID(PK) CustomerNumber CustomerName
50 C0150 cust50 ltd
60 C0160 cust60 ltd
用户:
UserID(PK) UserName Email
U1 Mr. X [email protected]
U2 Mr. Y [email protected]
UserActivity:
UserActivityID(PK) UserID(FK) ActivityID(FK)
888 U1 1
889 U2 2
如果要在Activity
表(SQL Server 2008-R2)中插入任何内容,则我想向与该活动相关的用户(即ActivityId:1)发送电子邮件(即Email:[email protected])。
电子邮件正文应包含ActivityId
,ActivityName
,CustomerNumber
和CustomerName
。
触发器必须执行上述操作,并且结果应类似于电子邮件中的内容:
ActivityID:1, ActivityName:Lead Gen 1st created for CustomerNumber: C0150 & CustomerName: cust50 ltd
这是我的代码:
CREATE TRIGGER [dbo].[Activity_Insert_Mail_Notification]
ON [dbo].[Activity]
AFTER INSERT
AS
BEGIN
DECLARE @ActivityID varchar(2000)
DECLARE @ActivityName varchar (2000)
Select @ActivityID=inserted.ActivityID,@ActivityName=inserted.ActivityName
From inserted
DECLARE @CustomerNo varchar(2000)
DECLARE @CustomerName varchar(2000)
Select @CustomerNo = B.[CustomerNumber]
,@CustomerName= B.[CustomerName]
from [dbo].[Activity] A
inner join [dbo].[Customer] B
on A.[CustomerID]=B.[CustomerID]
DECLARE @email VARCHAR(2000)
SELECT @email = RTRIM(U.[Email]) + ';'
FROM [dbo].[Activity] A
left join [dbo].[UserActivity] UA
inner join [dbo].[User] U
on UA.[UserID]=U.[UserID]
on A.[ActivityID]=UA.[ActivityID]
WHERE U.[Email]<> ''
DECLARE @content varchar (2000)
= 'ActivityID:' + @ActivityId + ' '
+ ',ActivityName:' + @ActivityName + ' '
+ 'has been created for' + 'CustomerNumber: ' + @CustomerNo
+ ' ' + '&CustomerName: ' + @CustomerName
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'LEADNOTIFY'
,@recipients = @email
,@subject = 'New Lead Found'
,@body = @content
,@importance ='HIGH'
END
问题出在我的代码中,我无法从相应的表中正确获取客户数据和电子邮件。
我在下面编写了一些代码,这些代码将遍历所有受影响的行并为每行发送一封电子邮件。
但是,在您阅读之前,我强烈建议(如@HABO所评论的那样)使用其他方法。触发器适合某些任务,但是使用触发器时要记住两个关键事项:
发送电子邮件是在触发器内完成的一件可怕的事情,因为被迫等待SMTP服务器响应并不罕见。如果您希望触发电子邮件,更好的方法是使用触发器将电子邮件数据插入到队列表中,然后在其他地方提供一项服务,以使这些电子邮件出队并发送。
除了下面的代码,所有这些都显示了您要执行RBAR操作时处理Inserted
pseudo-table的一种方法。因为在SQL Server中,Inserted
伪表(和Inserted
伪表)将包含受操作影响的行数,即0-N。我也希望加入您的表以正确获取所需的信息。
Deleted