我需要使用SQL Server数据库表中的insert事件中的单个参数调用restful Web服务。我知道这不是理想的设计,但我无法控制任何一个终点。在最大负载下,此功能的使用不会超过100个事件/分钟。
我对其他想法持开放态度,但我想出的两个选择是
我一直在研究选项2并在Visual Studio中创建了一个SQL CLR触发器项目,但在我添加对System.Web
的引用后,项目将无法构建且没有构建错误,而只是说&#34 ;构建失败"在输出窗口中。
在CLR触发器中可以使用哪些CLR库有一些限制吗?
使用服务经纪人让我感到害怕,因为我只与服务经纪人合作过一个项目,发现很难实现。
如何从触发事件中调用Web服务的任何想法都将不胜感激。
大卫
答案 0 :(得分:7)
触发器在语句的上下文和范围内运行,导致触发 - 这意味着,该触发器完全运行之前,该语句不会完成。
触发器应该非常灵活 - 小而快。你永远不应该从触发器调用外部服务,你不应该在触发器中包含游标,你不应该在触发器中进行任何繁重的计算或冗长的计算。
如果你真的必须这样做,我建议采用以下方法:
看到触发器只是将几个值放入"命令" table - 长时间运行的进程需要完成其工作的那些值
有一个解耦,独立的过程(例如存储过程或其他东西),它将检查"命令"定期执行表以完成新任务 - 这可以使用SQL Server代理作业在SQL Server中完成
解耦过程然后从"命令"中获取信息。表,它是否正常工作,并更新数据库(如有必要)
这样,您的触发器很小且灵活且快速完成,因此不会减慢主进程/主系统的速度。漫长的过程是独立的,独立的,并且可以以最合理的方式实现(SQL Server中的存储过程,或单独的独立命令行工具或任何有意义的工具)。