SQLDependency + Service Broker

Sto utilizzando SqlDependency per ricevere notifiche quando i dati in alcune tabelle vengono modificati.

private void subscribeBroker() { using (var conn = new SqlConnection(connString)) { conn.Open(); var cmd = new SqlCommand("SELECT text FROM dbo.Test"); cmd.Connection = conn; var dependency = new SqlDependency(cmd); dependency.OnChange += dependency_OnChange; SqlDependency.Start(connString); cmd.ExecuteNonQuery(); } } void dependency_OnChange(object sender, SqlNotificationEventArgs e) { //Do something... subscribeBroker(); } 

Funziona ma ho alcune domande.

1) Non ho trovato un modo per ottenere informazioni su quale riga è stata modificata. Ho bisogno di leggere tutti i dati dell’intero tavolo per vedere cosa è diverso. C’è un modo per ottenere queste informazioni? (ID principale o qualcosa) Forse utilizzare un approccio diverso rispetto a SqlDependency?

2) Cosa succede se “qualcuno” modifica i dati molto velocemente. È ansible che alcune modifiche non vengano notificate? (Sono preoccupato per il tempo che intercorre tra la notifica e l’ora in cui mi iscrivo nuovamente.

Grazie.

Circa 1- la notifica di query ti informa sul fatto che qualcosa è cambiato. Se vuoi ottenere ciò che è stato modificato dall’ultima volta, potresti probabilmente utilizzare la colonna timestamp.

Circa 2- la notifica di query informa sulle modifiche e quindi viene interrotta. quindi ti iscrivi nuovamente per ricevere nuovamente la notifica. che il tempo medio tra il rilascio e la creazione di notifiche è il momento in cui la notifica delle modifiche non viene inviata.

Le notifiche delle query sono più utili per le situazioni, quando i dati non cambiano frequentemente. Ad esempio, alcuni valori di classificazione incassati. Quindi, ti iscrivi alle modifiche in alcune tabelle, attendi le modifiche e nel momento in cui si verificano ottieni l’ultima versione dei dati. Dovresti considerare che la notifica della query utilizza anche le risorse del server, quindi se hai una tabella enorme e vuoi ottenere delle modifiche su un piccolo sottoinsieme di dati, molte delle query possono essere influenzate in termini di prestazioni (qualcosa come la vista indicizzata).

Se è necessario intraprendere un’azione in base ai dati modificati e ogni modifica è importante, suppongo che il trigger + broker di servizi potrebbe essere più efficace. Oppure, in base alle proprie esigenze, Change Data Capture.