Как запустить программу из SQL? - PullRequest
1 голос
/ 22 июля 2009

Мне нужно реализовать инструмент, который запускает программы из базы данных SQL Server, когда запись в БД соответствует некоторому условию. Есть ли способ сделать это?

Ответы [ 4 ]

4 голосов
/ 22 июля 2009

Я был бы осторожен с xp_cmdshell, потому что он может создать большую дыру в безопасности. Проверьте эту статью от http://www.databasejournal.com/features/mssql/article.php/3372131/Using-xpcmdshell.htm

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

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

3 голосов
/ 22 июля 2009

xp_cmdshell - это проблема безопасности, а также проблема дизайна (заставить SQL Server запускать другие приложения не совсем удачно, даже если это можно заставить). И, пожалуйста, пожалуйста, не принимайте предложение триггера - это худшая идея. Сначала я должен изменить или создать оболочку для программы, которую вы хотите запустить, чтобы она опрашивала базу данных на предмет соответствия строк, а затем работала с ними. При необходимости создайте в БД таблицу, которая будет выступать в качестве очереди для строк, подлежащих обработке, или столбца, указывающего строки, в которых процесс завершен.

2 голосов
/ 22 июля 2009

Вы можете запустить программу, используя xp_cmdshell

http://msdn.microsoft.com/en-us/library/aa260689(SQL.80).aspx

1 голос
/ 22 июля 2009

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

Правильный способ сделать это - обнаружить условие в триггере, поставить в очередь уведомление и сделать так, чтобы считыватель после фиксации отключил уведомление и запустил процесс. Все это можно сделать в Transact-SQL.

Обновление

Кстати, когда я говорю «все это выполнимо в Transact-SQL», я имею в виду компонент Service Broker и активация : триггер SEND sa для локальной службы, возможно, с описанием обновленный ключ элемента, соответствующий критериям, после фиксации сообщения активирует процедуру, активированная процедура читает сообщение и запускает xp_cmdshell, чтобы запустить инструмент с правильными параметрами. Активированная процедура имеет права на запуск xp_cmdshell, поскольку она правильно подписана . Инструмент запускается в течение нескольких миллисекунд после обновления, но в совершенно безопасном контексте, который не блокирует обновление / вставку / удаление.

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