Olá pessoas!
Uma feature muito interessante para quem deseja fazer “log” de dados históricos do banco de dados, de forma a não prejudicar o desempenho do banco ou ter que criar um monte de triggers e tabelas de log, é o Change Data Capture, ou simplesmente CDC. Esta feature presente no SQL Server 2008 nas edições Developer e Enterprise.
O CDC permite de forma simplificada monitorar e manter histórico das alterações de determinadas tabelas no banco de dados. Isso quer dizer que, não será necessário desenvolver toda uma estratégia complexas com triggers para salvar a execução de INSERT, DELETE e UPDATE, pois com esta feature permite isso de forma descomplicada e performática.
Ok, para que preciso manter histórico das alterar das minhas tabelas no banco e dados? A motivação mais comum é a possibilidade de utilizar estes históricos para sincronizar informações de aplicações OFF-LINE ou soluções de Data Warehouse, que receberam dados de um determinado período e em algum momento terá que ser atualizado com os novos dados.
Outra motivação comum é manter histórico das alterações de determinadas tabelas para uma auditoria periódica, como auditorias de alterações salariais e movimentações logísticas e financeiras.
O primeiro passo para configurar o CDC, é habilitar esta feature em nível de banco de dados, a partir da stored procedure sys.sp_cdc_enable_db:
Em seguida, utilizar a stored procedure sys.sp_cdc_enable_table para configurar a tabela a ser monitorada:
Diferente das triggers, que são disparadas na mesma transação que é executado INSERTs, DELETEs e/ou UPDATEs (e que até mesmo por algum erro de programação podem prejudicar toda a transação), o CDC utiliza um Job para capturar os registros alterados, excluídos ou inseridos diretamente de arquivos de logs do banco de dados a cada 5 segundos:
Obs.: O recovery model do banco de dados não intefere no CDC.
E um segundo Job executado todos os dias às 2h00 AM, elimina os registros armazenados a mais de 3 dias dos repositórios de registros históricos do CDC, considerando que estes registros históricos ficam armazenados no próprio banco de dados.
Após a captura dos dados pelo CDC, a forma mais simples de recuperar estes dados históricos é por meio da tabela que armazena estes dados no CDC, que normalmente segue a seguinte nomenclatura:
cdc.(schema)_(tabela)_CT
Exemplo:
Existem outras formas mais otimizadas para recuperar estes dados, mas isso será tratado em um próximo artigo.
Para aqueles que estão familiarizados com Transactional Replication, podem estar se questionando pelo fato desta forma de replicação também fazer leitura diretamente do arquivo de logs do banco de dados, geraria alguma forma concorrência com o CDC. Nesta situação, podem ficar tranquilos, pois o Transactional Replication e o CDC são compatíveis, e quando o Log Reader do Transactional Replication estiver varrendo o log do banco de dados para replicar as alterações, o CDC esperará este processo ser concluído para ser executado.
E no caso de Mirroring, algum problema em relação ao CDC? Não, nenhum, pois até mesmo os dados armazenados pelo CDC serão espelhados para o banco de dados espelho.
Mais informações:
http://msdn.microsoft.com/en-us/library/bb522489