Intervallo di validità di una capture instance
Una capture instance è dotata di default di una finestra di validità dei dati estratti dalle source table equivalente al massimo a tre giorni. Superato questo limite la finestra viene spostata verso l'alto e i dati vecchi sono eliminati non appena il job di pulizia si attiva.
Naturalmente se la configurazione di default viene modificata e il tempo di retention accorciato o allungato, anche la finestra di validità dei dati si modifica di conseguenza.
Il punto di partenza della validità di una capture instance è rappresentato dalla colonna start_lsn (vedere il paragrafo sulla descrizione della change table). Questo valore (espresso in notazione esadecimale) è fondamentale per una corretta estrazione dei dati della capture instance.
La richiesta del limite inferiore di una capture instance per una tabella, avviene tramite la funzione di sistema sys.fn_cdc_get_min_lsn. La funzione necessita del nome della capture instance come parametro perché i punti di partenza delle varie capture instance presenti in un db potrebbero essere differenti. PRINT sys.fn_cdc_get_min_lsn('dbo_Prodotti')
Al contrario la restituzione del limite massimo non necessita di alcun argomento in quanto identico in tutte le capture instance di un db. PRINT sys.fn_cdc_get_max_lsn()
Per spiegare quella che sembra essere una stranezza consideriamo che i limiti massimo e minimo non sono altro che dei puntatori al log di SQL Server. Il limite massimo identifica l'ultima registrazione del log in assoluto. I limiti inferiori invece, potrebbero differire anche se, con lo spostarsi in avanti della finestra di validità, alla fine le varie capture instance finiranno per avere un punto di partenza coincidente.
Esistono due funzioni per la conversione da e verso il tipo dato DateTime e lsn. Si tratta di sys.fn_cdc_map_lsn_to_time e sys.fn_cdc_map_time_to_lsn.
Nell’esempio qui sotto viene restituito l’equivalente DateTime del limite massimo delle catture dei dati operate da CDC.
PRINT sys.fn_cdc_map_lsn_to_time(sys.fn_cdc_get_max_lsn())
Si ponga sempre molta attenzione alla validazione dei punti di partenza e fine di lsn perché l’utilizzo delle funzioni di interrogazione con parametri di estrazione esterni alla finestra di validità dei dati, non restituisce un messaggio di errore sufficientemente chiaro.
Proviamo a chiedere la restituzione di una finestra di dati non valida (all’estremo inferiore ottenuto dalla funzione apposita viene tolta una unità).
SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_Prodotti( sys.fn_cdc_get_min_lsn('dbo_Prodotti')-1, sys.fn_cdc_get_max_lsn(), N'all')
La risposta sarà la seguente:
Msg 313, Level 16, State 3, Line 2 An insufficient number of arguments were supplied for the procedure or function cdc.fn_cdc_get_all_changes_ ...
Molto criptico!
Estrazione dei dati
La validazione dei confini di competenza di una Capture Instance è fondamentale per una corretta estrazione dei dati dalle capture table.
Fin’ora infatti ci siamo limitati ad una lettura raw della tabella cdc.dbo_Prodotti_CT ma la corretta modalità di interazione con le capture tables passa attraverso le funzioni apposite che vengono messe a disposizione da CDC.
Tali funzioni richiedono che l’utente specifichi i limiti di estrazione e, nel caso di lsn esterni ai limiti disponibili, restituiscono un errore.
Le funzioni di estrazioni sono fn_cdc_get_all_changes_dbo_Prodotti e fn_cdc_get_net_changes_dbo_Prodotti.
Nota
La documentazione MSDN in questo punto contiene un errore. Si sostiene infatti che la funzione fn_cdc_get_net_changes_ venga creata solo se esplicitamente richiesta dall’utente al momento dell’abilitazione di CDC per la tabella (con il parametro @supports_net_changes = 1. In realtà il default del parametro è già a 1 e va specificato solo se non si desidera che SQL Server crei la funzione per l’interrogazione di net_changes.