2009-05-18 14 views
35

Tengo una aplicación que consta de una base de datos y varios servicios. Uno de estos servicios agrega información a la base de datos (desencadenada por un usuario).Notificación de cambio con Sql Server 2008

Otro servicio consulta periódicamente las bases de datos en busca de cambios y utiliza los datos nuevos como entrada para el procesamiento.

Hasta ahora he usado un temporizador configurable que consulta la base de datos cada 30 segundos más o menos. Leí sobre Sql 2005 con la Notificación de cambios. Sin embargo, en Sql 2008 esta característica está en desuso.

¿Cuál es la mejor manera de recibir notificaciones de cambios que ocurrieron en la base de datos directamente en el código? ¿Cuáles son las mejores prácticas?

Respuesta

3

Sí, this blog post explica que Notification Services ahora está en desuso, y también cuáles son los reemplazos o las alternativas, en adelante.

Para sus propósitos - recibir notificaciones de cambios que ocurrieron en el datase - parece que quiere SQL Server Change Tracking. Pero la notificación es un modelo de extracción: su aplicación tiene que hacer la consulta en la tabla de cambios.

No pude averiguar si SqlDependency continúa funcionando con Notification Services obsoleto.

+0

SqlDependency ahora opera fuera de "Service Broker" – lehn0058

3

Existen varias maneras de rastrear cambios en la base de datos: ya sea por desencadenantes que mantienen estructuras temporales como retrasos, registros de seguimiento (también conocidos como 'tablas de auditoría') o el uso de las herramientas de seguimiento de cambios en SQL 2008 como referencias en otra respuesta. Independientemente del mecanismo que utilice, tiene el problema de notificar el cambio al servicio interno. Para esto, puede usar Service Broker y activación basada en eventos. Según lo que describes, parece que la aplicación espera en un evento de la cola. http://msdn.microsoft.com/en-us/library/ms171581.aspx

Si no desea tener el servicio suspendido y quedarse dormido en la cola, puede investigar la activación del servicio en la vida "bajo demanda" utilizando el mecanismo de activación externo en el intermediario de servicios.

2

Puede usar System.Data.SqlClient.SqlDependency (que funciona con Service Broker) para suscribirse a los cambios en una tabla.

18

Notification Services quedó obsoleto, pero no desea utilizarlo de todos modos.

En algunos casos, podría considerar los mensajes de Service Broker; los detalles dependen de tu aplicación

En la mayoría de los casos, probablemente pueda usar SqlDependency o SqlCacheDependency. La forma en que funcionan es que incluye un objeto SqlDependency con su consulta cuando la emite. La consulta puede ser un SELECT simple o un grupo complejo de comandos en un procedimiento almacenado.

Algún tiempo después, si otro servidor web o usuario o página web realiza un cambio en la base de datos que puede provocar cambios en los resultados de la consulta anterior, SQL Server enviará una notificación a todos los servidores que tienen objetos SqlDependency registrados. Puede registrar el código para ejecutar cuando lleguen esos eventos, o el evento simplemente puede borrar una entrada en el Caché.

Aunque necesita habilitar Service Broker para usar SqlDependency, no necesita interactuar explícitamente con él. Sin embargo, también puede usarlo como un mecanismo alternativo; piense más en esto como un sistema de mensajería persistente que garantiza el orden de los mensajes y la entrega de una sola vez.

Los detalles de cómo usar estos sistemas son un poco largos para una publicación en el foro. Puede buscarlos por Google o también proporciono ejemplos en mi libro (Ultra-Fast ASP.NET).

+0

En su respuesta, usted dice que SQL Server enviará una notificación a todos los _servers_ que han registrado una SqlDependency. ¿Funcionaría esta misma idea y sería una buena solución para notificar a los usuarios de una aplicación de escritorio? –

+0

Dije "servidor" principalmente porque así es como se usa normalmente la característica. Sin embargo, también se puede usar para notificar a los clientes, * siempre que * el cliente ya esté accediendo directamente a la base de datos, por lo que no funcionaría para un cliente web, por ejemplo. También hay un costo (pequeño) por cada SqlDependency pendiente, por lo que solo tiene sentido en entornos con un número relativamente pequeño de clientes (por ejemplo, alrededor de 1000). – RickNZ

+0

¿Cuántas conexiones puede manejar SqlDependency? –

Cuestiones relacionadas