Отправить сообщение из триггера SQL Server - PullRequest
3 голосов
/ 20 ноября 2008

Мне нужно сигнализировать о работающем приложении (службе Windows), когда определенные вещи происходят в SQL Server (2005). Есть ли возможность отправить сообщение из триггера во внешнее приложение в той же системе?

Ответы [ 7 ]

16 голосов
/ 21 ноября 2008

Вы можете использовать очередь SQL Service Broker , чтобы делать то, что вы хотите. Триггер может создать разговор и отправить сообщение в очередь. При запуске внешний процесс должен подключиться к базе данных и выдать оператор WAITFOR (RECEIVE) в этой очереди. Он получит сообщение, когда триггер отправит его.

1 голос
/ 20 ноября 2008

Не уверен, что администраторы БД одобрили бы это, но есть способ выполнять команды, используя xp_cmdshell

"Выполняет данную командную строку как командную оболочку операционной системы и возвращает любые выходные данные в виде строк текста. Предоставляет пользователям без прав администратора права на выполнение xp_cmdshell."

Пример с сайта MS:

CREATE PROC shutdown10
AS
EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down 
   in 10 minutes. No more connections allowed.', no_output
EXEC xp_cmdshell 'net pause sqlserver'
WAITFOR DELAY '00:05:00'
EXEC xp_cmdshell 'net send /domain: SQL_USERS ''SQL Server shutting down 
   in 5 minutes.', no_output
WAITFOR DELAY '00:04:00'
EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down 
   in 1 minute. Log off now.', no_output
WAITFOR DELAY '00:01:00'
EXEC xp_cmdshell 'net stop sqlserver', no_output
0 голосов
/ 22 ноября 2008

Или:

  • Используйте RAISERROR (серьезность 10) для запуска оповещения и задания агента SQL.

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

  • Используйте хранимую процедуру для отправки сообщения и записи в таблицу.

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

0 голосов
/ 21 ноября 2008

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

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

0 голосов
/ 20 ноября 2008

В зависимости от того, какой тип сообщения вы хотите отправить, вы можете использовать хранимую процедуру CLR для подключения к сокету запущенного процесса и записи в него сообщения. Если у вас нет контроля над процессом (т.е. вы не можете его изменить), вы можете построить мост или использовать библиотеку, которая может выдавать сообщение в подходящем формате.

Для надежной доставки вы можете сделать что-то, что использует MSMQ для доставки сообщения.

0 голосов
/ 20 ноября 2008

Вы можете использовать электронную почту dbmail. Он не должен замедлять запуск, если почтовый сервер не работает, потому что сообщение ставится в очередь, а затем отправляется внешним процессом (в sql).

Идея таблицы звучит хорошо, если приложение может получить доступ к серверу sql.

Вы также можете предоставить доступ к той же таблице через нативные XML-сервисы sql 2005, которые предоставляют пробы через xml. http://msdn.microsoft.com/en-us/library/ms345123(SQL.90).aspx

0 голосов
/ 20 ноября 2008

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

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

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