У нас есть хороший кусок Python, который отправляет некоторые электронные письма и взаимодействует с облачной системой. Работает отлично. Но мы должны стрелять каждые несколько минут, чтобы опросить БД. Для бизнес-целей нам действительно нужно, чтобы скрипт Python запускался в реальном времени, чтобы не было задержки при опросе. (Это обслуживает продавцов, которые разговаривают по телефону с покупателями.)
Мы действительно не хотим 1-минутного цикла опроса. Или 30 секунд. Мы хотим, чтобы запись была показана в БД и чтобы все происходило сразу.
Самый быстрый способ заставить эту муху запустить ее, когда в таблицу вставлен определенный тип записи.
Можем ли мы запустить скрипт Python из триггера?
Согласно примечанию Аарона ниже, мы знаем, что это Very Bad Thing ™ , но эта таблица очень и очень мало используется (0-12 вставок в день). Опрос таблицы не отвечает нашим бизнес-потребностям (нам нужен .py для немедленного запуска - он делает гораздо больше, чем просто отправляет электронное письмо).
Мы считаем, что способ удовлетворения потребностей нашего бизнеса состоит в том, чтобы установить .net версию python на SQL Server, а затем заставить T-SQL вызывать скрипт python так же, как он вызывает C #, но мы не знаем, как это сделать. на самом деле сделать это! (поэтому этот вопрос).
Docs / подробности?
Я задал дополнительный вопрос о переполнении стека: как создать процедуру Python CLR в SQL Server?
Вопрос под вопросом : у вас есть кусок питона. Вы хотите, чтобы он запускался из триггера SQL, но вы знаете, что это очень плохо. Итак, что вы делаете для достижения того же эффекта, не имея кода Python в середине операции SQL?
Что такое не запускающий, не опрашивающий подход к решению этой проблемы?
(Тот же самый эффект = «вставка / обновление / удаление происходит в таблице, и сценарий python запускается в течение 2 секунд после события db без опроса таблицы»)
источник
Ответы:
Не заставляйте пользовательскую транзакцию ждать (надеюсь!) Успешного завершения скрипта Python. Вся ваша транзакция находится там и ожидает запуска этого внешнего процесса, попытки отправки почты и т. Д. Я сомневаюсь, что электронная почта действительно должна выходить в этот момент - особенно если учесть, что вы не можете контролировать любые задержки, которые возникают при маршрутизации. в любом случае в почтовый ящик получателя. Почему бы просто не запускать процесс чаще, если время так важно?
Пожалуйста, дайте этот совет для просмотра .
Если вы действительно, действительно, действительно хотите сделать это неправильно, вы можете просто включить
xp_cmdshell
и запустить.Теперь, предполагая, что пользователь имеет доступ
xp_cmdshell
и / или учетная запись службы SQL Server может видеть папку, в которой хранится скрипт python, вы сможете сделать это из своего триггера:Как и в сторону, вы должны указать в своем вопросе , что Вы знаете , что это очень плохо ТМ , но вы не обеспокоены тем , что, по какой - либо причине. Я все еще не думаю, что вы получите такое же реальное время, как ожидаете, даже если вы сделаете это с триггера. Вы рассматривали почту базы данных вместо python?
источник
Прежде всего, если вы используете триггер для записи сообщения в таблицу, предназначенную для этой цели, вы можете непрерывно запускать процесс объединения с ожиданием в 1 секунду или даже меньше. Ключ заключается в том, чтобы сделать запрос опроса достаточно дешевым (<1 мс) и не мешать никаким другим транзакциям (таким образом, выделенной «таблице очередей»).
Например, ваш процесс опроса запускает партию следующим образом:
Чтобы подождать до 25 секунд, пока в таблице не появится строка, опрашивающая каждую секунду. По таймауту он просто возвращает пустой набор результатов.
В таком случае проще всего использовать компонент Service Broker вместе с внутренней процедурой активации, которая вызывает Python через xp_cmdshell, или внешним процессом, который зацикливается на блокировке RECEIVE в очереди целевого компонента Service Broker. Так работает Database Mail под капотом.
источник
Чтобы минимизировать влияние синхронного запуска скрипта Python из вашего триггера, вы можете заключить код Python в
BaseHTTPServer
:Затем вы можете отправить HTTP-запрос от вашего триггера к демону, описанному выше, как показано, например, в этом разделе вопросов и ответов . Обработчик запросов может даже создать отдельный поток для асинхронного выполнения вашей логики Python.
источник