SQL Server Change Data Capture es una característica que lee datos históricos de los registros de transacciones de SQL Server y los almacena en una tabla especial.
Mediante el uso de funciones especiales de valores de tabla (TVF), permite al usuario consultar estos datos, lo que permite obtener todos los cambios en una tabla específica o solo los cambios netos que resultaron de los cambios dentro de un tiempo específico.
CDC tiene ciertas ventajas
- Se puede configurar para rastrear solo ciertas tablas o columnas.
- Es capaz de manejar cambios de modelo hasta cierto punto.
- No afecta el rendimiento tanto como los desencadenantes porque funciona con los registros de transacciones.
- Se habilita / deshabilita fácilmente y no requiere columnas adicionales en la tabla que se deban rastrear.
También tiene algunas desventajas:
- La cantidad de datos del historial puede llegar a ser enorme rápidamente.
- No puede rastrear quién realizó los cambios (al menos no para las eliminaciones).
- Los datos del historial tardan un poco en ponerse al día, ya que se basan en los registros de transacciones.
- Depende del Agente SQL Server. Si el Agente no se está ejecutando o se bloquea, no se realiza un seguimiento del historial.
He leído bastante sobre CDC y aunque ahora sé cómo usarlo, todavía no estoy seguro de si es la herramienta adecuada para mí.
- ¿Para qué tareas / escenarios es CDC la herramienta adecuada? (p. ej. ¿Permitir a los usuarios restaurar un objeto de datos en un momento determinado? ¿Auditoría? ¿Mostrar el historial completo de datos?)
- ¿Cuándo debería preferir no usar CDC, sino recurrir a una solución personalizada basada en disparadores?
- ¿Está bien usar CDC en una base de datos operativa y hacer uso de los datos de CDC dentro de una aplicación operativa? (por ejemplo, mostrándolo al usuario final) ¿ O es claramente un mal uso de esta función?
Comúnmente escucho que CDC es una herramienta de auditoría, pero ¿no es eso para lo que sirve SQL Server Audit ? ¿Son ambas herramientas diferentes para la misma tarea? ¿O pueden los CDC usarse para otras cosas?
Mi escenario actual es que me piden que construya un marco de datos confiable que se supone que es la base para múltiples aplicaciones futuras. Los requisitos exactos son borrosos, pero uno es que debería poder rastrear el historial de datos y restaurar las entradas más antiguas junto con todos los datos relacionados de otras tablas. Estoy evaluando los CDC en este momento como una opción, pero no estoy seguro si este es el camino a seguir, porque realmente no puedo encontrar ningún caso de uso recomendado.
Si bien agradezco los consejos para mi escenario específico, las respuestas deberían dar consejos generales sobre cuándo o cuándo no usar Change Data Capture.
fuente
Respuestas:
En primer lugar,
Así que eso puede decidir por usted si alguno de sus clientes no tendrá las ediciones empresariales, o si aún no sabe que usará las ediciones empresariales. (Como la especificación incluye "múltiples aplicaciones futuras", esto puede ser un problema real para usted)
A diferencia de los disparadores, no es en tiempo real, esto es tanto una ventaja como una desventaja. El uso de disparadores siempre ralentiza una actualización.
Trabajé en un sistema cuando usamos activadores (generados por CodeSmith), además de rastrear todos los cambios en los registros, también vinculamos los cambios a una tabla de "historial" que incluía el módulo de la aplicación que realizó el cambio, y el elemento de la IU que el usuario utilizó para realizar el cambio.
Sin embargo, es mejor que resuelva esto a nivel de aplicación, por ejemplo, escribiendo todas las actualizaciones en una cola de mensajes que luego se reproduce para crear una base de datos en cualquier momento dado, consulte Patrones temporales en el blog Martin Flowler para obtener una buena descripción de las opciones.
fuente
Aquí hay una serie de 9 partes muy bien escrita que revisa las diferentes formas de auditar los cambios de datos de SQL Server. Las partes 3, 4 y 5 se centran en los CDC. Vale la pena leer todos los artículos porque esto responderá a sus preguntas, como los diferentes escenarios donde las características serían apropiadas y generales. http://solutioncenter.apexsql.com/tag/methods-for-auditing-sql-server
fuente
Tal vez, depende.
Sí.
Sí.
Cuando los datos en la tabla de cambios no satisfacen sus necesidades.
Sí.
No, no es un mal uso de esta función.
Sí.
No.
Los CDC pueden usarse para otras cosas.
Hay seguimiento de cambios y hay captura de datos de cambio. Ambos tienen sus raíces en la replicación.
El seguimiento de cambios proporciona una manera de proporcionar los cambios netos a una tabla. Un ejemplo de uso sería una sincronización de dispositivo portátil.
Los CDC, por otro lado, realizan un seguimiento de cada pequeño cambio, una historia. Uno puede usar ese historial para actualizar un almacén de datos en lugar de una copia masiva de datos, o uno puede usar ese historial como datos en sí y generar informes a partir de él. La tabla de cambios no está oculta ni tiene un esquema extraño o algo así. Puede consultarlo y usar los datos como quiera. Solo ten en cuenta ... que no es en tiempo real, como dijo Ian. Los datos provienen del registro de transacciones, así que cuídelo como lo haría con la replicación, la duplicación o el envío de registros. En general, será más rápido que los disparadores. Deberá usar el aislamiento de instantáneas, que tiene gastos generales, y tendrá que pensar en la recuperación de desastres.
fuente
Un punto de corrección. En un momento, la captura de datos modificados solo estaba disponible en las versiones mencionadas anteriormente. Sin embargo, la captura de datos de cambio estuvo disponible en la edición estándar a partir de 2016 SP1. Por lo tanto, muchos artículos escritos antes de 2016 SP1 hacen que parezca que los CDC están fuera del alcance de aquellos de nosotros que usamos la edición Standard. Este ya no es el caso. El documento de Microsoft que describe los CDC disponibles se encuentra en el siguiente enlace.
https://docs.microsoft.com/en-us/sql/sql-server/editions-and-components-of-sql-server-2016?view=sql-server-2017#DW
fuente