SSIS - Changed Data Capture Control
İşin içinde bir müşteri varsa ve bu müşteri bizim verdiğimiz hizmeti veya ürünü birden fazla sayıda talep ediyorsa başta CRM departmanı (CRM departman değil anlayış olmalı) olmak üzere bir çok departman bu kullanıcının verilerini detaylı incelemeyi talep edecektir. Yaşam Boyu Değeri ölçümlemesi için user tablomuzda yapılacak her değişiklik önemlidir. Başka bir örnekte ise ürünlerimizin tüm geçmişinin tutulması gerekmektedir.
Eğer ilk başta tasarımı yapan grup bu şekilde tasarlamışsa muhtemelen trigger kullanımına gitmiştir. Belirli tablolarda belirli işlemler olduğunda (insert, update, delete) farklı tabloya bunun anlarını kaydeden bir yapı kullanılmıştır. Fakat sözde kolay olan bu yapı malesef sektörün içerisinde yer alan kişilerle görüştüğümde pek uygulanmadığını farkettim. Bu durum bizim raporlama sistemlerini oluştururken karşımıza ciddi bir sorun olarak çıkmaktadır.
Öte yandan SQL Server ile birlikte gelen CDC (Change Data Capture) özelliği aslında bizim için bunu hali hazırda yapmaktadır. Bunun için ilgili tanımlamaları rahatlıkla yapabilirsiniz. Veritabanında CDC özelliğini açtığınızda is_cdc_enabled özelliğinin 1 değeri alması gerekmektedir. CDC özelliğini açarken aşağıdaki gibi bir hata alabilirsiniz.
EXEC sys.sp_cdc_enable_db
Could not update the metadata that indicates database AdventureWorks2012 is enabled for Change Data Capture. The failure occurred when executing the command 'SetCDCTracked(Value = 1)'. The error returned was 15517: 'Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.'. Use the action and error to determine the cause of the failure and resubmit the request.
Bu hatayı gidermek için yapmanız gereken işlem ise veritabanı özellikleri kısmında owner alanını sa ile değiştirmenizdir. Bunu script ile yapmak için aşağıdaki kodu kullanabilirsiniz.
USE [AdventureWorks2012]
GO
EXEC sp_changedbowner 'sa'
Biz örneğimizde Adventureworks veritabanında yer alan tablomuzu tanımlayıp sonrasında Update, Delete işlemleri gerçekleştirelim.

UPDATE HumanResources.Employee
SET HireDate = DATEADD(day, 1, HireDate)
WHERE [BusinessEntityID] IN (1, 2, 3)
SQL Server 2012 ile birlikte Integration Services kontrollerine CDC ile ilgili kontroller eklendi. Bu sayede CDC tablolarından işlemler yapabilir ve ona göre hesaplamalar yapabiliriz. Örneğin müşterilerimizin ilişki durumlarının satın alma eğilimlerini arttırıp arttırmadığını incelemek istiyoruz. Müşteri tablosunda o kişinin son hali muhtemelen kayıtlı olacaktır. Öncesi ile ilgili işlemler için değiştiği tarihi tespit edip ona göre hesaplamalar (ki burada genellikle SQL fonksiyonlarını kullanıyoruz) gerekir.
CDC Source kontrolumuzde hedefte yer alan tablomuzu seçtikten sonra Variable Containing CDC State alanı için gerekli olan tablomuzu SQL Script yardımıyla oluşturalım.
CREATE TABLE [dbo].[cdc_states]
([name] [nvarchar](256) NOT NULL,
[state] [nvarchar](256) NOT NULL) ON [PRIMARY]
GO
CREATE UNIQUE NONCLUSTERED INDEX [cdc_states_name] ON
[dbo].[cdc_states]
( [name] ASC )
WITH (PAD_INDEX = OFF) ON [PRIMARY]
GO
Gerekli tanımlamaları yaptıktan sonra CDC Splitter ile hangi değişimi yakalamak istiyorsak belirtelim. CDC splitter karşımıza üç farklı output çıkaracaktır. (Insert Output, Delete Output, Update Output) Splitter ile yakalamış olduğumuz durumlar ile ilgili farklı işlemleri yaparak hesaplamalarımızı gerçekleştirebiliriz.
Eğitim ortamındaki veritabanları ve çalışmalar çok stabil ve sağlıklı yapılardır. Fakat gerçek dünyanın öyle olduğunu söylememiz (kimi sektörler haricinde) çok mümkün değil. Özellikle bu tip veri yakalama durumları BI uzmanlarının karşısına sık sık çıkmaktadır. Bu sebeple CDC kontrollerinin gerçek hayatta sıklıkla kullanılacağını düşünüyorum.