Saltar al contenido

¿Cómo monitorear los cambios en la tabla de SQL Server usando c#?

Buscamos en el mundo on line para darte la solución a tu inquietud, si tienes alguna pregunta puedes dejarnos la duda y te contestaremos porque estamos para servirte.

Solución:

Puedes usar el SqlDependency Class. Su uso previsto es principalmente para páginas ASP.NET (bajo número de notificaciones de clientes).

ALTER DATABASE UrDb SET ENABLE_BROKER

Implementar el OnChange evento para ser notificado:

void OnChange(object sender, SqlNotificationEventArgs e)

Y en código:

SqlCommand cmd = ...
cmd.Notification = null;

SqlDependency dependency = new SqlDependency(cmd);

dependency.OnChange += OnChange;

utiliza el Service Broker (una plataforma de comunicación basada en mensajes) para recibir mensajes del motor de la base de datos.

En aras de la integridad, hay un par de otras soluciones que (en mi opinión) son más ortodoxas que las soluciones que se basan en las clases SqlDependency (y SqlTableDependency). SqlDependency se diseñó originalmente para facilitar la actualización de cachés de servidores web distribuidos y, por lo tanto, se creó para un conjunto diferente de requisitos que si se diseñara como un productor de eventos.

En términos generales, hay cuatro opciones, algunas de las cuales aún no se han cubierto aquí:

  • Seguimiento de cambios
  • Centros para el Control y la Prevención de Enfermedades
  • Desencadenadores de colas
  • CLR

Seguimiento de cambios

Fuente: https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/about-change-tracking-sql-server

El seguimiento de cambios es un mecanismo de notificación ligero en el servidor SQL. Básicamente, un número de versión de toda la base de datos se incrementa con cada cambio en los datos. Luego, el número de versión se escribe en las tablas de seguimiento de cambios con una máscara de bits que incluye los nombres de las columnas que se cambiaron. Tenga en cuenta que el cambio real no se mantiene. La notificación solo contiene la información de que una entidad de datos en particular ha cambiado. Además, debido a que el control de versiones de la tabla de cambios es acumulativo, las notificaciones de cambios en elementos individuales no se conservan y se sobrescriben con notificaciones más recientes. Esto significa que si una entidad cambia dos veces, el seguimiento de cambios solo conocerá el cambio más reciente.

Para capturar estos cambios en C#, se debe usar el sondeo. Las tablas de seguimiento de cambios se pueden sondear e inspeccionar cada cambio para ver si es de interés. Si es de interés, es necesario ir directamente a los datos para recuperar el estado actual.

Cambiar la captura de datos

Fuente: https://technet.microsoft.com/en-us/library/bb522489(v=sql.105).aspx

La captura de datos de cambios (CDC) es más poderosa pero más costosa que el seguimiento de cambios. La captura de datos modificados rastreará y notificará los cambios en función de la supervisión del registro de la base de datos. Debido a esto, CDC tiene acceso a los datos reales que se han modificado y mantiene un registro de todos los cambios individuales.

De manera similar al seguimiento de cambios, para capturar estos cambios en C#, se debe usar el sondeo. Sin embargo, en el caso de CDC, la información encuestada contendrá los detalles del cambio, por lo que no es estrictamente necesario volver a los datos en sí.

Desencadenadores de colas

Fuente: https://code.msdn.microsoft.com/Service-Broker-Message-e81c4316

Esta técnica depende de activadores en las tablas de las que se requieren notificaciones. Cada cambio activará un disparador, y el disparador escribirá esta información en una cola del agente de servicio. Luego, la cola se puede conectar a través de C# utilizando el procesador de mensajes de Service Broker (ejemplo en el vínculo anterior).

A diferencia del seguimiento de cambios o CDC, los activadores de las colas no se basan en el sondeo y, por lo tanto, proporcionan eventos en tiempo real.

CLR

Esta es una técnica que he visto usar, pero no la recomendaría. Cualquier solución que dependa de CLR para comunicarse externamente es, en el mejor de los casos, un truco. El CLR se diseñó para facilitar la escritura de código de procesamiento de datos complejo aprovechando C#. No fue diseñado para conectar dependencias externas como bibliotecas de mensajería. Además, las operaciones vinculadas a CLR pueden romperse en entornos agrupados de formas impredecibles.

Dicho esto, es bastante sencillo de configurar, ya que todo lo que necesita hacer es registrar el ensamblaje de mensajería con CLR y luego puede llamar usando disparadores o trabajos SQL.

En resumen…

Siempre ha sido una fuente de asombro para mí que Microsoft se haya negado rotundamente a abordar este espacio problemático. La creación de eventos de la base de datos al código debe ser una característica integrada del producto de la base de datos. Teniendo en cuenta que Oracle Advanced Queuing combinado con el evento ODP.net MessageAvailable proporcionó eventos de base de datos confiables a C# más de Hace 10 añosesto es lamentable de MS.

El resultado de esto es que ninguna de las soluciones enumeradas para esta pregunta es muy buena. Todos tienen inconvenientes técnicos y tienen un costo de instalación significativo. Microsoft, si está escuchando, solucione este lamentable estado de cosas.

En general, usaría Service Broker

Eso es disparador -> cola -> aplicación(es)

Editar, después de ver otras respuestas:

FYI: “Query Notifications” se basa en Service Broker

Edit2:

Más enlaces

  • Broker de servicio/notificación de eventos
  • Equipo de agentes de servicios

valoraciones y reseñas

Nos encantaría que puedieras recomendar esta reseña si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *