【问题标题】:SQL Server to send email notifying of data inserted into table - options?SQL Server 发送电子邮件通知插入表中的数据 - 选项?
【发布时间】:2012-03-21 22:30:05
【问题描述】:

我有一个在多个 ASP.NET (VB.NET) 网站之间共享的 SQL Server 数据库,该数据库有一个存储客户查询的表 - 我希望提供电子邮件通知,通知组织内相关人员的新查询(并可能将一些查询数据放入电子邮件正文中)。请有人概述一下我的选项如何实施?

我的想法是:

  1. SQLMail
  2. 数据库邮件
  3. VB.NET 存储过程使用 System.Net.Mail 库?
  4. 其他选项?

选项 3 似乎是可取的,因为我知道如何在 VB.NET 中执行此操作,而且很简单。

  • 我还有哪些其他选择?
  • 有什么注意事项?
  • 我可以实时执行此操作,即触发(插入量低)吗?
  • 还是分批完成(即作业)是否至关重要?

非常欢迎任何帮助! 谢谢。

【问题讨论】:

  • 数据库邮件的拦截器是什么?这肯定比 CLR 更容易设置。
  • 我对数据库邮件进行了一些研究,但我不确定是否需要连接到电子邮件服务器来发送电子邮件 - 如果是这种情况,那么我不能这样做因为它与我们的网络服务器是分开的。我熟悉如何从 VB.NET 发送电子邮件,因为我们在一个 ASP.NET (VB.NET) 网站上执行此操作,并且实际上发件人是“欺骗”的,但它不是垃圾邮件,因为它是内部的并且 DNS 记录确实包含网络服务器 IP 地址!
  • 您可以在任何服务器上(包括 SQL Server 框或 Web 服务器上)设置简单的 SMTP 服务器。如果您不想使用 IIS 功能,还有其他可用的轻量级解决方案。你的 VB.NET 代码最终还是要连接到一个 SMTP 服务器,为什么 SQL Server 不能连接到同一个 SMTP 服务器?
  • 我认为 ASP.NET (VB.NET) 代码使用“本地主机”电子邮件服务器 - 这可以从数据库邮件中获得吗?我对电子邮件服务器的了解有点零散……
  • 那么 SQL Server 框必须使用 Web 服务器的实际内部 IP 地址或 DNS 名称(而不是“localhost”)。这可能意味着您需要在 Web 服务器上打开该端口以允许 SQL Server 框使用该 SMTP 服务器,但这并不是非常复杂。

标签: sql-server tsql stored-procedures clrstoredprocedure database-mail


【解决方案1】:

在 1)、2) 和 3) 之间,唯一值得考虑的是 2)。 1) 是一个死产,使用一个因其问题和问题而臭名昭著的已弃用功能。 3) 是个坏主意,因为它破坏了事务一致性(发送 SMTP 邮件即使插入回滚)并且由于调用者(大概是您的网页正在呈现)必须等待而导致性能消耗直到 SMTP 交换完成(即同步)。只有 2) 提供事务一致性并且是异步的(在 SMTP 完成之前不会阻塞调用者)。

虽然这样的任务通常最好委派给 Reporting Services 任务。您将使用email delivery 创建一个Data-Driven subscription。这开箱即用,无需重新发明轮子。

【讨论】:

  • 感谢您的回复。它绝对需要是异步的!即使交易回滚,我也不太担心发送电子邮件 - 这是不可取的,但不会在公司内部造成问题。所以选项 2 看起来是最好的选择。不过我有几个问题 - 我认为我们只有 SQL Server 标准版,我无法连接到电子邮件服务器来发送电子邮件 - 我必须“欺骗”发件人,但它不是垃圾邮件,因为它只是内部和DNS 电子邮件记录确实有服务器 IP 地址。
  • 你说 3) 不好,因为即使插入回滚也会发送 SMTP 邮件。它与 2) 有何不同?就是说,我同意你的观点,但你让它听起来像是 3) 的一个骗局,而不是任何其他选项。
  • @Aaron:数据库邮件将“邮件”作为 Service Broker 消息发送到 [msdb] 中的 db 邮件队列中。如果事务提交,则“消息”由数据库邮件外部代理接收并传递。如果它回滚,则 SSB 消息将回滚,并且数据库邮件代理永远不会看到它。这在technet.microsoft.com/en-us/library/ms175887.aspx 中有描述。
  • 所以你是说如果你在触发器中再做 15 件事,邮件会一直等到触发器成功完成?这听起来并不像我被引导相信的那样异步......
  • @Chris:标准版支持数据库邮件(即选项2),请参阅Features Supported by the Editions of SQL Server 2008 R2
【解决方案2】:

我遇到过与此类似的情况,我采用的解决方案是让 C# Windows 服务每分钟检查一次 SQL Server 作业队列。此作业队列将包括诸如发送电子邮件之类的作业。然后,您可以在您的表上使用 TRIGGER 插入一个新的“电子邮件警报”作业,该作业将在下一个周期被拾取。

【讨论】:

  • 这听起来很复杂,如果我知道怎么做,我会这样做 - 没有更简单但同样安全的选择吗?
  • 您的选项 3,使用 CLR 存储过程是我能想到的唯一其他方法,而且 CLR 过程可能与我上面的建议一样难以实现。更简单的版本是控制台应用程序,它还检查 SQL Server 中的“JobQueue”表,并使用 Windows 调度程序每分钟运行一次。
  • 为什么控制台应用程序比调用数据库邮件的简单 SQL Server 代理作业更简单?更多活动部件 = 更多故障点。依赖任务调度程序(直到 W8 才真正集群化)可能不是更好或更简单恕我直言。
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多