Como posso ter o SQL Server 2005 de forma assíncrona chamar um arquivo de lote DOS a partir de um gatilho DDL?

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

Pergunta

Eu criei um arquivo de lote para executar SqlMetal e gerar classes de dados Linq2Sql, verificar em controle de origem provocando uma compilação, etc ... Eu gostaria de ter este script executado sempre que houver uma alteração DDL em SQL Server 2005.

A execução do arquivo de lote via xp_cmdshell trabalha fora multa de um gatilho, como este:

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

Mas quando ele é executado como um gatilho, ele sempre vezes fora conectar ao banco de dados, fazendo com que todos DDL a falhar. Aqui está meu gatilho:

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

Eu estou procurando conselhos sobre dois pontos:

  1. Faça este trabalho. Por alguma razão ele sempre falha quando no gatilho, e não faz quando não está em um gatilho. Não parecem ser os relacionados a segurança, uma vez que é executado como LocalSystem em ambos os casos.
  2. Faça isso acontecer asychronously para que falhas e tempos limite em SqlMetal não causa falha de atualização DDL. Eu tentei envolvendo o arquivo de lote com outro e "iniciar cmd.exe / c otherbatch.bat", mas quando executado através do servidor SQL que parece ignorar o início (funciona bem a partir do DOS). Eu certamente poderia escrever um processo de consulta para olhada em alguns eventos de mesa e de captação, mas eu prefiro o gatilho basear para torná-la menos complexa (ou estou fazendo o oposto :)).
Foi útil?

Solução

Seu lote provavelmente está sendo bloqueado porque ele tenta consultar dados sobre as tabelas sendo criadas, mas eles ainda estão trancadas dentro de uma transação (o gatilho é parte da transação implícita SQL Server é iniciado para qualquer instrução DDL / DML), que vai completar somente após a conclusão de gatilho. A única "quase" maneira prática de execução assíncrona no SQL Server 2005 ou superior, que eu saiba é Service Broker. Procure por "Service Broker Activation Interno". Na prática, é um pouco complexa para configurá-lo corretamente, de modo que você pode também optar por ir para a opção de pooling.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top