Come posso fare in modo che Sql Server 2005 chiami in modo asincrono un file batch DOS da un trigger DDL?

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

Domanda

Ho creato un file batch per eseguire SqlMetal e generare classi di dati Linq2Sql, controllare il controllo del codice sorgente innescando una build, ecc ... Mi piacerebbe avere questo script eseguito ogni volta che c'è una modifica DDL in Sql Server 2005.

L'esecuzione del file batch tramite xp_cmdshell funziona benissimo al di fuori di un trigger, in questo modo:

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

Ma quando viene eseguito come trigger, scade sempre la connessione al database, causando il fallimento di tutti i DDL. Ecco il mio grilletto:

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

Sto cercando consigli su due punti:

  1. Fallo funzionare. Per qualche motivo, fallisce sempre quando si attiva il trigger e non quando non si trova in un trigger. Non sembra essere legato alla sicurezza poiché viene eseguito come LocalSystem in entrambi i casi.
  2. Fai in modo che ciò accada in modo asincrono in modo che errori e timeout in SqlMetal non causino errori di aggiornamento DDL. Ho provato a racchiudere il file batch con un altro e un " start cmd.exe / c otherbatch.bat " ;, ma quando si esegue attraverso SQL Server sembra ignorare l'avvio (funziona bene da DOS). Potrei certamente scrivere un processo di polling per esaminare alcuni eventi di tabella e pickup, ma preferirei che questo sia basato sul trigger per renderlo meno complesso (o sto facendo il contrario :)).
È stato utile?

Soluzione

Probabilmente il tuo batch viene bloccato perché tenta di eseguire una query sui dati relativi alle tabelle create, ma sono ancora bloccati all'interno di una transazione (il trigger fa parte della transazione implicita avviata da SQL Server per qualsiasi istruzione DDL / DML), che verrà completato solo al termine del trigger.   L'unico "quasi" quasi modo pratico di esecuzione asincrona in SQL Server 2005 o versioni successive che conosco è Service Broker. Cerca " Attivazione interna del Service Broker " ;.   In pratica è un po 'complesso configurarlo correttamente, quindi potresti scegliere l'opzione di pooling.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top