2011-05-12 122 views
14

我有本地网络上的SQL Server数据库和Intranet Web应用程序。 Intranet Web应用程序创建记录并将其发送到数据库。我有一个Internet Web应用程序,我想将新记录发送到使用本地网络上的SQL Server数据库。SQL Server可以发送Web请求吗?

我不能改变/修改以各种理由在Intranet Web应用程序,所以我唯一的选择是创建本地SQL Server将使用某种形式的HTTP POST发送的新记录互联网web应用上触发请求或网址调用。

INTERNET Web应用程序使用RESTful API设置,可以通过表单发布到公共访问的URL(例如http://www.example.com/records/new)接收新记录。

有谁知道通过一个URL发送数据(xml,json,普通变量在url中)是否可以在SQL Server中完成?

感谢您的任何想法!

回答

7

作为一个很好的(相当可靠和可扩展的)选项,您可以使用SQL CLR与Web应用程序/ Web服务进行交互。例如,SQL CLR WebRequestSQL CLR WCF

+1

或SSIS - Integration Services。 – 2011-05-12 19:50:22

+0

@marc_s:从我不是非常到达的经验来看,SSIS是更复杂的主题,然后SQLCLR – abatishchev 2011-05-12 19:57:42

+0

@marc_s同样对于SSIS,最终不得不编写C#,因为它通常不够灵活。 – John 2017-05-26 06:37:41

13

这是可能的,但在现实世界中比您想象的天真方法稍微复杂一些。首先,它是不能接受的具有触发等待HTTP请求:

  • 其一,你的应用将抓取一个急刹车,因为触发器将阻止资源(主要锁)等待来自一些远和响应离开WWW服务。
  • 其次,更微妙但更糟糕的是存在回滚时的正确性问题。如果发送给HTTP请求的事务回滚,则无法“撤消”HTTP请求。

解决方法是通过队列将触发器与HTTP请求分离。触发器将请求排入本地队列并提交,而单独的一部分处理将这些请求出列并发出HTTP请求。这解决了上述两个问题。您可以使用普通表作为队列(请参阅Using Tables as Queues),或者您可以使用Service Broker,两者均可正常工作。

现在就如何将这些请求出队并实际放置HTTP调用,我强烈建议使用专用进程(即专用于此目的的应用程序)。虽然可以使用SQLCLR,但这是一个非常糟糕的选择。 SQL Server资源(特别是workers)在等待Internet响应时浪费宝贵。

+0

我并未等待http请求。我希望触发器启动http请求。我希望触发器在新记录更新时调用URL。我不需要等待响应或类似的信息 – 2011-05-16 14:09:39

+1

但是,该触发器将等待http请求。触发器将在插入/更新时执行,并且只有在触发器完成执行时才会执行插入/更新操作,并“完成”插入/更新过程。这一切都是同步发生的。触发器应尽可能最小和尽可能快。如果可能的话,不要使用触发器,除非将审计类型数据转储到另一个表。 – 2014-08-19 17:48:34

0

添加到Remus Rusanu的好回答。并与Lehi Sanchez的评论有关。问题是你总是需要等待http请求。触发器中的代码是一步一步执行的,所以请求必须返回,以便触发器可以完成其执行。