如何从SQL Server触发

时间:2017-07-24 20:25:27

标签: c# sql-server rest database-trigger

我需要使用SQL Server数据库表中的insert事件中的单个参数调用restful Web服务。我知道这不是理想的设计,但我无法控制任何一个终点。在最大负载下,此功能的使用不会超过100个事件/分钟。

我对其他想法持开放态度,但我想出的两个选择是

  1. 插入触发器 - 服务代理 - 用于调用Web服务的.NET Windows服务
  2. C#CLR触发器直接调用restful service
  3. 我一直在研究选项2并在Visual Studio中创建了一个SQL CLR触发器项目,但在我添加对System.Web的引用后,项目将无法构建且没有构建错误,而只是说&#34 ;构建失败"在输出窗口中。

    在CLR触发器中可以使用哪些CLR库有一些限制吗?

    使用服务经纪人让我感到害怕,因为我只与服务经纪人合作过一个项目,发现很难实现。

    如何从触发事件中调用Web服务的任何想法都将不胜感激。

    大卫

1 个答案:

答案 0 :(得分:7)

触发器在语句的上下文和范围内运行,导致触发 - 这意味着,该触发器完全运行之前,该语句不会完成。

触发器应该非常灵活 - 小而快。你永远不应该从触发器调用外部服务,你不应该在触发器中包含游标,你不应该在触发器中进行任何繁重的计算或冗长的计算。

如果你真的必须这样做,我建议采用以下方法:

  • 看到触发器只是将几个值放入"命令" table - 长时间运行的进程需要完成其工作的那些值

  • 有一个解耦,独立的过程(例如存储过程或其他东西),它将检查"命令"定期执行表以完成新任务 - 这可以使用SQL Server代理作业在SQL Server中完成

  • 解耦过程然后从"命令"中获取信息。表,它是否正常工作,并更新数据库(如有必要)

这样,您的触发器很小且灵活且快速完成,因此不会减慢主进程/主系统的速度。漫长的过程是独立的,独立的,并且可以以最合理的方式实现(SQL Server中的存储过程,或单独的独立命令行工具或任何有意义的工具)。