01. CDC: Configuración y Mecanismos
CDC registra la actividad DML (Insert, Update, Delete) leyendo el log de transacciones. Es una solución de bajo impacto arquitectónico.
-
Activación DB/Tablas: Se activa en la DB y luego por tablas específicas. Esto genera automáticamente el esquema
cdcy las tablas de cambio. -
Automatización de Jobs: El proceso crea 2 Jobs en el SQL Agent para la DB: uno de captura (Capture) y otro de limpieza (Cleanup).
Proceso de Limpieza (Cleanup)
Retención: Configurable con un mínimo de 1 minuto y un máximo de 100 años.
Umbral de Borrado: Procesa un máximo de 5,000 filas por transacción. Esto evita saturar el log de transacciones.
02. Análisis Técnico de Scripts
EXEC sys.sp_cdc_enable_db;
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'Clientes',
@role_name = N'cdc_admin',
@supports_net_changes = 1;Explicación Técnica:
sp_cdc_enable_db marca la base de datos en los metadatos de SQL Server. Al no definir @captured_column_list, SQL Server mapea todas las columnas. @supports_net_changes genera funciones adicionales para consultar el resultado neto.
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'Ventas',
@captured_column_list = N'ID_Venta, Monto, Fecha',
@role_name = NULL;Explicación Técnica:
Este script permite la optimización de almacenamiento. Al usar @captured_column_list, el Job de captura ignora cambios en columnas no listadas, reduciendo el I/O y el crecimiento del archivo de datos (.mdf).
03. Trigger de Captura de Usuario
CDC extrae datos del Log y no conoce al usuario aplicativo. Esta solución inyecta el usuario en la tabla origen para que CDC lo capture.
ALTER TABLE Clientes ADD UsuarioAudit NVARCHAR(100);
GO
CREATE TRIGGER tr_Clientes_AuditUser
ON Clientes FOR INSERT, UPDATE, DELETE AS
BEGIN
SET NOCOUNT ON;
DECLARE @User NVARCHAR(100) =
CAST(SESSION_CONTEXT(N'user_id') AS NVARCHAR(100));
IF EXISTS (SELECT 1 FROM inserted)
BEGIN
UPDATE c SET UsuarioAudit = @User
FROM Clientes c INNER JOIN inserted i ON c.ID = i.ID;
END
END;El Desafío del DELETE
En un borrado, la fila desaparece. CDC captura el estado de la fila pre-borrado. Para que el usuario aparezca en el log de un DELETE, el usuario debió haber sido persistido previamente.
04. Consulta de Históricos
Para extraer los datos, SQL Server genera funciones TVF (Table-Valued Functions) automáticamente para cada tabla habilitada.
DECLARE @from_lsn binary(10), @to_lsn binary(10);
SET @from_lsn = sys.fn_cdc_get_min_lsn('dbo_Clientes');
SET @to_lsn = sys.fn_cdc_get_max_lsn();
SELECT
CASE __$operation
WHEN 1 THEN 'Eliminado'
WHEN 2 THEN 'Insertado'
WHEN 3 THEN 'Antes de Update'
WHEN 4 THEN 'Después de Update'
END AS TipoOperacion,
* FROM cdc.fn_cdc_get_all_changes_dbo_Clientes(@from_lsn, @to_lsn, 'all');Análisis de la Operación:
La columna __$operation identifica la acción DML. La función devuelve todas las filas de cambio capturadas entre los LSN especificados.
05. Mapeo LSN y Máscara de Update
Consulta por Tiempo
Para consultar por fechas humanas en lugar de LSN binarios.
DECLARE @begin_time datetime = '2023-10-01 08:00:00';
DECLARE @end_time datetime = GETDATE();
DECLARE @from_lsn binary(10) = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
DECLARE @to_lsn binary(10) = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);
SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_Clientes(@from_lsn, @to_lsn, 'all');La Máscara de Cambio (__$update_mask)
Identifica qué columnas cambiaron mediante un mapa de bits.
- Permite detectar cambios en columnas específicas sin comparaciones manuales.
- Se decodifica con
sys.fn_cdc_is_bit_set.
06. Ventajas y Desventajas
Ventajas
- Rendimiento: Proceso asíncrono.
- Mantenimiento: Automático.
- Esquema: Robusto ante cambios.
Desventajas
- Crecimiento: Impacto en el espacio .mdf.
- LOBs: Trunca tipos varchar(max).
- Seguridad: Datos sensibles.