Как я могу иметь Sql Server 2005 асинхронно вызывать пакетный файл DOS из триггера DDL? - PullRequest
1 голос
/ 29 апреля 2009

Я создал командный файл для запуска SqlMetal и генерации классов данных Linq2Sql, проверки управления исходным кодом, запускающего сборку и т. Д. Я хотел бы запускать этот сценарий каждый раз, когда в Sql Server 2005 изменяется DDL.

Запуск пакетного файла через xp_cmdshell отлично работает вне триггера, например:

exec master..xp_cmdshell 'd:\dev\db_triggers\generatedataclasses.bat', no_output

Но когда он запускается как триггер, он всегда прерывает соединение с базой данных, что приводит к сбою всех DDL. Вот мой триггер:

CREATE TRIGGER [Trig_SqlMetal]
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS 
AS
exec master..xp_cmdshell 'd:\dev\db_triggers\generatedataclasses.bat', no_output

Я ищу совет по двум пунктам:

  1. Сделай эту работу. По какой-то причине он всегда терпит неудачу, когда в триггере, и не когда не в триггере. Похоже, это не связано с безопасностью, поскольку в обоих случаях он работает как LocalSystem.
  2. Сделайте так, чтобы это происходило асинхронно, чтобы сбои и тайм-ауты в SqlMetal не приводили к сбою обновления DDL. Я попытался обернуть командный файл с другим и "start cmd.exe / c otherbatch.bat", но при запуске через сервер sql, кажется, игнорирует запуск (работает нормально из DOS). Я, конечно, мог бы написать процесс опроса, чтобы посмотреть на некоторые события таблицы и захвата, но я бы предпочел, чтобы это был триггер на основе, чтобы сделать его менее сложным (или я делаю наоборот :)).

1 Ответ

3 голосов
/ 29 апреля 2009

Возможно, ваш пакет заблокирован, потому что он пытается запросить данные о создаваемых таблицах, но они все еще заблокированы внутри транзакции (триггер является частью неявной транзакции, которую SQL Server запускает для любого оператора DDL / DML), что завершится только после завершения триггера. Единственный «почти» практичный способ асинхронного выполнения в SQL Server 2005 или более поздней версии, о котором я знаю, - это Service Broker. Ищите «Внутренняя активация компонента Service Broker». На практике это немного сложно настроить, поэтому вы можете выбрать вариант пула.

...