2012-08-13 17 views
10

Actualmente estoy explorando Change Data Capture como una opción para almacenar bases de datos temporales. Es genial porque almacena solo los deltas y parece que puede resolver mi problema. Cuando habilité CDC, apareció un grupo de tablas bajo System Tables.¿Cómo reconstruyo una vista histórica?

Al consultar cdc.dbo_MyTable, puedo ver todos los cambios que tuvieron lugar en la mesa. Ahora, ¿cómo podría construir una vista histórica? Por ejemplo, si quisiera ver el estado de mi mesa a partir de una fecha en particular, ¿cómo podría hacer eso? ¿Es eso posible?

Parece que necesito tomar el registro y empezar a aplicarlo sobre mi tabla original, pero me preguntaba si existe una forma integrada de hacerlo. ¿Alguna sugerencia?

Algunos de los casos de uso que estoy mirando:

  • conocer el estado de la gráfica en un punto particular en el tiempo
  • Dadas dos gráficos en diferentes momentos, conocer el conjunto de enlaces que son diferentes (Esto probablemente se puede obtener utilizando una cláusula EXCEPT después de construir las tablas)
+0

¿qué quiere decir con que quiere calcular la diferencia? ejemplo de salida? – Jaguar

+0

@Jaguar: se agregaron dos casos de uso. ¡Gracias! – Legend

Respuesta

6

es posible, pero no con una función incorporada, tengo miedo. Tendría que reconstruir la línea de tiempo a mano.

Dado que las tablas de seguimiento de cambios ofrecen el tran_end_time, que es el momento en que el valor de la propiedad debe percibirse como persistente, debería realizar una consulta que recupere todos los períodos distintos de estados de tabla, únase a la propiedad rastreada cambia y luego pivota (para tener una presentación en la misma forma que la tabla). No te olvides de unirte al estado de la tabla para obtener los valores que no se han modificado/rastreado para ver si están completos.

El resultado definitivo, simplificado, debe ser similar

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 de que el getdate() es válida si la fila no se ha eliminado en cuyo caso debe ser sustituida por la fecha de eliminación

EDITAR, para los 2 casos de uso. El primer punto es fácilmente dirigido que es una cuestión de construir el gráfico de objetos temporal y filtrando a continuación:

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

el segundo punto, se pueden generar fácilmente con la cláusula Excepto, como usted señala. dada la consulta anterior:

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 

todavía la cláusula except solamente presenta las filas que tienen al menos un valor de columna diferente; No sé si esa información es realmente significativa para el ojo humano. Dependiendo de sus necesidades, una consulta que funcione directamente en los datos cdc puede ser más apropiada.

+1

+1 ¡Gracias por su tiempo y esfuerzo! Voy a explorar esto más profundo y adaptarlo. ¡Galardonado con la recompensa! :) – Legend

0

You may want to check out Snapshots, que se han construido en SQL Server desde 2005.

Estos serán más útiles para usted si usted sólo necesita unos pocos puntos de tiempo, pero pueden ayudar a rastrear todas las tablas de una base de datos compleja .

Estos son los deltas, por lo 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

Las instantáneas pueden ser útiles si sabe * antes * las horas en las que desea conservar una copia de los datos. Si se está preguntando "¿cuál era el estado ayer a las 2 p.m." y no tomó una instantánea ayer a las 2 p.m., no lo van a ayudar? –

0

No estoy seguro de esto, nunca ha hecho nada por el estilo, pero tal vez usted puede agregar una columna "conjunto de cambios" a la tabla que se puede realizar un seguimiento de los cambios que ha sobre la mesa, cada vez que haya una transacción obtenga el máximo (conjunto de cambios) y guarde los nuevos valores con el siguiente valor ... O si tiene una marca de tiempo y desea saber el estado de su tabla en algún momento haga las consultas para filtrar los cambios anterior a la fecha que desea verificar ... (No estoy seguro de si debo escribir esto es como una respuesta o un comentario ... Soy nuevo aquí)

De todos modos, espero que ayude ...

Cuestiones relacionadas