CLR de SQL para comunicación dirigida por eventos

Donde trabajo, utilizan técnicas de sondeo largo para detectar eventos a medida que ocurren en la base de datos. Si bien funciona … creo que todos estarían de acuerdo en que el sondeo de la base de datos no es óptimo.

Preferiría intentar algún tipo de tecnología de empuje o técnica. Como tal, estaba pensando en usar un activador de tabla para llamar a un objeto CLR de SQL que coloca el evento en una cola o llama a un servicio web.

Hay muchos ejemplos de cómo hacer esto:

  • ¿Llamar al servicio web desde SQL CLR?
  • Cómo invocar el servicio web desde el procedimiento almacenado de SQL Server
  • Uso de servicios web y serialización xml en la integración de CLR

Sin embargo, estoy un poco preocupado por la sabiduría y el rendimiento de hacerlo.

Así que mis preguntas son:

  • ¿Pueden los procesos desencadenantes de larga ejecución impedir que se complete el INSERT original?
  • ¿Pueden los procesos desencadenantes fallidos impedir que se complete el INSERT original?
  • ¿Funcionan TRIGGERS en su propio hilo?
  • ¿Es estúpido intentarlo o hay una mejor opción?

Estaba pensando en utilizar un activador de tabla para llamar a un objeto CLR de SQL que descargue el evento en una cola o llame a un servicio web.

Si bien SQLCLR sería necesario para realizar una llamada de servicio web, es probable que no necesite que SQLCLR simplemente coloque un evento en una cola.

¿Pueden los procesos desencadenantes de larga ejecución impedir que se complete el INSERT original?

No es un problema de “can”: absolutamente lo harán, ya que los Triggers son parte de la Transacción que es la statement DML (o la statement DDL en el caso de un Trigger DDL, o Log On en el caso de un Trigger LOGON). Mientras se esté ejecutando un Disparador, la instrucción DML que lo activó está esperando a COMPRAR (todo esto se maneja automáticamente).

¿Pueden los procesos desencadenantes fallidos impedir que se complete el INSERT original?

No es un problema de “can”: lo harán absolutamente, porque los Triggers son parte de la Transacción que es la statement DML. De hecho, si desea cancelar una operación DML basada en alguna lógica, simplemente llame a ROLLBACK; .

¿Funcionan TRIGGERS en su propio hilo?

Si está preguntando si se ejecutan de forma asíncrona a la statement DML que los disparó, no. Según las dos respuestas anteriores, son parte de la misma Transacción. Los activadores no tienen nada que hacer hasta que la instrucción DML complete el trabajo inicial, incluida la validación de las Restricciones COMPROBAR / ÚNICO / etc., y la instrucción DML no puede completarse hasta que finalice la Activación.

¿Es estúpido intentarlo o hay una mejor opción?

No es estúpido, aunque hacer una llamada al servicio web directo es más adecuado para algunas situaciones que para otras. Las personas ciertamente lo han hecho y han tenido éxito en ello, pero estoy seguro de que algunos también han hecho un completo lío de cosas al intentar hacer esto en situaciones donde las condiciones no eran favorables. Yo diría que si a) el Servicio web se encuentra en la intranet local (es decir, sin latencia, o prácticamente ninguna), yb) la llamada al servicio web se completa rápidamente (o al menos se agota lo suficiente), entonces debería estar bien para hacer esto.

Sin embargo, dado que esto va a estar en un activador, eso debe manejarse con un poco más de precaución. Lo que me lleva a algunas “mejores opciones” que sugerí en una pregunta casi duplicada, sobre DBA.StackExchange hace solo 2 días:

¿Puedo ejecutar un procedimiento almacenado de CLR en un servidor diferente al de la instancia de la base de datos?

Y, el siguiente enlace es otra pregunta muy similar (aquí en SO) que surgió hace solo 6 días, con respecto a las llamadas al Servicio Web. Mi respuesta a esa pregunta tiene información sobre cómo reducir la contención entre las llamadas de red en general. Eso es algo que debe tener en cuenta, incluso si toma el enfoque de la cola y tiene un Procedimiento almacenado de T-SQL, iniciado por un trabajo del Agente SQL Server, llame a un objeto SQLCLR para hacer la llamada del servicio web.

Subprocesos CLR de SQL Server