¿Cómo puedo hacer que Sql Server 2005 llame asíncronamente a un archivo por lotes de DOS desde un disparador DDL?

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

Pregunta

Creé un archivo de proceso por lotes para ejecutar SqlMetal y generar clases de datos Linq2Sql, ingresar al control de origen activando una compilación, etc ... Me gustaría que este script se ejecute cada vez que haya un cambio de DDL en el Sql Server 2005.

Ejecutar el archivo por lotes a través de xp_cmdshell funciona bien fuera de un disparador, como este:

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

Pero cuando se ejecuta como desencadenante, siempre se agota el tiempo de conexión a la base de datos, lo que hace que todos los DDL fallen. Aquí está mi gatillo:

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

Estoy buscando consejos sobre dos puntos:

  1. Haz que esto funcione. Por alguna razón, siempre falla cuando está en el disparador, y no cuando no está en un disparador. No parece estar relacionado con la seguridad, ya que se ejecuta como LocalSystem en ambos casos.
  2. Haga que esto suceda de manera asíncrona para que las fallas y los tiempos de espera en SqlMetal no causen una falla de actualización de DDL. He intentado envolver el archivo por lotes con otro y un " iniciar cmd.exe / c otherbatch.bat " ;, pero cuando se ejecuta a través del servidor SQL parece que se ignora el inicio (funciona bien desde DOS). Ciertamente podría escribir un proceso de sondeo para ver algunos eventos de tabla y recolección, pero preferiría que este se basara en disparadores para hacerlo menos complejo (o estoy haciendo lo contrario :)).
¿Fue útil?

Solución

Su lote probablemente se esté bloqueando porque intenta consultar datos sobre las tablas que se están creando, pero todavía están bloqueados dentro de una transacción (el desencadenante es parte de la transacción implícita que SQL Server inicia para cualquier instrucción DDL / DML), que se completará solo después de que finalice el gatillo.   El único " casi " La forma práctica de ejecución asíncrona en SQL Server 2005 o superior que conozco es Service Broker. Busque "Activación interna de Service Broker".   En la práctica, es un poco complejo configurarlo correctamente, por lo que puede optar por la opción de agrupación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top