2015-04-17 3 views
5

Sto sviluppando un progetto per la mia azienda e ho bisogno di rilevare le modifiche sulla tabella di un'altra azienda. In altre parole, inseriranno/aggiorneranno alcuni dati e ho bisogno di cogliere questi cambiamenti. Sono disposto a provare SQLDependency ma non sono sicuro della velocità e delle prestazioni, ma ha bisogno di molte autorizzazioni. Oltre a questi inconvenienti, non voglio perdere i cambiamenti di cui ho bisogno, il tempo conta davvero in questo progetto.Rileva modifiche su una tabella sql-server

Come posso rilevare queste modifiche con le migliori prestazioni?

+1

Penso che potresti usare i trigger. Dai un'occhiata a https://msdn.microsoft.com/en-GB/library/ms189799.aspx – panagdu

+0

Quali autorizzazioni * hai * nel database? –

+0

Basta selezionare. Discuteremo degli altri dipendono dalle proprietà del progetto. –

risposta

2

SQL dipendenza non funziona per voi, se si vuole garantire nessun dato viene perso. La dipendenza SQL funziona solo nell'ambito della registrazione della propria applicazione per ricevere notifiche. Ciò significa che se la tua domanda è inattiva per qualsiasi motivo, hai perso alcune notifiche.

Sarà necessario esaminare qualcosa di più vicino al livello del database stesso per assicurarsi di ricevere tutte le notifiche (modifiche dei dati).

Probabilmente è possibile avere trigger che aggiornano una tabella di staging. Fai attenzione quando usi i grilletti. Un errore o una risposta lenta nei trigger possono influire sulle prestazioni delle operazioni del database di origine &.

È possibile abilitare la replica e lavorare sui dati di replica all'interno dell'applicazione e contrassegnare i record già elaborati.

+0

I trigger non funzionano per noi, c'è una mancanza di prestazioni. –

+0

Che tipo di volume di transazione stai cercando di gestire? –

1

Potete guardare la funzione "Change datacapture" di SQL Server: https://msdn.microsoft.com/en-us/library/cc645937.aspx

+0

Controllare anche il rilevamento delle modifiche. È una soluzione più leggera, ma probabilmente farà ciò di cui hai bisogno. https://msdn.microsoft.com/en-us/library/bb933875.aspx –

+0

Ho fatto ma non sono riuscito a trovare il lato C# della tecnologia. –

+0

Non c'è un lato C#. È come interrogare una tabella classica o chiamare una stored procedure. Puoi utilizzare Ado .Net se vuoi o Entity Framework. – Pak

1

È possibile utilizzare una realizzazione open source della classe SqlDependency - SqlDependencyEx. Utilizza un trigger del database e una notifica nativa di Service Broker per ricevere eventi relativi alle modifiche della tabella. Questo è un esempio di utilizzo:

int changesReceived = 0; 
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
      TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{ 
    sqlDependency.TableChanged += (o, e) => changesReceived++; 
    sqlDependency.Start(); 

    // Make table changes. 
    MakeTableInsertDeleteChanges(changesCount); 

    // Wait a little bit to receive all changes. 
    Thread.Sleep(1000); 
} 

Assert.AreEqual(changesCount, changesReceived); 

Con SqlDependecyEx voi sono in grado di monitorare INSERT, DELETE, UPDATE separatamente e ricevere reale i dati modificati (xml) in caso args oggetto. Spero che questo aiuto.

+0

qual è il tuo parametro changeCount qui? da dove lo prendi? – Dominik

+0

@Dominik, questo codice è stato preso da un test unitario come esempio. ChangesCount è un valore previsto che è hardcoded. Puoi trovare questo test unitario attraverso il link fornito nella risposta. – dyatchenko