OLE DB COMMAND
Bu transformasyon ile kendisine kaynak olarak gelen her satır için sql komutu oluşturulup İstenen bağlantıda çalıştırılır. Aşağıdaki 2 örnekte kullanımı vardır.
DW DOLDURLMASI İÇİN YÖNTEMLER
Çok küçük bir DW daki her gün güncellenen tablolar baştan silinip doldurulabilirler. Ancak bu bir çok durumda uygun olmayabilir. Örneğin veri sayısı çok fazla olabilir veya değişen verinin eski ve yeni hallerinin tutulması gerekli olabilir. Bu durumlarda sadece değişen verinin aktarılması gerekir. Bunu yaparken kaynakta eğer değişen veriyi tesbit edebileceğimiz bir SonGuncellemeTarihi benzeri bir kolon varsa sadece değişen veri, yoksa tüm tablo verisi DW da veya başka bir veritabanında bir ara alana(staging area) aktarılır. Daha sonra bu verinin satırları dw daki veriyle karşılaştırılarak, satırın yeni mi insert edildiği, yoksa var olan bir satırın update edilmesi sonucu mu buraya aktarıldığı tesbit edilir ve buna göre dw ya update veya insert edilir. Update veya Insert işlemini tek bir işlemle yapma işi içinde upsert deyimi uydurulmuştur. Bu işlemi yapmanın bir çok yöntemi vardır.
KAYNAKTA GÜNCELLEME KOLONU YOKSA
Örneğin Musteri tablosunu aktarırken kaynaktaki tabloda SonGuncellemeTarihi kolonu yoksa işlem şöyle yapılabilir:
İlk olarak DW da bir stgMusteri tabosu oluşturulur. Ve Müşteri doldurma işleminin ilk aşamasında kaynaktaki Musteri tablosunun tüm verisi DW daki stgMusteri tablosuna aktarılır. Daha sonra aşağıdaki şekildeki gibi bu stgMusteri tablosu OLE DB source olarak tanımlanıp, ardından bir Lookup işlemine tabi tutulur. Lookup da bu satır bulunamazsa demek ki bu satır tamamıyla yeni eklenmiş bir satırdır. Bu yüzden DW daki dimMusteri tablosu için bir OLE DB Destination tanımlanıp, Lookup daki eşleşmeyen satırlar buna yönlendirilir. Eğer eşleşme varsa demek ki bu satır önceden de vardı. Burada iki ihtimal olabilir. Bu satır hiç değişmemiş de olabilir değişmiş de olabilir. Bunu anlamak için DW daki müşteri için bir OLE DB Source tanımlanarak(aşağıdaki resimde “DW Musteri” olarak adlandırılmıştır) Lookup da eşleşen satırlarla birlikte bir Merge Join işlemine sokulur.

Bu şekilde join edilen tablolardan oluşan veri bir Conditional Split işlemine tabi tutularak, kaynaktaki her kolon verisi ile DW daki her kolon verisi karşılaştırılır, eğer bir değişiklik tesbit edilirse bunlar Değişenler çıkışına yönlendirilir. Değişenler çıkışına yönlendirilir.

Bu değişenler satırlar daha sonra bir OLE DB Command görevine yönlendirilir. Burada Connection Manager sekmesinden DW bağlantısı seçilir; çünkü oluşturulacak komut DW da çalışacaktır. Daha sonra éComponent Properties” sekmesinden “Sql Command” in karşısına aşağıdaki gibi update komutu girilir.

Ardından “Column Mappings” sekmesinden gelen verideki stgMusteri tablosundan gelen kolonlar update cümlesinin parametrelerine atanır.

Bu şekilde değişen her satır için update komutu oluştulup çalıştırılarak DW daki dimMusteri tablosu güncellenir.
KAYNAKTA GÜNCELLEME KOLONU VARSA SADECE DEĞİŞEN KAYITLARIN UPSERT EDİLMESİ
Bu durumda daha önceki örnekten farklı olarak kaynaktaki örneğin Fatura tablosunun sadece SonGuncellemeTarihi kolonu bizim çalıştırdığımız tarih aralığında olan veri DW daki stgFatura tablosuna aktarılır. Daha sonra aşağıdaki şekildeki gibi bu stgFatura tablosu OLE DB source olarak tanımlanıp, ardından bir Lookup işlemine tabi tutulur. Lookup da bu satır bulunamazsa demekki bu satır tamamıyla yeni eklenmiş bir satırdır. Bu yüzden DW daki factFatura tablosu için bir OLE DB Destination tanımlanıp, Lookup daki eşleşmeyen satırlar buna yönlendirilir. Eğer eşleşme varsa demek ki bu satır güncellenmiş satırdır. Bir önceki örnekteki gibi bir OLE DB Command ile her satır için update komutu oluştutulup DW da çalıştırılır.



