Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запуск консольной программы при добавлении записи в таблицу  [new]
D_A_S1
Member

Откуда: Волгоград
Сообщений: 641
Добрый день!
У нас стоит Microsoft Sql Server. Есть таблица, в которую добавляется запись для формирования счета. Сам счет в pdf формирует консольное приложение. На данный момент приложение запускается раз в минуту, что не очень хорошо.
Хочется, чтобы приложение запускалось, когда добавлялось новая запись в таблицу.
В Google посмотрел, что есть. Вижу два варианта - триггер или Sql Агент. Триггер, я так понимаю, не очень подходит.
Кто-нибудь делал что-нибудь похожее через Sql агент? Может есть пример или что-то подобное. Заранее спасибо!
5 май 17, 10:02    [20459430]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной программы при добавлении записи в таблицу  [new]
uaggster
Member

Откуда:
Сообщений: 767
Совсем правильно будет задействовать компонент Service Broker.

На таблицу вешаешь триггер, который отсылает сообщение сервис брокеру.
А в обработчике сообщений уже вызываешь соответствующее приложение.
5 май 17, 11:04    [20459759]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной программы при добавлении записи в таблицу  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3462
D_A_S1
Добрый день!
У нас стоит Microsoft Sql Server. Есть таблица, в которую добавляется запись для формирования счета. Сам счет в pdf формирует консольное приложение. На данный момент приложение запускается раз в минуту, что не очень хорошо.
Хочется, чтобы приложение запускалось, когда добавлялось новая запись в таблицу.
В Google посмотрел, что есть. Вижу два варианта - триггер или Sql Агент. Триггер, я так понимаю, не очень подходит.
Кто-нибудь делал что-нибудь похожее через Sql агент? Может есть пример или что-то подобное. Заранее спасибо!


Как написали уже
1. Service Broker
2. Прикрутить в приложение SqlChangeMonitor (SqlDependency) и активироваться, если в некой таблице произошли изменения
3. SQLCLR процедура, которая вызывается в триггере и отправляет сообщение приложению, как клиент сервису (WCF, RestFul, sockets...), оно активируется и что-то там делает
5 май 17, 11:27    [20459867]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной программы при добавлении записи в таблицу  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7401
D_A_S1,

у вас, извиняюсь, штаны через голову надеваются. Инициировать вызов формирования PDF должен не сервер, а то приложение, которое добавляет запись в базу.
5 май 17, 12:01    [20460044]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной программы при добавлении записи в таблицу  [new]
invm
Member

Откуда: Москва
Сообщений: 9123
Владислав Колосов
Инициировать вызов формирования PDF должен не сервер, а то приложение, которое добавляет запись в базу.
Вот интересно, если "добавить запись в базу" случается в серверном коде и является следствием некого действия в приложении, которое вообще не в курсе, что такое счета и формирование PDF, что в этом случае будет надеванием штанов через голову?
5 май 17, 12:23    [20460161]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной программы при добавлении записи в таблицу  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7401
invm, моя точка зрения состоит в том, что если MS дает возможность серверу баз данных выполнять внешние приложения, то это не значит, что именно так и надо поступать и превращать СУБД в сервер приложений.

Да, есть безвыходные ситуации, например, при использовании коробочного ПО. Но закладывать в архитектуру своего приложения такое поведение неверно. Сервер должен обслуживать базы данных и не более того. Он не должен управлять производственными процессами.

Вполне возможно, что сервер должен рассылать оповещения через end-point об изменениях в данных.

Если речь идет о формировании отчетности, то можно использовать решение на базе Reporting Services, который имеет возможность строить отчеты и сохранять в том же PDF по мере поступления данных.
5 май 17, 12:37    [20460246]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной программы при добавлении записи в таблицу  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3462
Владислав Колосов
invm, моя точка зрения состоит в том, что если MS дает возможность серверу баз данных выполнять внешние приложения, то это не значит, что именно так и надо поступать и превращать СУБД в сервер приложений.

Да, есть безвыходные ситуации, например, при использовании коробочного ПО. Но закладывать в архитектуру своего приложения такое поведение неверно. Сервер должен обслуживать базы данных и не более того. Он не должен управлять производственными процессами.

Вполне возможно, что сервер должен рассылать оповещения через end-point об изменениях в данных.

Если речь идет о формировании отчетности, то можно использовать решение на базе Reporting Services, который имеет возможность строить отчеты и сохранять в том же PDF по мере поступления данных.


Это идеальный случай, но жизнь вносит свои коррективы, и вполне возможно сделать некую обратную связь, ни к чему не обязывающую сервер, fire&forget
5 май 17, 12:40    [20460260]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной программы при добавлении записи в таблицу  [new]
invm
Member

