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:
use SQL2008CDC
GO
INSERT INTO dbo.Empleado
values (1, N’Juan Carlos González’, N’jcgonzalez@ciin.es’)
GO
|
use SQL2008CDC
GO
UPDATE dbo.Empleado
SET NombreEmpleado = N’Juan Carlos González Martín’ WHERE ID_Empleado = 1;
GO
|
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.
Y el resultado de la ejecución es el siguiente:
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:
¿Qué más podemos hacer con el CDC?
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:
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.
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
|
–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.