如何从SQL Server触发器调用restful服务

Dav*_*vid 2 c# sql-server rest database-trigger

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

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

  1. 插入触发器 - 服务代理 - 用于调用Web服务的.NET Windows服务
  2. C#CLR触发器直接调用restful服务

我一直在研究选项2并在Visual Studio中创建了一个SQL CLR触发器项目但是在我添加System.Web对项目的引用之后将不会构建并且没有构建错误,而只是在输出窗口中说"构建失败".

是否可以在CLR触发器中使用哪些CLR库?

使用服务代理让我感到害怕,因为我只与服务代理一起处理过一个项目,发现很难实现.

关于如何从触发事件调用Web服务的任何想法将不胜感激.

大卫

mar*_*c_s 7

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

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

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

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

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

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

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