Может ли SQL Server отправить веб-запрос? - PullRequest
16 голосов
/ 12 мая 2011

У меня есть база данных SQL Server и веб-приложение для внутренней сети в локальной сети.Веб-приложение интрасети создает записи и отправляет их в базу данных.У меня есть веб-приложение в Интернете, которое я хотел бы отправлять новые записи в базу данных SQL Server в локальной сети.

Я не могу изменить / изменить веб-приложение интрасети по разным причинам, поэтому я могу тольконеобходимо создать на локальном сервере SQL триггер, который будет отправлять новые записи в веб-приложение Интернета с помощью какого-либо http-запроса или URL-вызова.

Веб-приложение ИНТЕРНЕТ настроено с API-интерфейсом RESTful, которыйможет получать новые записи через форму сообщения на общедоступный URL-адрес (например, http://www.example.com/records/new).

Кто-нибудь знает, можно ли в SQL Server выполнить отправку данных (xml, json, простые переменные в URL-адресе) через URL-адрес?

Спасибо за любые мысли!

Ответы [ 3 ]

13 голосов
/ 13 мая 2011

Это возможно, но в реальном мире это немного сложнее, чем наивный подход, который вы себе представляете.Прежде всего, недопустимо ожидать триггера для ожидания HTTP-запроса:

  • Во-первых, ваше приложение будет ползти до полной остановки, потому что триггеры будут блокировать ресурсы (прежде всего блокировки), ожидая ответа откакой-то дальний WWW сервис.
  • Второй, более тонкий, но гораздо худший вопрос правильности при наличии откатов.Если транзакция, выданная HTTP-запросам, откатывается, невозможно отменить HTTP-запрос.

Решение состоит в том, чтобы отделить триггер от HTTP-запроса через очередь.Триггер помещает запрос в локальную очередь и фиксирует его, в то время как отдельный фрагмент обработки удаляет эти запросы и выдает HTTP-запрос.Это решает обе проблемы, указанные выше.Вы можете использовать обычные таблицы для очередей (см. Использование таблиц в качестве очередей ), или вы можете использовать Service Broker , обе работают хорошо.

Теперь о том, как убрать запросы из очереди.и на самом деле сделать HTTP-вызов, я настоятельно рекомендую использовать выделенный процесс (т.е. приложение, предназначенное для этой цели).Хотя можно использовать SQLCLR, это очень плохой выбор.Ресурсы SQL Server (в частности, рабочие ) очень драгоценны, чтобы тратить их на ожидание ответов в Интернете.

7 голосов
/ 12 мая 2011

В качестве хорошего (довольно надежного и масштабируемого) варианта вы можете использовать SQL CLR для взаимодействия с веб-приложением / веб-службой.

Например, поиск " SQL"CLR WebRequest"или" SQL CLR WCF".

1 голос
/ 26 апреля 2018

Сначала сделай следующее

sp_configure 'show advanced options', 1;
go
RECONFIGURE;
go
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO

Затем создайте функцию

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

используйте как:

select dbo.GetHttp('http://127.0.0.1/mywebpage.php')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...