-1

我正在寻找一种向在 Web 应用程序中创建新记录的用户发送电子邮件(或提醒/确认)的方法,然后将其插入表中。基本上是一种发送电子邮件的动态方式。

我一直在网上阅读有关触发器和数据库邮件的信息,这种方法似乎有很多缺点。

有没有人对实现这一目标的最佳方法有任何建议?

Flow: New Record Inserted into DB Table ->>> 此时在应用程序中创建记录的用户的电子邮件地址应该会收到一封邮件(基本上是一封确认邮件)。

我已经尝试过的:

数据库邮件已配置并正在运行。我已经制作了以下触发器(非常基本),但是以这种方式使用触发器在线阅读会导致我的数据库的负载/性能问题。

但我不确定如何生成电子邮件和插入的最后一条记录。

CREATE TRIGGER [dbo].[INSERT_Trigger] ON [dbo].[Entity]

FOR INSERT
AS


EXEC msdb.dbo.sp_send_dbmail

   @profile_name = 'DBMail',

@recipients = 'admni@domain.com', ####Here I would need dyncamic emails based on what user enters the new record which are stored in the same table

@query = 'Select Description From Entity where 'Last inserted record'####Here I would need the last record for that user entered

@subject = 'Subject' ,

@Body = 'Message Body',

@importance = 'High',
4

2 回答 2

1

恕我直言,这种方法是一个设计缺陷:数据库层应该是层树的叶子之一。MS SQL Server 实际上是一个应用程序服务器并且支持这些东西的事实是一个遗留问题,但我认为不应该使用它。

乍一看:

  • 您可能需要切换到另一个 RDBMS
  • 您的生产环境可能出于任何原因不支持 SMTP
  • 由于各种原因,您发送邮件的尝试可能会失败 - 导致用户没有收到通知并且不再尝试

是的,确实,您甚至可以将 SQL Server 用作消息总线,但这不是一种高效的总线。这个概念实际上是发送“需要通知”类型的事件。事件被实现为插入,触发器是消费者。但是该事件是在您的应用程序内部的更高层中产生的。为什么不在那里对它做出反应?或者,仅将数据库用作队列:将详细信息存储在那里,但以您拥有更多控制权的方式处理它们。

您尚未告诉我们您正在创建的应用程序,但我会创建一个单独的后台任务(实现可能因应用程序设计而异 - 可以是操作系统级别的计划任务、Windows 服务或应用程序中的后台工作人员) 定期检查尚未发送的邮件,并尝试发送它们,并将结果存储在记录中。根据负载,事情当然可能会变得更加复杂。但是这样你可以重试,你肯定会承担数据库服务器的负载,但至少你有可能这样做。

于 2019-08-29T11:49:46.367 回答
0

我有一个按你的要求工作的触发器首先从插入的表中插入临时表中的记录其次,声明你需要的参数第三,在你的触发器中添加一个游标并从临时表的游标中获取你需要的参数在触发器内部你可以声明收件人正如你所需要的那样,查询和其他东西

CREATE TRIGGER Trigger  ON [Entity]
FOR INSERT
not for replication
AS

select ins.* into #temp from inserted ins

declare @Param1 integer, @Param2 integer
declare cursor forward only for
select Col1, Col2 from #temp order by Col1
open cursor
fetch next from cursor into @Param1, @Param2
while @@fetch status = 0
begin

declare @recipients varchar (max), @query varchar(max)

select @recipient = Col1 -- or whatever col contains the recipient address
from #temp
where Col1 = @Param1 

select @query = description
from #temp
where Col2 = @Param2 -- or whatever condition give u the description for parameter

exec sp_send_dbmail
@profile_name = 'profile',
@recipients = @recipient 
@subject = 'Subject' ,
@Body = @query, 
@importance = 'High'


fetch next from cursor into @Param1, @Param2 
end
close cursor 
deallocate cursor 

drop table #temp

--- 请注意,正文可以格式化为 html 格式,如下所示

declare @body varchar(max)
select @body = '<html><body>'
select @body = @body+'Hello'+'<b><b>'
select @body = @body+'Here is the description:'+@query+'<b><b>'
select @body = @body+'Regards'
select @body = @body+'</body></html>'
于 2020-12-10T11:10:41.557 回答