Откуда: Москва
Сообщений: 9123
Владислав Колосов
Сервер должен обслуживать базы данных и не более того
Сервер должен обеспечивать работу бизнеса наиболее эффективно и наименее затратно.
Если при этом потребуется нарушить дурацкие догматы типа "ничего кроме select, insert, update и delete", то так и нужно делать.
5 май 17, 12:51    [20460318]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной программы при добавлении записи в таблицу  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7401
invm,

догматы не дурацкие, они сводят затраты на сопровождение, развертывание и миграцию к минимуму. Я уже прошел стадию "вседозволенности" и мне знакомы Ваши утверждения, потому что я их сам практиковал :)
5 май 17, 17:31    [20461593]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной программы при добавлении записи в таблицу  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3462
Владислав Колосов
invm,

догматы не дурацкие, они сводят затраты на сопровождение, развертывание и миграцию к минимуму. Я уже прошел стадию "вседозволенности" и мне знакомы Ваши утверждения, потому что я их сам практиковал :)


Service Broker - вырезать?
5 май 17, 18:08    [20461653]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной программы при добавлении записи в таблицу  [new]
invm
Member

Откуда: Москва
Сообщений: 9123
Владислав Колосов
догматы не дурацкие
Догматы потому и дурацкие, что они догматы.
Владислав Колосов
они сводят затраты на сопровождение, развертывание и миграцию к минимуму.
Ок. Предположим есть необходимость в ответ на некое событие в БД запускать внешнее приложение. Ваши действия?
5 май 17, 19:00    [20461754]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной программы при добавлении записи в таблицу  [new]
Massa52
Member

Откуда:
Сообщений: 373
invm,

Вряд ли событие само рождается на сервере. С вероятностью в 99% оно инициируется внешним приложением.
Вот снаружи и надо все стараться обустраивать. А иначе - это действительно штаны не оттуда одевать.
5 май 17, 20:09    [20461826]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной программы при добавлении записи в таблицу  [new]
invm
Member

Откуда: Москва
Сообщений: 9123
Massa52
С вероятностью в 99% оно инициируется внешним приложением.
Т.е. внешнее приложение должно быть осведомлено о событиях, которые могут случиться при каких-то манипуляциях с БД? Про принцип "черного ящика" что-нибудь слышали?
Massa52
Вот снаружи и надо все стараться обустраивать.
Ох уж мне эти архитекторы...
Где обустраивать-то собрались? И кто вам сказал, что "наружа" вообще должна знать, что нужно что-то и когда-то запускать при определенных условиях?
5 май 17, 20:56    [20461893]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной программы при добавлении записи в таблицу  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4257
Владислав Колосов
invm,

догматы не дурацкие, они сводят затраты на сопровождение, развертывание и миграцию к минимуму. Я уже прошел стадию "вседозволенности" и мне знакомы Ваши утверждения, потому что я их сам практиковал :)


Тогда надо исключить DbMail из состава сервера.
5 май 17, 21:16    [20461921]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной программы при добавлении записи в таблицу  [new]
Massa52
Member

Откуда:
Сообщений: 373
Lepsik,

Если представить базу данных как хранилище - скажем склад товаров(ИКЕА), то DbMail выглядит как почтовое/транспортое отделение при хранилище. И он не работает с товарами. Это кладовшик/покупатель выкатывает товары на тележке и, там в(DbMail) оформляет доставку.
Это просто дополнительный сервис и не в тему с топиком.
Ну а если продолжить аналогию и обратиться к проблеме TC, то получается, что поставщик прикатил на склад товар и умыл руки. И тут должен кладовщик принявший товар сообразить и вовремя подать сигнал покупателю(а это дополнительная служба) - мол твой товар прибыл. Такая служба тоже востребованный сервис(в данном случае никто не утверждает - что он не нужен). Но в большинстве случаев - тот кто прикатывает конкретный товар в курсе кому он предназначен и может сообщить поставщику - что товар доставлен - не задействую при этом складские службы.
6 май 17, 13:24    [20462439]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной программы при добавлении записи в таблицу  [new]
yaxinr
Member

Откуда:
Сообщений: 3
используйте https://github.com/event-driven-arch/mssql2amqp
в качестве amqp брокера используйте http://www.rabbitmq.com/getstarted.html
протокол реализован на самых популярных языках программирования
24 апр 18, 11:18    [21363519]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной программы при добавлении записи в таблицу  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49538
yaxinr
в качестве amqp брокера используйте http://www.rabbitmq.com/getstarted.html

Он сможет запустить "format c:"?
24 апр 18, 13:38    [21364295]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить