2008-12-04 15 views
6

¿Alguien sabe de una forma de supervisar los cambios en el registro de la tabla en una base de datos SQL Server (2005 o 2008) desde una aplicación .Net? Necesita ser capaz de admitir múltiples clientes a la vez. Cada cliente se "suscribirá" cuando se inicie y "cancelará la suscripción" cuando salga. Múltiples usuarios podrían acceder al sistema a la vez y quiero reflejar sus cambios en el otro cliente de los usuarios. Luego, cuando el cliente maneje el evento de cambio, podría actualizar su objeto local que representa ese registro. Algo similar a cómo Access actualiza los registros que se modifican se refleja en cada formulario que hace referencia a él..Net SQL Server Database Monitoring - Insert, Update, Delete

Sé que Microsoft tiene sus bibliotecas Microsoft.SqlServer para interactuar con un servidor SQL. Pero no estoy seguro de qué concepto se aplica a lo que quiero hacer (o qué podría aplicarse para lo que quiero hacer). Los que parecen ser útiles son los de Management o Replication.

Anticipando que alguien pregunte, "¿por qué no vuelves a consultar la tabla ocasionalmente para buscar nueva información?" Tengo una gran cantidad de tablas que quiero monitorear y eso sería un dolor en el trasero. Además, si estoy buscando algo un poco más elegante.

Estoy abierto a sugerencias ...

Respuesta

0

No he utilizado personalmente, pero suena como servicios de notificación es digno de una mirada

More Here...

+0

FYI: SQL Notification Services está en desuso en SQL 2008, no estará disponible en versiones posteriores a 2008. cite: http://blogs.technet.com/andrew/archive/2008/10/21/sql-server- 2008-notification-services.aspx – Cheeso

0

Este escenario normalmente no lo hace escala muy bien ... podrías buscar servicios de notificación SQL, pero esto tiene los mismos problemas.

En un sistema, lo hago teniendo desencadenantes que escriben un breve resumen de los cambios en una tabla delta (única), incluyendo la tabla, tipo de cambio e ID de fila. Cada cliente mantiene un "donde he leído", y simplemente solicita todos los registros delta con id> este número. El problema es que debe hacer algunas cosas inteligentes para limpiar la tabla sin destruir el historial de cambios de cada cliente individual ... es decir, rastrear los cierres de sesión, asumir que están muertos más allá de un tiempo determinado, y registrar cuando realizan una actualización completa.

Definitivamente factible, pero mucho trabajo.

+0

Lo que usted describe, escriba un breve resumen de los cambios en una tabla separada, es lo que hace la función de seguimiento de cambios de SQL 2008. Entonces los clientes pueden consultar la tabla de cambios para obtener una auditoría de todos los cambios. – Cheeso

2

En SQL Server 2008, tiene Change Tracking que puede rastrear cuando se produce una inserción, actualización o eliminación. Esto hará un seguimiento de que el evento ha sucedido, qué registro fue y, opcionalmente, qué columnas se cambiaron, pero no los valores (antes y después). Esto se suele utilizar para realizar procesos masivos con datos modificados conocidos.

En el seguimiento de cambios establece un período de retención para mantener los cambios, normalmente un período que garantiza que el procesamiento de las tablas rastreadas se encuentre dentro del período de retención.

Como alternativa, tiene (nuevamente, en SQL 2008) Change Data Capture que es más granular y registra los cambios reales. Esto, sin embargo, es solo una característica empresarial.

Usted puede crear fácilmente una aplicación .NET para ejecutar el seguimiento de cambios o captura de datos modificados consultas.

Aquí hay un enlace a más información sobre ambos

Change Tracking

Change Data Capture

En su mayor parte, el seguimiento de cambios es probablemente va a ser la mejor opción - además de que funciona en todas las versiones de SQL Server 2008.

Si desea lograr esto en 2005 o menos, básicamente puede crear tablas para cada tabla que desea rastrear y tener un activador para insertar valores en la tabla de seguimiento en insertar, actualizar, eliminar. Luego, ten un proceso para aclarar esto. Esto es básicamente lo que Change Tracking hace por ti.

+0

Hmm ... Solo estamos usando 2005 en este momento. Probablemente podría impulsar y actualizar a 2008, pero nuestro departamento de control de calidad podría quejarse. Su sugerencia de una tabla de tipo duplicada, podría funcionar.En su mayor parte, todas nuestras tablas se auditan utilizando triggers y tablas de auditoría. Cada cambio se registra en ellos. – CuppM

