Załóżmy, że mamy:
CREATE DATABASE TEST_SCD
USE TEST_SCD
CREATE TABLE Source
(Id INT IDENTITY NOT NULL PRIMARY KEY,
Name NVARCHAR(50),
City NVARCHAR(50))
CREATE TABLE Destination
(Id INT IDENTITY NOT NULL PRIMARY KEY,
SourceId INT,
Name NVARCHAR(50),
City NVARCHAR(50),
DateFrom DATE,
DateTo DATE)
Z założenia nowe dane znajdują się w tabeli Source. Należy je przenieść do tabeli Destination, która jest tabelą wymiaru (dimension) w kostce SSIS. Tabela Destination ma zapamiętywać nie tylko informacje skopiowane z Source, ale jeszcze dodatkowo wymiar czasowy, czyli informację kiedy obowiązuje przesłane do tej tabeli zmiany. Decydującymi kolumnami o „ważności” atrybutu jest DateFrom i DateTo.
A teraz krok po kroku, jak zbudować pakiet SSIS przesyłający te zmiany:
1. Przeciągnij na DataFlow DataSource:
2. Przeciągnij komponent Slowly Changing Dimension i połącz je ze sobą:
3. Dla komponentu Slowly Changing Dimension wybierz Edit. Uruchomi to kreatora. Określ tu docelową tabelę, do której mają być przepisywane dane. Jedna z kolumn (lub więcej) musi być określona jako Business Key. W tabeli Destination polem pasującym do tabeli Source jest SourceId.
4. Teraz pora określić, które z pól będą zmianiane:
- Fixed Attribute oznacza, że ta kolumna się nie zmiania, a wykrycie ewentualnych zmian ma się zakończyć komunikatem o błędzie.
- Changing Attribute oznacza, że kolumna może się zmienić i w takim przypadku, po prostu aktualizujemy wartość w docelowej tabeli
- Historical Attribute określa, że nie tylko należy przepisać zmianę w wartości atrybutu, ale jeszcze utrzymać informację od kiedy i do kiedy ta zmiana obowiązuje.
5. Dalej można określić, jak ma się zachować pakiet, jeżeli zostanie wykryta zmiana w Fixed Attribute
6. Teraz pora na określenie kolumn określających czas, kiedy obowiązuje dana wartość rekordu
7. Kolejne pytanie dotyczy Inferred Dimension. Inferred dimension to rekord, który technicznie został utworzony w innym miejscu, podczas, gdy zaimportowano rekord odwołujący się do niezaimportowanego jeszcze rekordu wymiaru, np. zaimportowałeś rekord dotyczący sprzedaży dla niezaimportowanego jeszcze klienta. Rekord jest „techniczny”, pusty, utworzony tylko po to by import zamówień nie zakończył się błędem, jeżeli masz takie rekordy, to ich wartości mogą być automatycznie zamienione, mimo tego, że w definiowanym komponencie twierdziłeś, że rekordy mają mieć zachowywaną historię.
Pora przetestować działanie. Wstaw rekord:
INSERT INTO Source VALUES(’Steven’,’New York’)
I uruchom pakiet – efekt:
Czyli rekord został skopiowany.
Teraz do źródłowej tabeli wprowadzamy zmiany:
INSERT INTO Source VALUES(’Jane’,’Chicago’)
UPDATE Source SET City=’Boston’ WHERE Id=1
Uruchamiamy pakiet i obserwujemy wprowadzone zmiany do tabeli destination:
Drogi czytelniku, wybacz, że w obu rekordach pojawiła się data 2012-12-09. Widać, że pierwsza wersja rekordu powstała tego samego dnia, co nadeszła kolejna jego wersja…. ale zasadę działania Slowly Changing Dimension już chyba widać.