【问题标题】:How to call restful service from SQL Server trigger如何从 SQL Server 触发器调用 restful 服务
【发布时间】:2017-07-24 20:25:27
【问题描述】:

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

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

  1. 插入触发器 - 服务代理 - .NET windows 服务以调用 Web 服务
  2. C# CLR 触发器直接调用 RESTful 服务

我一直在处理选项 2 并在 Visual Studio 中创建了一个 SQL CLR 触发器项目,但是在我添加对 System.Web 的引用后,该项目将无法构建并且没有构建错误,而只是在中显示“构建失败”输出窗口。

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

使用服务代理让我很害怕,因为我只与服务代理合作过一个项目,发现实施起来非常困难。

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

【问题讨论】:

  • 为什么你需要在 SQL CLR 触发器中引用System.Web?触发器是后台工作人员-System.Web 主要包含基于 webforms 的 GUI 控件-非常不清楚您为什么需要此参考。是的:SQL CLR 有一组非常有限的程序集,这些程序集已经部署在 SQL Server 中
  • 另外:触发器在触发它的语句的上下文和范围内运行。触发器应该非常灵活 - 小而快。你永远不应该从触发器调用外部服务,你不应该在触发器中包含游标——所有这些都会降低你的系统性能,而且真的是非常糟糕的事情。尝试重新考虑您的情况并确保触发器只执行非常小的任务 - 没有繁重的工作,没有冗长的计算,没有外部调用等。
  • 我正在从调用 restful 服务的现有项目中复制引用。我不确定我需要哪些并全部使用,调用 Web 服务的代码使用 (HttpWebRequest)WebRequest.Create(EndPoint + parameters); 。我也许可以只使用 System.Net
  • 好的,所以也许我确实需要考虑使用服务代理。还有其他方法可以将触发器与对服务的调用分离吗?

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


【解决方案1】:

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

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

如果你真的必须做这样的事情,我推荐一种方法:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2018-01-15
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多