【问题标题】:what's the best practice for calling a webservice from within a trigger (SQL Server)从触发器中调用 Web 服务的最佳做法是什么(SQL Server)
【发布时间】:2009-02-23 18:52:11
【问题描述】:

当表中的特定列发生更改时,我需要调用 Web 服务。我可以决定在插入/更新/删除中更改了哪一列,但我不确定我应该如何调用 web 服务。

网络服务在场外,我们对其有一点控制(我们可以要求更改并获得相当快速的响应),但该服务正在进行中,我们的代码也是如此。

SQL Server 版本是 2005。

更新:这个应用程序中的大部分业务逻辑都在 SQL 层中。我没有办法改变它,抱怨它不是很好地利用我的时间。就是这样。希望有一个业务逻辑层,但它部分位于 pres 层,部分位于 SQL 层。表中的触发器是最中心的地方。

【问题讨论】:

  • 您仍然可以将 Web 服务与触发器分离。只需按照答案中描述的几种方式添加一个间接级别。

标签: .net sql-server web-services


【解决方案1】:

不要。 Web 服务的开销与数据库的执行处理周期不兼容。将其从数据库中取出并(最好)使其异步 - 请参阅下面各种答案中对“队列/监视器”的引用。

也可能是Duplicate question。

【讨论】:

  • 这是一劳永逸的。我们真的只想知道他们最终收到了请求。假设我们已经考虑了替代方案(不要这样做)并驳回了它。遗憾的是,我们的大部分业务逻辑都在 SQL 层中。
  • 它根本行不通。没有办法“触发并忘记”触发器。它不是异步的。将记录放入队列表并编写监控应用程序来查找这些记录。
  • 这是有道理的。如果它在自己的条目中,则监视器/队列解决方案听起来像是对问题的有效答案
【解决方案2】:

让触发器在表中插入一行,其中包含 Web 服务所需的任何数据,然后让外部进程监视该表并在出现新行时调用 Web 服务。

【讨论】:

    【解决方案3】:

    CLR 函数可以发出 Web 服务请求并处理响应。 但这是您的情况,您可能希望创建一个 CLR 函数并在 SQL 对象中的某处调用该函数。

    我建议在高层而不是数据库级别进行 Web 服务调用。 例如,修改该列的代码中的数据访问层。

    【讨论】:

      【解决方案4】:

      大多数商店关闭 SQL 框上的 80 端口

      此外,触发器应该是简陋的、精简的并尽可能快地返回,你不想从触发器调用外部的东西

      将触发器中的数据转储到另一个表中,然后编写另一个进程来检查该表,然后调用 Web 服务

      【讨论】:

        【解决方案5】:

        我只想重申已经说过的话。我曾在这种情况下工作过,这是一场噩梦。

        您最终会得到一个非常无响应的数据库,因为当触发器执行对 Web 服务的调用时,行将被锁定。因此,如果 Web 服务很慢或网络延迟很高,您将需要长时间运行的事务锁定行并降低数据库的并发性。

        我看到此实现的站点已更改为与 moose 描述的相同,并且随着数据库并发性的急剧增加,整个应用程序获得了巨大的提升。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-25
          • 2017-07-13
          • 1970-01-01
          相关资源
          最近更新 更多