Un'esigenza che ricorre spesso nelle applicazioni connesse ad un database è quella di effettuare il tracking delle modifiche cui sono normalmente
soggetti i dati.
Un qualsiasi record infatti, rispetto al proprio stato attuale, può aver subito modifiche di vario tipo che vengono perdute con le successive
sovrascritture. Se, ad un certo punto, il record è soggetto a cancellazione, scompare fisicamente (anche se può permanere per un certo tempo nel log di
SQL Server) e viene persa memoria della sua esistenza.
Per alcuni scenari questa modalità di gestione del dato è appropriata ma per altri può essere necessario mantenere traccia delle trasformazioni cui il
dato è soggetto, per motivi legali, statistici, di prova o di garanzia. L'approccio Microsoft al problema passa per la tecnologia di SQL Server Change Data Capture (CDC), disponibile a partire da SQL Server 2008.
E' necessario sottolineare che lo scopo di questa tecnologia non è quello di sostituire in tutto e per tutto la gestione storica di un database: la gestione storica presuppone, infatti, la cristallizzazione di alcuni stati di un singolo dato e non delle singole transazioni cui può essere soggetto.
Pensiamo ad esempio ad una modifica apportata per correggere un errore grammaticale: difficilmente il dato con l'errore entrerà a far parte della
catena storica di quella informazione perché una correzione normalmente non è un evento interessante. Anche una cancellazione può non essere percepita
come importante tenendo in considerazione il fenomeno che si sta elaborando.
In altre parole una gestione storica dei dati ha come presupposto che ai dati e alle loro modificazioni vengano dati significato e valore rispetto al
contesto che li ospita.
CDC invece non entra nel merito del significato dell'inserimento, della modifica o della cancellazione di un dato ma traccia tutto ciò che a
quell'informazione succede. Possiamo interpretare CDC come uno strumento di logging massivo sui dati.
Per trasformare i dati grezzi così raccolti in informazioni significanti, potrebbe essere necessario un ulteriore passaggio verso un data warehouse che
venga costruito in modo da attribuire i giusti significati al raccolto.
Vantaggi rispetto a soluzioni home made
L'esigenza di tracciare le modifiche veniva normalmetne risolta, prima dell'avvento di CDC, con vari artifici applicativi: triggers, colonne con
timestamps, tabella parallele, comandi impartiti direttamente dai software di gestione e così via.
Ogni soluzione di questo tipo, per quanto ben implementata e funzionante, non può che aggiungere un grosso carico di lavoro al database.
CDC è una tecnlogia implementata con l'accortezza di non appesantire l'istanza di SQL Server. Si avvale infatti di un processo asincrono per la cattura
dei dati (lo stesso in uso nel meccanismo delle repliche di SQL Server) leggendo direttamente il transaction log, quindi con un impatto minimo sul
sistema, e scrivendo i risultati sulle change tables (le tabelle che raccolgono le modifiche) che vengono gestite in modo autonomo.
In seguito verranno approfonditi meglio i concetti implicati in questa soluzione.
Abilitazione di CDC
CDC può essere utilizzato nelle versioni Enterprise, Developer e Evaluation di SQL Server 2008 e 2008 R2 (sono quindi escluse le versioni Express e Standard).
E' inoltre necessario avviare SQL Server Agent che verrà impiegato per il monitoraggio delle tabelle sorgenti.
CDC va attivato preventivamente a livello di database utilizzando la stored procedure di sistema sys.sp_cdc_enable_db. Per l'eventuale disattivazione
del servizio va usata invece la stored procedure sys.sp_cdc_disable_db.
L'effetto pratico dell'abilitazione di CDC si può notare dalla creazione di alcune nuove tabelle di sistema come visibile in figura.
Ogni tabella creata da CDC è preceduta dall'indicazione di uno schema apposito (l'omonimo cdc). Se nel database corrente esistesse già uno schema cdc,
SQL Server non sarebbe in grado di abilitare il servizio sul database corrente.
CDC crea anche alcune SP di sistema e un utente apposito (cdc) da utilizzare per la propria gestione.