Własna kontrolka SSIS, część 0

Zadanie jest stosunkowo proste

Słuchaj, bo to jest tak. Na serwer FTP wpadają pliki. Musimy je pobrać do siebie i zasilić bazę danymi. Z tych plików właśnie. No.” Proszę bardzo. Wykorzystujemy do tego SSIS (dla punktu zaczepienia przyjmijmy wersję 2012). Możemy do tego wykorzystać standardową kontrolkę FTP z SSIS. Przeciągamy co trzeba, konfiguracja, kilka poprawek, test i działa – mamy pliki u siebie. Czas na kawę #2.

Wiesz, ten FTP to był tylko jako test, ale docelowo będziemy mieli SFTP – tu masz namiary.” OK, w takim razie FTP Task odpada, ale możemy spróbować wykorzystać np. SFTP Task i ewentualnie przepisać delikatnie logikę zasilania. Nie patrzę tu na płatne kontrolki – dla uproszczenia przyjmijmy, że budżet jest mocno ograniczony, proces decyzyjny dość upierdliwy i rozciągnięty w czasie, a musimy zrobić coś co ma działać za kilka dni.

Aha, weź pod uwagę, że wiesz, no – tych plików tam z FTP nikt nie będzie kasować. Będą tylko dodawać nowe.” W takim razie fajnie będzie sprawdzać które pliki są nowe, żeby nie pobierać wiele razy tego samego. Też się da zrobić. Kolejne doprecyzowanie – pliki mogą się znajdować w kilku katalogach. Nie ma problemu – zrobimy w pętli. Zaraz po kawie #3.

Wiesz co, ja Cię bardzo przepraszam. To wcale nie jest SFTP, tylko jednak FTP. Za to z szyfrowaniem TLS. Ale reszta bez zmian. Chyba.” Zaczynają się małe schody, bo kontrolka FTP nie obsługuje połączeń z TLS. Trzeba będzie popisać trochę własnego kodu i zejdzie się trochę dłużej. Ale do zrobienia. Wykorzystamy do tego WinSCP, które ma przykład jak można wykorzystać winscp.dll w SSIS. C# naszym przyjacielem a i Powershell nieobcy aż tak bardzo.

Aha i jeszcze … Ej! Co to…! No…! Zostaw! To ten, może ja przyjdę jut… pojutrz… za kilka dni? Sprawdzić jak idzie.

Wymagania

Zanim usiądziemy do kodowania ustalmy z grubsza jakie mamy wymagania biznesowe:

  • pobieranie danych z FTP/ przepraszam – z SFTP / jeszcze raz przepraszam – z FTP z TLS / jeszcze raz bardzo Państwa przepraszam – z Gliwic
  • dane mogą pochodzić z kilku katalogów
  • i nie są kasowane na serwerach
  • ponieważ może ich być dużo, to powinniśmy pobierać tylko nowe pliki
  • albo nowe pliki i te, które powiemy, że chcemy
  • powinna być możliwość śledzenia na każdym etapie zasilania czy wszystko ok i czy wszystko zostało zrobione jak trzeba

Teraźniejszość

Powyższe wymagania biznesowe obsługuję już teraz, właśnie za pomocą biblioteki WinSCP – bez różnicy czy to FTP, SFTP czy FTP/TLS. Dzięki kolejnym doprecyzowaniom i pomysłom obsługa rozrosła się do dość dużego kontenera w pakiecie SSIS i wykorzystania wielu skryptów i tabel pośrednich. Wszystko działa sprawnie, ale wykorzystanie mechanizmu w innych pakietach przy obsłudze podobnych źródeł danych i ustawianie konfiguracji odpowiednich parametrów jest dość czasochłonne. To może fajnie by było to uprościć i po prostu wstawiać do pakietu jakąś kontrolkę, która w tle o wszystko zadba sama? Która przyjmowałaby w miarę sensowne parametry domyślne, ale pozwalała na dostosowywanie wszystkiego co trzeba?

W ramach projektów zawodowych zadań jest na tyle dużo, że wykrojenie kilkunastu dni albo i miesiąca (z hakiem ?) na przepisanie obecnego działającego rozwiązania na coś nowego, co tylko uprości obecny model nie jest za bardzo możliwe. Ale stworzenie takiej kontrolki to bardzo dobry pomysł na własny projekt, który jeśli się uda będzie można wykorzystać w kilku miejscach. Przy okazji nauczy się człowiek czegoś nowego, a może i ciekawego?

Do roboty?

A co zrobić, żeby nie skończyło się na słomianym zapale, albo nieśmiertelnym „jutro” lub „nie, dziś nie mam czasu”? W końcu „Battlefield” sam się nie zagra a mecz też się sam nie obejrzy. Spróbuję wykorzystać sytuację, że Procent ogłosił drugą edycję konkursu Daj Się Poznać, gdzie wymogi są dwa: rozwijanie własnego projektu z publikowaniem źródeł na GitHubie i opisywanie tego na blogu. Wszystko przez minimum dziesięć tygodni.

Nagrody nagrodami, ale samo zgłoszenie do konkursu jest pewnego rodzaju testem – czy projekty, który odkładam(y) na kiedyś tam mają szansę w ogóle powstać? Czy nie skończy się na jednym inicjalnym wrzucie kodu do repozytorium? Czy wygra „Battlefield” (akurat tutaj – czwórka) albo inny „Wasteland” (dwójka, jakby co)? Czy mimo wszystko jednak będzie siedziało gdzieś z tyłu głowy „ej – dziś miałeś napisać posta, ej – dziś miałeś napisać kod, ej – ciągle nie działa to logowanie, ej – dziś miałeś napisać ten test jednostkowy, ej – wynieś wreszcie tą choinkę!” Może jednak „Battlefield” ma przewagę.

Technikalia

Projekt na GitHub-ie dostał niezwykle chwytliwą nazwę ssis-winscptask. Żeby był zgodny z obowiązującym trendem brakuje mu na końcu litery „r” („-eo” jest już passe), ale wewnętrzny dział marketingu postawił na prostotę i brak wieloznaczności. Poza tym był na urlopie i zminimalizował wpływ weny twórczej na wynik końcowy.

Podczas tworzenia kontrolki wykorzystane zostaną niecnie i z pełną premedytacją: SQL Server 2012, 2014 i 2016 CTP 3.3 (a Integration Services w szczególności), Visual Studio 2015 Community, SSDT w wersjach odpowiednich, język C# do pisania kodu kontrolki, biblioteka WinSCP. Dodatkowo zainspirowany artykułem wygrzebanym z archiwów Procenta spróbuję wykorzystać rzeczy, których albo dotąd nie dotykałem, albo używałem dosyć pobieżnie: testy jednostkowe w NUnit (ale niekoniecznie zawsze TDD), XAML do budowania interfejsu. I pewnie kilka innych skrótów i coś jeszcze po drodze.

Zanim kontrolka zacznie powstawać zobaczmy w jaki sposób powinna realizować nasze wymagania. Ale to już w następnym poście.

Reklamy

Jedna uwaga do wpisu “Własna kontrolka SSIS, część 0

  1. Pingback: Własna kontrolka SSIS, część 1 | Takietam

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s