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

StackOverflow https://stackoverflow.com/questions/802398

Вопрос

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

Запуск командного файла через 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/cotherbatch.bat», но при запуске через сервер sql он, похоже, игнорирует запуск (отлично работает из DOS).Я, конечно, мог бы написать процесс опроса для просмотра некоторых событий столов и пикапов, но я бы предпочел, чтобы это было основано на триггерах, чтобы сделать его менее сложным (или я делаю наоборот :)).
Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top