Может ли триггер SQL вызвать веб-сервис? - PullRequest
14 голосов
/ 27 мая 2011

Я создаю RESTful API для приложения для iPhone.

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

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

Интересно, были ли у вас какие-либо мысли по этому поводу или был ли лучший подход, о котором я не думал?

Ответы [ 5 ]

18 голосов
/ 27 мая 2011

Даже если это технически возможно, это действительно не очень хорошая идея! Триггер должен быть очень простым, и он определенно не должен включать в себя длительную операцию (что, безусловно, является вызовом веб-службы)! Переосмыслите свою архитектуру - должен быть лучший способ сделать это!

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

Что-то вроде:

  1. в вашем коде триггера вставьте в таблицу слово «do call the webservice позже» (просто INSERT, чтобы сохранить его быстрым и быстрым - вот и все)

  2. имеет асинхронную службу (задание SQL или, предпочтительно, службу Windows NT), которая выполняет эти вызовы отдельно от фактического выполнения триггера и сохраняет все данные, извлеченные из этой веб-службы, в соответствующие таблицы в вашей базе данных.

Триггер - это очень привередливая вещь - он всегда должен быть очень быстрым, очень скудным - делать максимум INSERT или два - и во что бы то ни стало избегать курсоров в триггерах или других длительных операциях (таких как вызов веб-службы) )

У Брента Озара есть отличная веб-трансляция (представленная в SQL PASS) на Топ-10 ошибок разработчика, которые не масштабируются и триггеры - это первое, на что он фокусируется! Настоятельно рекомендуется

2 голосов
/ 27 мая 2011

Это зависит от потребностей бизнеса.Обычно я бы держался подальше от использования триггеров для этого, так как это бизнес-логика и должна обрабатываться BL.

Но ответ на ваш вопрос - да, вы можете это сделать, просто убедитесь, чтоВызовите веб-службу асинхронно, чтобы она не задерживала вставку до завершения вызова веб-службы.

Вы также можете рассмотреть возможность использования веб-службы OneWay - т.е. запустить и забыть.

Но, как и другиеуказал - вам всегда лучше не использовать триггер.

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

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

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

1 голос
/ 02 марта 2016

Триггер-> Очередь-> SP-> XP_XMDShell-> BAT-> cURL-> Веб-служба стороннего производителя

Я использовал триггер для вставки записи в таблицу очередей, затем хранимая процедура с использованием курсора для удаления записей из очереди.

У меня не было WSDL или доступа к сторонним разработчикам API, и мне нужно было срочно завершить создание прототипа, поэтому хранимая процедура вызывает XP_CMDShell, вызывая файл .bat с параметрами.

Файл bat вызывает cURL, который управляет вызовом и ответом REST / JSON.

Это было бесплатно, быстро и надежно работает. Не архитектурно чистый, но получил опытный образец с земли.

1 голос
/ 27 мая 2011

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

Насколько я знаю, триггеры довольно ограничены в своих возможностях. Хранимая процедура может иметь больше возможностей (или, возможно, нет).

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

0 голосов
/ 07 декабря 2013

Рекомендуется, чтобы эта веб-страница делала запись в другую таблицу (я назову message_queue ), когда пользователь заходит на страницу.

Затем демон службы Windows / * nix на сервере сканирует таблицу message_queue и выполняет отправку через мобильное приложение через веб-службу. Вы можете использовать возможности обработки транзакций в SQL для управления обработкой очереди.

Приятной особенностью этого подхода является то, что вы можете начинать со всего на 1 автономном сервере и даже разделять веб-сайт, базу данных, службу / демон на разные физические серверы или кластеры серверов по мере расширения.

...