EXECUTE SQL TASK İLE MERGE SQL KOMUTUNU KULLANARAK UPSERT
Aslında yukarıdaki iki şekilde yapılan işlemler merge sql komutunu kullanarak da yapılabilir. Veri stage tablosuna alındıktan sonra bir “Execute Sql Task” içinde aşağıdaki şekilde merge komutu kullanılmalıdır.


SLOWLY CHANGING DIMENSION
Türkçeye Yavaş Değişen Boyut olark çevirilebilir. Daha çok bir dimension verisinin süreç içerisinde değiştikçe, eski verisinin de boyut tablosunda saklanıp, analizlerde ilgili zaman diliminde doğru verinin getirilmesi olarak düşünülebilir .Örneğin bir müşterimiz bu yıla kadar İstanbulda yaşasın. Bu yıl İzmir’ e taşınmış olsun. Eğer dimMusteri dimension tablosunda, müşteri şehirini İzmir olarak güncellersek eski satışları da artık İzmir’de gözükecektir. Bu yanlıştır bu yıla kadar İstanbulda, bu yıl ve sonrası için İzmir’de görünmelidir. Bunu sağlayabilmenin yolu bu müşteri için dimMusteri tablosunda 2 kayıt tutulmasıdır. dimMusteri tablosuna BaslangicTarihi ve BitisTarihi adında iki Tarih kolonu eklenerek Hangi tarihler arasında hangi kaydın geçerli olduğu tutulabilir. SSIS de bir Data Flow Taskında bir kaynak eklenip, sonrasında Slowly Changing Dimension dönüşümü task a eklenip üstüne çift tıklandığında bir wizard çalışacaktır.
Burada istenen bağlantı ve dimension tablosu seçilir ve kaynak veritabanındaki PK sı Business Key kolon olarak seçilir.

Daha sonra tablodaki diğer kolonların tipi seçilir.
Bir kolon “Fixed Attribute” seçildiğinde o kolon verisinin hiçbir zaman değişmeyeceği belirtilmiş olur. Eğer bir aktarımda bu veri değişecek olursa hata verilip işlem yapılmayacaktır.
Bir kolon “Changing Attribute” seçildiğinde o kolon verisi değiştiğinde yeni bir satır açılmayacağı eski verinin yeni veriyle güncelleneceği belirtilmiş olur.
Bir kolon “Historical Attribute” seçildiğinde o kolon verisi değiştiğinde yeni bir satır oluşturulacağı ve eski satırın olduğu gibi kalcağı belirtilmiş olur.

Sonraki ekranda ilk seçenek fixed bir kolon değiştiğinde fail edilip edilmeyeceği seçilir. Diğer seçenekte bir changing attribute olarak işaretlenmiş kolon verisi değiştiğinde sadece geçerli satırın mı değişeceği, yoksa o kaydın eski satırlarının da mı değişeceği seçilir.

Daha sonra tabloda kayıtların geçerli olduğu tarih aralığını gösteren başlangıç ve bitiş tarih kolonları seçilmelidir. Ve değişen bir veri için yeni bir satır oluşturulduğunda eski kaydın bitiş ve yeni kaydın başlangıç değerlerinin hangi veriyle set edileceği seçilir. Bu genellikle “System:StartTime” seçilir.

Daha sonra fact tablosunda henüz dimension tablosunda olmayan kayıtlar(inferred members) geldiğinde ne yapılacağı belirlenir. Bu genelde seçilmez.

Sonra wizard tamamlanır.

Wizard tamamlandığında SCD nin hesaplanıp doldurulması için gerekli dönüşümler wizard tarafından oluşturulmuş olur.

TÜRETİLMİŞ KOLON(DERIVED COLUMN)
Veri kaynağındaki bir veya daha fazla kolondan, Deyimler(Expression) kullanarak yeni kolonlar türetmek için kullanılır.
Veri kaynağındaki Price kolonundan, Fiyatın %18 i tutarında Kdv ve %5 i tutarında da Nakliye ücreti kolonları türeten dönüşüm şöyledir:

MULTICAST
Kendisine gelen veriyi çoklayarak birden fazla hedefe dağıtır.
ERROR OUTPUT
Veri aktarım işlemlerinde bir hata oluştuğunda paketin çalışması durmaktadır, çünkü Error Output kısmında “fail component” seçilidir. Bu yapılmayıp o satırın atlanması için “ignore row” seçilebilir. Veya bu hatalı satırlar “redirect row” seçilerek başka bir işleme yönlendirilebilir. Örneğin Faturalar aktarılırken Hatalı faturaların yazılabileceği bir HataliFatura tablosu yapalım.
create table HataliFatura
(
FaturaNo int not null,
KaynakVeritabani varchar(100)
)
Artık aktarım kısmında Error Output u “redirect row” seçip,

Hedef bağlantıdan çıkan kırmızı ok ile HataliFatura hedefine yönlendirilebilir.
Tarık Akarsu Muhammet Tarık Akarsu