2015-09-30 7 views
7

У меня есть хранимая процедура SQL Server 2012, которая возвращает таблицу. Мне нужно изменить этот SP, чтобы добавить дополнительное значение в возвращаемую таблицу. К сожалению, эта добавленная стоимость исходит от вызова веб-сервиса. Из моих исследований я собираю основные способы сделать это, используя процедуры OLE Automation (sp_OA ...) в SQL или хранимую процедуру SQLCLR. Учитывая контекст безопасности, в котором выполняются процедуры sp_OA ..., единственным возвращаемым значением является регистрационный ключ VARCHAR (10), а обращения к службе - несколько (от десяти до двадцати в час), я предполагаю, что метод SQLCLR путь. Кроме того, веб-сервис размещается в нашей интрасети и недоступен для внешнего мира.Вызов веб-службы из SQL CLR?

Есть ли лучший способ добиться того, что мне нужно? Лучшее значение более совершенное, улучшенная безопасность, проще кодировать и поддерживать

ответ

6

Пожалуйста, не используйте процедуры OLE автоматизации sp_OA*. Они, похоже, официально не устарели, но SQLCLR заменяет как процедуры OLE Automation, так и расширенные хранимые процедуры.

Да, это можно сделать достаточно легко в SQLCLR. Вы можете найти примеры использования WCF (как показано в ответе @ CodeCaster) или с помощью HttpWebRequest/HttpWebResponse (у меня есть дополнительная информация в этом ответе: How to invoke webservice from SQL Server stored procedure). Кроме того, следует помнить, что иногда вам нужно будет также добавить сериализации ассамблею: Using Webservices and Xml Serialization in CLR Integration

Coding и обслуживание
Web Services обеспечить хороший API, но если изменить структуру, которую вы должны будете перекомпилировать и перераспределить в по крайней мере, часть этого. Предполагая, что обмен информацией проходит достаточно просто, я склонен думать, что рассматривать это как стандартный веб-запрос добавляет большую гибкость. Вы можете создать общую функцию веб-запроса (скаляр или TVF), которая принимает параметры и URI и создает правильно отформатированный XML-запрос и отправляет его в URI. Затем он получает ответ и просто возвращает XML. Таким образом, вы меняете немного ответственности, поскольку теперь вам нужно анализировать XML-ответ, а не получать хороший объект. Но XML легко разбирается в SQL Server, и вы можете повторно использовать эту функцию в любом количестве мест. И, если удаленная служба постоянно обновляется, обновление хранимой процедуры для изменения строки запроса, передаваемой веб-службе, и/или изменение синтаксического анализа ответа XML является простой процедурой ALTER и должно быть легко протестировано. Нет необходимости перекомпилировать/перераспределить сборку SQLCLR.

безопасности
Независимо от того, как «чистый» веб-сервиса, звоните вы хотите, главное, безопасность мудрый, должен НЕ поленитесь и включите TRUSTWORTHY ON (как показано также в связанной странице с @ CodeCaster, и, к сожалению, большинство других примеров здесь на interwebs).Правильный способ сделать это безопасным является сделать следующее:

  • Подписать ассамблею
  • В базе данных [master] создайте асимметричный ключ из DLL вашего собрания.
  • Кроме того, в [master] создайте Вход от Asymmetric Key
  • Даруй ваш новый вход в EXTERNAL ACCESS ASSEMBLY разрешение
  • Создать сборку с PERMISSION_SET из EXTERNAL_ACCESS, неUNSAFE
1

Вы можете определенно call a WCF service using SQL CLR.

Если вы этого не хотите, вы можете написать службу Windows на C#, которая watches or polls the table for changes. В зависимости от того, как вы реализуете эту услугу, реакция на новую запись будет близка к немедленной. Читайте также How to notify a windows service(c#) of a DB Table Change(sql 2005)?.

Затем вы можете выполнить служебный вызов с C#, выполнить требуемую работу и сохранить результат в столбце.

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