2009-07-06 2 views
3

У меня есть консольное приложение (на C#) для чтения данных с SQL-сервера (Microsoft SQL 2005) и записи данных на SQL-сервер. Теперь мне нужно добавить триггер в таблицу для запуска консольного приложения, когда изменяется любая строка данных.Приложение Exec Console с использованием TSQL SP?

Не знаете, какой SP доступен на сервере Microsoft SQL Server (2005) для запуска консольного приложения? и как я могу передать результат из приложения? Будут ли они выполняться как синхронные или асичские усадьбы? Есть ли какая-либо проблема с разрешением, которую я должен настроить?

ответ

5

Не запускайте внешние процессы с триггера, вы должны поставить сервер на колени. Не имеет значения, есть ли xp_cmdshell или процедура CLR. Вместо этого используйте Service Broker и отправьте SEND в своем триггере, чтобы отправить сообщение в локальную службу, и полагаться на activation, чтобы выполнять внешнюю зависимую обработку, асинхронно и в отдельном контексте.

+0

Очень интересно. Я видел вариант SQL Broker. Любая информация о том, как настроить и использовать? или примеры? –

+0

http://msdn.microsoft.com/en-us/library/ms345113(SQL.90).aspx и мой блог на http://rusanu.com –

+0

См. Https://technet.microsoft.com/en- нас/SQLServer/cc510305.aspx. –

3

Хранимая процедура xp_cmdshell может использоваться для запуска внешнего процесса, но это часто отключается по соображениям безопасности.

Как консольное приложение уже написано на C#, возможно, оно может быть переписано в виде хранимой процедуры SQLCLR?

+0

Фактически я работаю над этой задачей, чтобы переместить SQLCLR в консольное приложение. –

1

Это кажется немного шатким для меня. Есть ли вероятность частого вызова триггера, приводящего к множеству запусков приложения? Кроме того, я не думаю, что триггер завершится, пока консольное приложение не закончит или не завершится. Тем временем операция, которая вызвала срабатывание триггера, все равно будет ждать.

Необходимо ли сразу же запустить приложение ? Если нет, то, возможно, вы можете запускать это как задание агента SQL периодически.

0

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

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

Вы можете отследить эти изменения с помощью поля, такого как [LastUpdatedDateTime] с по умолчанию GetDate(), и не отправлять это значение в свой запрос. Поэтому он всегда будет иметь последнюю временную метку изменений. Вы также можете иметь таблицу аудита, которая заполняется триггером.

0

Я согласен с Кеном, возможно, вы захотите подумать об изменении архитектуры. Является ли консольное приложение считыванием и записью данных на тот же SQL-сервер, который его вызывает? Если это так, вам лучше кодировать эту логику в триггер или собственно хранимую процедуру и/или изменять схему базы данных, чтобы ваша логика не была настолько сложной.

Смежные вопросы