SQL Server 2008: Change Data Capture o CDC

Como os comentaba la semana pasada, estos días estoy “a tope” aprendiendo un montón de características y capacidades de SQL Server 2008. Algunas ya conocidas de la versión anterior (y que yo no conocía), y otras completamente nuevas, útiles y espectaculares. Una de estas nuevas características es el Change Data Capture o simplemente CDC (para los amigos ;)). Esta utilidad permite capturar toda la actividad de inserción, borrado y actualización que se produzca en las tablas de una BD SQL Server 2008. Además, toda la información capturada se podrá consumir de un modo sencillo en formato relacional.

La clave del CDC son un conjunto de tablas de cambio que contienen una serie de columnas que son un reflejo de las estructura de las columnas de la tabla fuente a la que se le está realizando el seguimiento de cambios, así como unos metadatos necesarios para comprender los cambios que se han producido. Empecemos.

Haciendo funcionar el CDC

Para probar el CDC, vamos a seguir los siguientes pasos:

  • Creamos una BD denominada SQL2008CDC.
  • Ejecutamos el procedimiento almacenado (SP) sp_cdc_enable_db, que se encarga de habilitar el CDC en la BD.
  • Creamos una tabla de prueba en la BD.
  • Ejecutamos el SP sp_cdc_table, para habilitar el CDC en la tabla que acabamos de crear.

CREATE DATABASE SQL2008CDC

GO

USE SQL2008CDC

GO

                        EXEC sys.sp_cdc_enable_db

GO

USE SQL2008CDC

GO

CREATE TABLE dbo.Empleado(

                        ID_Empleado int Primary Key NOT NULL,

                        NombreEmpleado nvarchar(100) NOT NULL,

                        EmailEmpleado nvarchar(100) NOT NULL)

GO

                        EXEC sys.sp_cdc_enable_table ‘dbo’, ‘Empleado’, @role_name = NULL,

                                               @supports_net_changes =1;

GO

Si todo ha ido bien, la salida por pantalla que se produce al ejecutar el script anterior debería ser:

image

  • Insertamos un registro en la tabla:

use SQL2008CDC

GO

INSERT INTO dbo.Empleado

                        values (1, N’Juan Carlos González’, N’jcgonzalez@ciin.es’)

GO

  • Actualizamos el registro anterior:

use SQL2008CDC

GO

UPDATE dbo.Empleado

                        SET NombreEmpleado = N’Juan Carlos González Martín’ WHERE ID_Empleado = 1;

GO

  • Para comprobar que ha hecho el CDC, ejecutamos la siguiente sentencia SELECT:

select * from cdc.dbo_Empleado_CT

Esta sentencia nos permite consultar en la tabla de cambios que se ha creado en la BD SQL2008CDC (aparece dentro de System Tables) los cambios que se han producido en la tabla origen (Empleado). De paso, os pongo el correspondiente pantallazo en el que podemos ver dos cosas interesantes :):

  • Por una parte, tenemos que dentro de la carpeta System Tables de nuestra BD aparecen una serie de tablas que el CDC utiliza para hacer toda el seguimiento de cambios que se vaya produciendo.
  • Por otro, el ya conocido soporte de Intellisense que introduce SQL Server 2008.

image

Y el resultado de la ejecución es el siguiente:

image

Como vemos, la salida de ejecutar la sentencia anterior produce un total de 3 filas que identifican el número de operaciones que se han realizado en la tabla origen. La operación es identificado a través del valor que aparece en la columna _$operation:

  • Un valor 1 implica que se ha borrado el registro de la BD.
  • Un valor 2 identifica que se ha realizado un INSERT.
  • Un valor 3 indica que el registro en la tabla es el valor previo a una actualización de un registro en la tabla origen.
  • Un valor 4 indica que el registro en la tabla es el valor posterior a una actualización de un registro en la tabla origen.

¿Dónde se guardan las columnas cuyo cambio de valor estamos capturando? En la tabla cdc_captured_columns:

image

¿Qué más podemos hacer con el CDC?

  • Devolver sólo los registros que han contienen los valores antes y después de un UPDATE:

GO

                        DECLARE @from_lsn binary(10), @to_lsn binary(10);

                                               SET @from_lsn = sys.fn_cdc_get_min_lsn(‘dbo_Empleado’);

                                               SET @to_lsn = sys.fn_cdc_get_max_lsn();

                        SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_Empleado(@from_lsn, @to_lsn, ‘all’);

