2017-07-24 21 views
0

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

我接受其他想法,但我提出的两个选择是;

  1. INSERT触发器 - 服务代理 - .NET Windows服务来调用Web服务
  2. C#CLR触发调用RESTful服务直接

我一直在努力选项2并创建了一个SQL CLR触发器项目在Visual Studio中,但在添加引用到System.Web后,项目不会生成,并且没有生成错误,只是在输出窗口中显示“生成失败”。

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

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

有关如何从触发器事件调用Web服务的任何想法将不胜感激。这意味着,该语句不会完成,直到触发完全运行 -

大卫

+2

为什么你需要在SQL CLR触发器中引用'System.Web'?触发器是后台工作者 - 而'System.Web'包含基于webforms的GUI控件,大多数 - 很不清楚为什么你需要这个参考。是的:SQL CLR有一套非常有限的已经部署在SQL Server内部的程序集 –

+3

另外:触发器在引起它触发的语句的上下文和范围内运行。触发器应该**非常灵活** - 小而快。你永远不应该从触发器中调用外部服务,你不应该将游标包含在触发器中 - 所有这些都会导致系统性能下降,并且确实是非常糟糕的事情。尝试重新考虑你的情况,并确保触发器只做非常小的任务 - 没有繁重的工作,没有长时间的计算,没有外部呼叫等。 –

+0

我复制了一个调用restful服务的现有项目的引用。我不确定哪些是我需要的,并且都与它们一起使用,调用Web服务的代码使用'(HttpWebRequest)WebRequest.Create(EndPoint + parameters);'。我可能只能使用System.Net – David

回答

3

触发器在导致触发了该声明的内容和范围运行。

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

如果你真的必须这样做,我建议的方法是:

  • 看到触发只是把几个值变成了“命令”表 - 这些价值观的长期运行过程将需要完成其工作

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

  • 的分离过程,然后抓起从“命令”表中的信息,做它的工作,并更新数据库(如有必要)

这样,你的触发小,灵活,快速地完成,因此不放慢你的主要过程/主系统。冗长的过程是分离的,独立的,并且可以以最有意义的方式实现(SQL Server中的存储过程,或单独的独立的例如命令行工具或任何有意义的)。