Como posso ter o SQL Server 2005 de forma assíncrona chamar um arquivo de lote DOS a partir de um gatilho DDL?
-
03-07-2019 - |
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:
- 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.
- 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 :)).
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.