Change Data Capture in SQL Server 2008
Questa mattina stavo esplorando una delle nuove funzionalità di SQL Server 2008, il Change Data Capture (CDC), ovvero la possibilità di monitorare in maniera asincrona le modifiche ad una tabella.
Finora la strada passava per l'implementazione di un trigger che intercetti le modifiche ai dati e popoli una tabella in cui conservare la cronologia; per le modifiche alla struttura era invece necessario implementare un trigger DDL (e questo solo a partire da SQL Server 2005). Entrambe queste soluzioni sono però sincrone ed avvengono nella stessa transazione del comando che le ha scatenate con potenziali problemi di scalabilità. Una soluzione asincrona può essere realizzata ricorrendo al Service Broker e nella mia sessione al WPC di 2 settimane fa una delle demo era incentrata su uno scenario simile.
In SQL Server 2008 si aggiunge questa nuova funzionalità del Change Data Capture; vediamo un esempio...
--Definisco un db e una tabella su cui costruirò la demo
CREATE DATABASE TestCDC;
GO
USE TestCDC;
GO
CREATE TABLE dbo.T_cdc
(
ID smallint NOT NULL,
c1 varchar(50) NOT NULL
);
GO
--Verifichiamo che il db non sia già abilitato per il cdc (per default non lo è)
SELECT name, is_cdc_enabled FROM sys.databases;
--Abilitiamo il cdc sul db
EXEC sys.sp_cdc_enable_db_change_data_capture;
--Abilitiamo il cdc sulla tabella
--Viene creato un ruolo, i metadati e 2 job (per la cattura ed il cleanup dei dati)
EXEC sys.sp_cdc_enable_table_change_data_capture @source_schema = 'dbo', @source_name = 'T_cdc', @role_name = 'cdc_role';
GO
-- Andiamo quindi a movimentare la tabella
INSERT dbo.T_cdc VALUES (1, 'primo record');
INSERT dbo.T_cdc VALUES (2, 'secondo record');
GO
UPDATE dbo.T_cdc
SET c1 = 'record modificato'
WHERE ID = 1
GO
--Verifichiamo il contenuto della tabella
SELECT * FROM dbo.T_cdc
--Con la query seguente recupero la cronologia delle modifiche
SELECT * FROM cdc.dbo_T_cdc_CT
Come si vede l'implementazione è molto semplice. L'acquisizione dei dati con cui popolare la tabella che contiene la cronologia delle modifiche avviene tramite un job (pertanto la funzionalità richiede che il servizio SQL Agent sia in esecuzione) che va a scandagliare il Transaction Log; un altro job provvede alla rimozione, dalla tabella cdc.dbo_T_cdc_CT. I record vengono rimossi dalla tabella, per impostazione predefinita, dopo 72 ore (entro questo periodo di tempo possono comunque essere archiviati su un'altra tabella, esportati altrove o semplicemente archiviati tramite il normale processo di backup dei dati). Ovviamente è possibile modificare l'impostazione tramite la stored procedure sp_cdc_change_job.
Chi volesse esplorare la funzionalità troverà nel BOL ulteriori fonti di documentazione, la lista delle tabelle che vengono create a supporto del cdc, delle stored procedure per esaminare i metadati e modificare le impostazioni e quant'altro.
Le mie prove le ho fatte con la CTP5 (build 10.0.1075) e non posso garantire il funzionamento di quanto sopra con build precedenti...
Bye