Leh*_*hez 17 sql t-sql sql-server sql-server-2005
我在本地网络上有一个SQL Server数据库和一个Intranet Web应用程序.Intranet Web应用程序创建记录并将它们发送到数据库.我有一个Internet Web应用程序,我想在本地网络上使用SQL Server数据库发送新记录.
我无法出于各种原因更改/修改Intranet Web应用程序,因此我唯一的选择是在本地SQL Server上创建一个触发器,该触发器将使用某种http post请求或url调用将新记录发送到Internet Web应用程序.
INTERNET Web应用程序设置有RESTful api,可以通过表单发布到公共可访问的URL(例如http://www.example.com/records/new)接收新记录.
有没有人知道如果通过URL发送数据(xml,json,纯文本变量)可以在SQL Server中完成?
谢谢你的任何想法!
Rem*_*anu 13
这是可能的,但在现实世界中,比你想象的天真方法要复杂一点.首先,让触发器等待HTTP请求是不可接受的:
解决方案是通过队列将触发器与HTTP请求分离.触发器将请求排入本地队列并进行提交,而单独的处理会使这些请求出列并发出HTTP请求.这解决了上面提到的两个问题.您可以将普通表用于队列(请参阅使用表作为队列),或者您可以使用Service Broker,两者都运行良好.
现在关于如何将这些请求出列并实际放置HTTP调用,我强烈建议使用专用进程(即专用于此目的的应用程序).虽然可以使用SQLCLR,但这是一个非常糟糕的选择.SQL Server资源(特别是工作者)在等待Internet响应时浪费很多.
首先执行以下操作
sp_configure 'show advanced options', 1;
go
RECONFIGURE;
go
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
Run Code Online (Sandbox Code Playgroud)
然后创建一个函数
create function GetHttp
(
@url varchar(8000)
)
returns varchar(8000)
as
BEGIN
DECLARE @win int
DECLARE @hr int
DECLARE @text varchar(8000)
EXEC @hr=sp_OACreate 'WinHttp.WinHttpRequest.5.1',@win OUT
IF @hr <> 0 EXEC sp_OAGetErrorInfo @win
EXEC @hr=sp_OAMethod @win, 'Open',NULL,'GET',@url,'false'
IF @hr <> 0 EXEC sp_OAGetErrorInfo @win
EXEC @hr=sp_OAMethod @win,'Send'
IF @hr <> 0 EXEC sp_OAGetErrorInfo @win
EXEC @hr=sp_OAGetProperty @win,'ResponseText',@text OUTPUT
IF @hr <> 0 EXEC sp_OAGetErrorInfo @win
EXEC @hr=sp_OADestroy @win
IF @hr <> 0 EXEC sp_OAGetErrorInfo @win
RETURN @text
END
Run Code Online (Sandbox Code Playgroud)
使用如下:
select dbo.GetHttp('http://127.0.0.1/mywebpage.php')
Run Code Online (Sandbox Code Playgroud)