+0

Pero el uso de las tablas de auditoría requeriría un hilo de fondo que sondee constantemente esas tablas. Publiqué la misma pregunta en los formularios de MSDN (http://forums.microsoft.com/TechNet/ShowPost.aspx?PostID=4209397&SiteID=17). Alguien sugirió System.Data.Sql.SqlNotificationRequest. ¿Alguna idea sobre eso? – CuppM

+0

FYI: SQL Notification Services, requerido por SqlNotificationRequest, está en desuso en SQL 2008, no estará disponible en versiones posteriores a 2008. cite: http://blogs.technet.com/andrew/archive/2008/10/21 /sql-server-2008-notification-services.aspx Basado en eso Yo recomendaría que mira otras opciones. – Cheeso

0

Creo que leí mal la pregunta.

Parece que se trata de una aplicación estándar multiusuario con control de bloqueo. el usuario inicia sesión y luego accede a los datos en el servidor (suscribirse). El usuario cierra la sesión (cancelar suscripción).

¿O se trata de una aplicación desconectada en la que desea sincronizar los cambios?

Para las aplicaciones desconectadas, puede usar syncservices para SQL Server.

Aparte de eso, solo use LINQ to Entities y puede manejar los conflictos cuando guarda los cambios del objeto. Para garantizar que las consultas producidas por LINQ sean efectivas, puede agregar una columna TIMESTAMP a cada tabla, pero no es obligatorio.

+0

Esta es una "aplicación multiusuario estándar". No estoy usando LINQ. Estamos utilizando plantillas laminadas personalizadas (influenciadas por NetTiers) en CodeSmith, de modo que podemos crear clases y bibliotecas de acceso a datos que se ejecutan tanto en el marco .Net completo como en el Marco Compacto. – CuppM

7

Para controlar los cambios en una tabla SQL o registrar en SQL 2005+, puede utilizar la clase SqlDependency.

Está destinado para su uso en ASP.NET o un servicio de nivel medio donde un solo servidor gestiona suscripciones activas en una base de datos, no cientos de clientes administrando suscripciones. Dependiendo de la cantidad máxima de clientes a los que se refiere, es posible que desee crear un servicio de agrupamiento de caché que pueda administrar las suscripciones de notificación contra SQL a sus clientes.

En su interior utiliza SqlNotificationRequest que utiliza Service Broker, no Notification Services. Por lo tanto, esto debería funcionar en el futuro en SQL 2008, etc.

MSDN for SqlDependency

void Initialization() 
{ 
    // Create a dependency connection. 
    SqlDependency.Start(connectionString, queueName); 
} 

void SomeMethod() 
{ 
    // Assume connection is an open SqlConnection. 

    // Create a new SqlCommand object. 
    SqlCommand command=new SqlCommand(
    "SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers", 
    connection); 

    // Create a dependency and associate it with the SqlCommand. 
    SqlDependency dependency=new SqlDependency(command); 
    // Maintain the refence in a class member. 

    // Subscribe to the SqlDependency event. 
    dependency.OnChange+=new OnChangeEventHandler(OnDependencyChange); 

    // Execute the command. 
    command.ExecuteReader(); 
    // Process the DataReader. 
} 

// Handler method 
void OnDependencyChange(object sender, 
    SqlNotificationsEventArgs e) 
{ 
    // Handle the event (for example, invalidate this cache entry). 
} 

void Termination() 
{ 
    // Release the dependency. 
    SqlDependency.Stop(connectionString, queueName); 
} 

"Using and Monitoring SQL 2005 Query Notifications" artículo que habla a través de los pasos para configurarlo en su código (usando una aplicación web como ejemplo) junto con los permisos de SQL apropiados que se requieren para suscribirse a Service Broker, etc.

Una clase ASP.NET (web caching) también está disponible para escenarios web.

+0

¡No use SqlDependency! Deja basura en la base de datos que rastrea y no realiza la limpieza después de ella. Ver esta respuesta: http://stackoverflow.com/questions/8511806/how-do-i-clean-sqldependency-from-sql-server-memory/28148136#28148136 – dyatchenko

Cuestiones relacionadas