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