GO

La salida que se obtiene es la siguiente:

image

Lo que estamos haciendo es devolver mediante las funciones fn_cdc_get_min_lsn() y fn_cdc_getmax_lsn() los registros mínimo y máximo que se están guardando en la tabla cdc.lsn_time_mapping. Esta tabla, que se crea en el momento que se activa el CDC, almacena los valores LSN (Log Secuence Number) que se generan como consecuencia de cada transacción que contiene filas de datos en una tabla de cambios, así como el instante de tiempo en el que se produjo la transacción.

  • Limpiar las tablas CDC y deshabilitar el CDC:

use SQL2008CDC

GO

                        DECLARE @end_time datetime;

                        DECLARE @to_lsn binary(10);

                                               SET @end_time = GETDATE();

                        SELECT @to_lsn = sys.fn_cdc_map_time_to_lsn(‘largest less than or equal’,

                                               @end_time);

                        exec sys.sp_cdc_cleanup_change_table @capture_instance = ‘dbo_Empleado’,

                                               @low_water_mark=@to_lsn

GO

  • Deshabilitar el CDC completamente:

–Deshabiltiando el CDC a nivel de tabla

EXECUTE sys.sp_cdc_disable_table

@source_schema = N’dbo’,

@source_name = N’Empleado’,

@capture_instance = N’dbo_Empleado’

–Deshabilitando el CDC a nivel de BD

USE SQL2008CDC

GO

Exec sys.sp_cdc_disable_db

En resumen, CDC facilita un mecanismo que permite capturer cambios en una BD de manera sencilla. Espero que el post os haya resultado interesante.

Publicado por

Juan Carlos González

Juan Carlos es Ingeniero de Telecomunicaciones por la Universidad de Valladolid y Diplomado en Ciencias Empresariales por la Universidad Oberta de Catalunya (UOC). Cuenta con más de 12 años de experiencia en tecnologías y plataformas de Microsoft diversas (SQL Server, Visual Studio, .NET Framework, etc.), aunque su trabajo diario gira en torno a SharePoint & Office 365. Juan Carlos es MVP de Office Servers & Services desde 2015 (anteriormente fue reconocido por Microsoft como MVP de Office 365 y MVP de SharePoint Server desde 2008 hasta 2015), coordinador del grupo de usuarios .NET de Cantabria (Nuberos.Net, www.nuberos.es), co-fundador y coordinador del Grupo de Usuarios de SharePoint de España (SUGES, www.suges.es), así como co-director de la revista gratuita en castellano sobre SharePoint CompartiMOSS (www.compartimoss.com). Hasta la fecha, ha publicado 8 libros sobre SharePoint & Office 365 y varios artículos en castellano y en inglés sobre ambas plataformas.

6 comentarios en “SQL Server 2008: Change Data Capture o CDC”

  1. Tiene muy buena pinta, sera bastante util y lo del intelisense, ya era hora, al menos no tenemos que comprar sql_prompt, a ver si tenemos suerte e incorporan refactoring, salu2.

  2. Buenas Espinete,
    Aunque las pruebas que he realizado son sencillas, si que penaliza el rendimiento de la BD activar el CDC. Sin embargo, como esta activación será una vez y en un momento en el que se pueda hacer, yo no me preocuparía por su efecto sobre la BD…luego una vez activado, el tracking de seguimiento de las modificaciones no parece que penalice la BD…de todos modos, supongo que en breve saldrá algún artículo con respecto a este tema.

    Juan…pues hombre, lo del intellisense está claro que es un avance, aunque a mi me resulta raro usarlo en el Management Studio ;)…no se si llegarán a introducir refactoring, pero como dices, sería la caña.

    Un saludo

    JC’s

  3. tengo una pregunta tengo que activar el cdc an tes de hacer algun procedimiento por que me sale un mensaje de error
    porfa si me puedes decir donde lo activo

    gracias

  4. Buenas Fernando,
    Efectivamente, el CDC tiene que ser activado a priori. Al comienzo del post tienes como hacerlo mediante la ejecución de los SP sp_cdc_enable_db y sp_cdc_table.

    Un saludo

    JC’s

  5. Muchas gracias por la información que nos das. Lamentablemente todo esto no sirve de nada si tienes Sql Server 2008 versión Standard.

    Abría alguna solución similar para la versión Standard?

    Un saludo

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *