使用SQL Server 2008通过CLR enable(c#dll)发送电子邮件有多聪明?

使用SQL Server 2008通过CLR enable(c#dll)发送电子邮件有多聪明?,c#,sql-server,software-design,C#,Sql Server,Software Design,我的问题是关于抽象软件工程师的观点: 假设我想在每次将行插入表后发送一封电子邮件 哪一种方法更聪明,更“按部就班” 创建将发送邮件的C#/CLR程序集 在SQL Server中启用CLR 在插入后创建触发器,使用该程序集的函数发送邮件 或 在C#应用程序本身中,插入到DB后发送电子邮件 如果要从服务器发送电子邮件(而不是编写自己的解决方案),请使用,这是SQL Server的内置电子邮件解决方案 这至少可以确保邮件的传递相对于事务的其余部分是异步的,因此从触发器或存储过程调用邮件是安全的,如果邮

我的问题是关于抽象软件工程师的观点:

假设我想在每次将行插入表后发送一封电子邮件

哪一种方法更聪明,更“按部就班”

  • 创建将发送邮件的C#/CLR程序集
  • 在SQL Server中启用CLR
  • 在插入后创建触发器,使用该程序集的函数发送邮件
  • 在C#应用程序本身中,插入到DB后发送电子邮件
  • 如果要从服务器发送电子邮件(而不是编写自己的解决方案),请使用,这是SQL Server的内置电子邮件解决方案

    这至少可以确保邮件的传递相对于事务的其余部分是异步的,因此从触发器或存储过程调用邮件是安全的,如果邮件传递需要一段时间才能成功,则不会中断这两个过程


    至于现在,您是否应该使用它,从触发器或存储过程调用,还是在应用程序中执行工作,这取决于您是否更习惯使用它。在这两种情况下,你都需要考虑各种失败条件,而不仅仅是快乐的路径。如果SQL部分成功,然后应用程序在发送电子邮件之前崩溃(或通过任务管理器被杀死),那么失败的严重程度如何?如果要从服务器发送电子邮件(而不是编写自己的解决方案),您需要采取哪些缓解措施?

    使用SQL Server的内置电子邮件解决方案

    这至少可以确保邮件的传递相对于事务的其余部分是异步的,因此从触发器或存储过程调用邮件是安全的,如果邮件传递需要一段时间才能成功,则不会中断这两个过程



    至于现在,您是否应该使用它,从触发器或存储过程调用,还是在应用程序中执行工作,这取决于您是否更习惯使用它。在这两种情况下,你都需要考虑各种失败条件,而不仅仅是快乐的路径。如果SQL部分成功,然后应用程序在发送电子邮件之前崩溃(或通过任务管理器被杀死),那么失败的严重程度如何?你需要采取什么样的缓解措施?

    < P>一件事要考虑的是电子邮件的意图和目的。如果在发生异常或警告情况时发送一条小的维护消息,那么在卷不高的情况下,同步机制可能是最简单的解决方案


    但是,如果您需要发送高质量的报告(例如带有个性化HTML的PDF),则建议您将“要发送的邮件”的任务排队,例如在表格中,然后异步创建和发送电子邮件,例如使用SSR、Crystal等。这还具有更好的审计跟踪和更改渠道的能力(例如,打印而不是电子邮件)而不破坏SQL“排队”机制。

    < P>一个要考虑的事情是电子邮件的目的和为谁。如果您发送一个小的维护消息,如果出现异常或警告条件,那么同步机制可能是最简单的解决方案,如果卷不高。


    但是,如果您需要发送高质量的报告(例如带有个性化HTML的PDF),则建议您将“要发送的邮件”的任务排队,例如在表格中,然后异步创建和发送电子邮件,例如使用SSR、Crystal等。这还具有更好的审计跟踪和更改渠道的能力(例如,打印而不是电子邮件)而不破坏SQL“排队”机制。

    我同意Damien的观点,如果你真的想在数据库内部进行操作,你应该使用数据库邮件

    我的建议是无论如何从你的C#应用程序开始,因为我认为从那里你有更好的控制

    如果您在某个时间一次或在多个连续事务中插入100000条记录,该怎么办

    通过您的代码发送电子邮件(在.NET中使用SMTP邮件非常容易),您可以有适合您所有要求的方法,一些方法在一次插入后发送电子邮件,另一些方法在一系列插入完成后发送邮件

    一般来说,我也有点反对触发器,我更喜欢让数据库单独运行,除了存储的进程不让它做太多;调试和跟踪/跟踪/记录客户端(或服务器).NET应用程序中发生的事情要容易得多


    这是我的两分钱,每个人都可以有不同的方法。

    我同意Damien的观点,如果你真的想在数据库内部进行操作,你应该使用数据库邮件

    我的建议是无论如何从你的C#应用程序开始,因为我认为从那里你有更好的控制

    如果您在某个时间一次或在多个连续事务中插入100000条记录,该怎么办

    通过您的代码发送电子邮件(在.NET中使用SMTP邮件非常容易),您可以有适合您所有要求的方法,一些方法在一次插入后发送电子邮件,另一些方法在一系列插入完成后发送邮件

    一般来说,我也有点反对触发器,我更喜欢让数据库单独运行,除了存储的进程不让它做太多;调试和跟踪/跟踪/记录客户端(或服务器).NET应用程序中发生的事情要容易得多

    这是我的两分钱,每个人都可以有不同的方法