2012-08-13 12 views
10

Attualmente sto esplorando Change Data Capture come opzione per archiviare i database temporali. È fantastico perché memorizza solo i delta e sembra che possa risolvere il mio problema. Quando ho attivato CDC, un gruppo di tabelle è apparso sotto System Tables.Come si ricostruisce una vista storica?

Quando si esegue una query su cdc.dbo_MyTable, sono in grado di vedere tutte le modifiche che hanno avuto luogo sulla tabella. Ora, come potrei costruire una visione storica? Per esempio, se volessi vedere lo stato del mio tavolo come di una data particolare, come potrei fare per farlo? È possibile?

Sembra che ho bisogno di prendere il registro e iniziare ad applicarlo sul mio tavolo originale, ma mi chiedevo se c'è un modo integrato per farlo. Eventuali suggerimenti?

Alcuni dei casi d'uso Sto cercando:

  • conoscere lo stato del grafico in un determinato momento
  • Dati due grafici in tempi diversi, conoscere la serie di link che sono diversi (questo probabilmente può essere ottenuto usando una clausola EXCEPT dopo la costruzione delle tabelle)
+0

cosa vuoi dire che vuoi calcolare il diff? esempio di output? – Jaguar

+0

@Jaguar: sono stati aggiunti due casi d'uso. Grazie! – Legend

risposta

6

è possibile, ma non con un modo incorporato ho paura. Dovresti ricostruire manualmente la sequenza temporale.

Dato che le tabelle di tracciamento delle modifiche offrono il tran_end_time, che è il tempo in cui il valore della proprietà deve essere percepito come persistente, è necessario creare una query che recuperi tutti i periodi distinti degli stati della tabella, join on la proprietà tracciata cambia e quindi ruota (per avere una presentazione nella stessa forma della tabella). Non dimenticare di unione con lo stato della tabella stessa per ottenere i valori che non sono stati modificati/tracciati per completezza.

Il risultato finale, semplificato, dovrebbe assomigliare

RN PK PropA PropB FromDate   ToDate 
1 1 'Ver1' 'Ver1' 2012-01-01 09:00 2012-01-02 08:00 
2 1 'Ver1' 'Ver2' 2012-01-02 08:00 2012-01-03 07:00 
3 1 'Ver2' 'Ver2' 2012-01-03 07:00 *getdate()* 
4 2 'Ver1' 'Ver1' 2012-01-01 05:00 2012-01-02 06:00 
5 2 'Ver1' 'Ver2' 2012-01-02 06:00 2012-01-03 01:00 
6 2 'Ver2' 'Ver2' 2012-01-03 01:00 *getdate()* 

nota che il getdate() è valido se la riga non è stata eliminata nel qual caso deve essere sostituito dalla data delezione

MODIFICA, per i 2 casi d'uso. Il primo punto è facilmente indirizzata è una questione di costruire l'oggetto grafico temporale e quindi filtrando:

declare @pointInTime datetime = '20120102 10:00'; 
select * from Reconstructed_TG where FromDate <= @pointInTime and @pointInTime < ToDate 

il secondo punto, possono essere generati facilmente con la clausola EXCEPT, come fai notare. dato query precedente:

declare @pointInTimeA datetime = '20120102 10:00'; 
declare @pointInTimeB datetime = '20120103 01:00'; 
select * from Reconstructed_TG where FromDate <= @pointInTimeA and @pointInTimeA < ToDate 
EXCEPT 
select * from Reconstructed_TG where FromDate <= @pointInTimeB and @pointInTimeB < ToDate 

ancora la clausola except presenta solo le righe che hanno almeno un valore di colonna diverso; non so se quell'informazione sia veramente significativa per l'occhio umano. A seconda delle esigenze, una query che funziona direttamente sui dati cdc potrebbe essere più appropriata.

+1

+1 Grazie per il vostro tempo e impegno! Esplorerò questo più profondo e lo adatterò. Assegnato il premio! :) – Legend

0

You may want to check out Snapshots, che sono state costruite a SQL Server dal 2005.

Questi saranno più utile a voi se avete solo bisogno di un paio timepoints, ma possono aiutare a tenere traccia di tutte le tabelle di un database complesso .

Questi sono i delta, così Compared to a full copy of a database, however, snapshots are highly space efficient. A snapshot requires only enough storage for the pages that change during its lifetime. Generally, snapshots are kept for a limited time, so their size is not a major concern.

+4

Le istantanee possono essere utili se si conosce * avanti * di volta in cui si desidera conservare una copia dei dati. Se ti stai chiedendo "Com'era lo stato alle 2 di ieri" e ieri non hai fatto un'istantanea alle 2 di pomeriggio, allora non ti aiuteranno. –

0

io non sono sicuro di questo, mai fatto niente del genere, ma forse si può aggiungere una colonna "di modifiche" al tavolo che può tenere traccia delle modifiche sul tavolo, ogni volta che c'è una transazione ottieni il massimo (changeset) e salva i nuovi cahnges con il valore successivo ... Oppure se hai un timestamp e vuoi conoscere lo stato della tua tabella in un dato momento fai le query per filtrare i cambiamenti precedente alla data che si desidera controllare ... (Non so se dovrei scrivere questo è come una risposta o un commento ... Sono nuovo qui)

In ogni caso, spero che aiuti ...

Problemi correlati