Лучший способ вызвать веб-сервис из TSQL - PullRequest
1 голос
/ 21 апреля 2010

Каков наилучший способ вызова веб-службы из TSQL? Я хотел бы написать несколько триггеров, которые вызывают веб-сервис. Существует ли обычно используемая лучшая практика для этого?

Реализации должны быть обработаны в SQL Server 2005 и 2008

Ответы [ 4 ]

6 голосов
/ 21 апреля 2010

Из всего, что я когда-либо слышал, это не «лучшая практика» - делать звонки с веб-сайта из любой точки «внутри» базы данных, а веб-вызов из триггера заставляет меня вздрогнуть тупики ... оог]. Базы данных делают большие фоны, но очень плохие интерфейсы. Вам, наверное, намного лучше, если выделенное приложение будет координировать ваши действия с сетью и базой данных.

Подключение чего-либо к вызову агента SQL может работать, но учтите, что не существует «родного» способа вызова веб-сайта из шага задания. Вероятно, они разработали это специально.

6 голосов
/ 21 апреля 2010

Я знаю, что вы можете встраивать код .NET CLR в SQL Server, но можно ли вызывать код CLR из триггера, я не знаю.Я бы подумал о другой архитектуре этого, имея одну таблицу, в которую вставляются записи в любое время, когда вам нужно вызвать веб-службу, и запустить внешнее приложение для опроса таблицы и вызова веб-службы оттуда.У вас будет много проблем с отладкой, ведением журнала ошибок и т. Д., Если вы попытаетесь вызвать веб-службы непосредственно внутри триггера.Просто мои 2 цента.

3 голосов
/ 22 апреля 2010

Как уже упоминалось здесь, вызов веб-службы с помощью триггера снизит производительность вашей базы данных из-за времени, которое потребуется для выполнения вызова.

SQL Server имеет функцию под названием SQL Server Broker , которая предназначена для интеграции асинхронного обмена сообщениями в SQL Server. Хотя у меня теперь есть опыт использования этого самого, это может быть хорошей отправной точкой, если вы хотите сохранить всю логику обработки в SQL Server.

Если вы можете, я бы предложил перенести ответственность за вызов сервиса на любое приложение, использующее базу данных. На этом уровне вы сможете справиться с задержкой, не связывая базу данных.

1 голос
/ 15 ноября 2015

Как уже упоминалось в ответе @ Keith, полный вызов веб-службы может быть очень плохим. Представьте, что веб-служба не работает, и у вас есть множество обновлений, заблокированных и ожидающих доступа к вашим данным. Вы можете использовать SQL Service Broker, хотя - хороший урок по их использованию с триггерами. Вот их пример кода запуска после настройки очереди. Вы всегда можете создать службу, которая просматривает очередь и фактически вызывает веб-службу, если хотите.

--Create trigger for update
CREATE  TRIGGER dbo.Trg_DepartmentMaster_Update 
    ON  dbo.DepartmentMaster FOR UPDATE 
AS BEGIN
    SET NOCOUNT ON;
    DECLARE @MessageBody XML  
    DECLARE @TableId int 

    --get relevant information from inserted/deleted and convert to xml message  
    SET @MessageBody = (SELECT DepartmentId,Name,Description FROM inserted FOR XML AUTO)

    If (@MessageBody IS NOT NULL)  
    BEGIN 
        DECLARE @Handle UNIQUEIDENTIFIER;   
        BEGIN DIALOG CONVERSATION @Handle   
        FROM SERVICE [TestServiceInitiator]   
        TO SERVICE 'TestServiceTarget'   
        ON CONTRACT [TestContract]   
        WITH ENCRYPTION = OFF;   
        SEND ON CONVERSATION @Handle   
        MESSAGE TYPE [TestMessage](@MessageBody);
    END
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...