Pasión por la tecnología…

abril 21, 2008

SQL Server 2008: Change Data Capture o CDC

Archivado en: SQL Server 2008 — Juan Carlos González Martín @ 20:56

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.

About these ads

Dejar un comentario »

Aún no hay comentarios.

RSS feed para los comentarios de esta entrada. TrackBack URI

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

El tema Rubric Blog de WordPress.com.

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 39 seguidores

%d personas les gusta esto: