Przejdź do głównej zawartości

Szczegółowy opis zadań


Zadania są zdefiniowane w klasach .NET (można łatwo pisać własne przeciążając jedną klasę). System „w pudełku” oferuje kilka bardzo użytecznych zadań o bogatych możliwościach konfiguracji.

Zadania umieszczone są na karcie Przybornik, skąd możesz je przeciągać na obszar roboczy a następnie łączyć.

IkonaFunkcja
imageBulk Copy - zadanie łączy ze sobą strumień odczytu danych z tabel dowolnej bazy z szybką metodą zapisu danych do MS Sql Servera (BULK COPY PROTOCOL).
imageBulk Insert - zadanie odczytuje pliki tabelaryczne (oddzielane np. CSV) i zapisuje je metodą szybką (BULK COPY PROTOCOL) do tabel MS Sql Server.
imageSkrypt powłoki - zadanie uruchamiające skrypt interpretowany przez powłokę (domyślnie cmd.exe).
imageTransport plików - zadanie umożliwia pobranie z bazy/wstawienie do bazy treści plików danych. Obsługuje pola typu CLOB (BLOB, RAW, itp.).
imageZadanie c# - inne zadanie zdefiniowane w kodzie systemu, nieposiadające własnej, dedykowanej ikony. Może realizować całkowicie dowolne funkcje, definicja wymaga znajomości programowania w .NET i obsługi kompilatora.
imagePaczkowe polecenia SQL - umożliwia iterowanie po tabeli i wykonywanie „paczkami” parametrycznych poleceń SQL. Umożliwia też wykonywanie całkiem zwyczajnych zapytań SQL (np. DML). Najpopularniejsze zadanie używane w systemach.
imageRaport SQL - przygotowuje proste raporty na podstawie wzorca tekstowego, wypełniając elementy szablonowe wynikiem dowolnego zapytania SQL.
imageZałóż blokadę plikową: zadanie zakłada blokadę plikową służącą do synchronizacji wykonywania zadań.
imageZdejmij blokadę plikową: zadanie zdejmuje blokadę plikową służącą do synchronizacji wykonywania zadań.
imagePakiet przetwarzania danych - umożliwia definicję rozbudowanych transformacji danych.
imagePaczkowy pakiet przetwarzania danych - umożliwia uruchomienie Masowego Przetwarzania Danych w paczkach, iterując po przedziałach kluczy wskazanej tabeli bazy danych. Klucze iteracji (od-do) są przekazywane jako argumenty wywołania pakietu.
imageAdnotacja tekstowa: umożliwia dodawanie opisów (komentarzy) w ramach tworzonej hierarchii zadań.
Kopiowanie przyrostowe - zadanie utrzymuje w drugiej bazie aktualną, przyrostowo aktualizowaną kopię jednej lub wielu tabel.

Definicja zadania zwykle składa się z dwóch elementów:

  1. wartości parametrów - patrz: Zadania>Parametry zadań,
  2. plik skryptu zadania – plik wskazany przez jeden z parametrów ( o nazwie „FileName”), a w przypadku jego braku, przez nazwę zadania, w katalogu wskazanym przez globalny parametr DefaultDirName, a w przypadku jego braku w katalogu startowym Aplikacji.
wskazówka

Zwykle parametr FileName nie jest używany, jednak można go zastosować dla uzyskania efektu: wiele zadań, jeden skrypt. Dokładnie w ten sposób działa wklejanie z referowaniem do skryptu oryginalnego (obok wklejania z klonowaniem skryptu) – są to opcje dostępne w menu kontekstowym edycji hierarchii zadań po skopiowaniu zadania lub zadań do schowka.

Treść skryptu może też być osadzona w treści hierarchii zadań, jednak nie jest to często stosowane (opcje dostępne w menu kontekstowym zadania).

Bulk Insert​

Zadanie odczytuje pliki tabelaryczne (oddzielane np. CSV) i zapisuje je metodą szybką (BULK COPY PROTOCOL) do tabel MS Sql Server.

Może wykonywać dodatkowo:

  1. bardziej złożone parsowanie typów danych (nietypowych dat, kwot, flag logicznych),
  2. próbkować dane do celów testowych – ładować co N-ty wiersz z ograniczeniem do M rekordów,
  3. rozpoznawać nieprawidłowości w rekordach i odrzucać je do pliku błędów (wymaga włączenia).
Parametry zadania
Kodowanie znakówKodowanie pliku wejściowego – do wyboru lista najpopularniejszych kodowań: ISO-8859-2 (Latin2), Mazovia, Windows 1250, UTF-8, UTF-16. Ustawienie „OTHER” powoduje że do głosu dochodzi wartość parametru „Encoding”.
Rozszerzone kodowanie znakówNumer kodowania .NET. (patrz: Opis działania systemu > Strony kodowe)
Rozmiar wsaduRozmiar pojedynczej paczki (transakcji) protokołu Bulk Copy.
Plik wejściowyFragment ścieżki do pliku danych, postaci: podkatalog\plik.rozszerzenie;KATALOG, gdzie: podkatalog jest opcjonalny, może występować dłuższa ścieżka, katalog jest logiczną nazwą katalogu danych, rozwiązywaną poprzez konfigurację, można używać szablonów parametrów w postaci {ParamN} – (patrz: Zadania>Parametry zadań) Powyższe reguły dotyczą wszystkich ścieżek podawanych jako wartości parametrów.
TimeoutTime out połączenia do bazy docelowej [s].
Baza danychNazwa logiczna bazy docelowej. W razie braku wartości, będzie użyta wartość globalnego parametru ‘DefaultDbName’.
Plik na błędyŚcieżka do pliku z błędnymi rekordami.
Separator pólCiąg znaków oddzielających kolumny w pliku danych. Można wpisywać sekwencje specjalne: \t
Znak cudzysłowuOpcjonalny ciąg znaków otaczających wartość, np. ’’
ReadFileHeaderOpcja wczytywania schematu danych z linii nagłówka. Jeśli nie, zostanie użyty tylko dokładny schemat zdefiniowany w skrypcie.
Prefiks pólWspólny prefiks pól tabeli używany do mapowania z nagłówka pliku. Odwzorowanie ma miejsce jeśli nazwa kolumny pliku pozbawiona tego prefiksu zgadza się z elementem nagłówka.
Czyszczenie tabeli docelowejOpcja umożliwiająca przed ładowaniem danych obcięcie całej zawartości tabeli docelowej.
W przypadku błęduDomyślny rodzaj czynności podejmowanej podczas napotkania błędnego rekordu, np. za długiej wartości napisowej, numerycznej, nie będącej datą. Dla konkretnych pól można ustawić specyficzne wartości w odpowiedniej sekcji pliku konfiguracyjnego zadania. Dostępne możliwości:
NONE - Brak walidacji i kontroli treści. Dane przesyłane są prosto do implementacji ładowania. Jest to najszybszy wariant, ale wystąpienie błędu w danych powoduje momentalne zatrzymanie przetwarzania;
SKIP - Pominięcie błędnego wiersza - odrzucenie do pliku z błędami. Pozostałe wiersze zostaną wczytane;
RECOVER - Wartości błędne i puste zostaną zamienione na domyślne (zero, pusty napis, datę bieżącą).
Dopuszczalna liczba naprawionychMaksymalna dozwolona liczba uratowanych linii, w których przynajmniej jedno pole zostało uzupełnione wartością domyślną. Jeżeli liczba zostanie przekroczona, to zadanie zakończy się w statusie ERROR. Domyślnie ustawiona jest wartość UNLIMITED, czyli liczba błędów nie ma wpływu na status końcowy zadania. Przekroczenie ustawionego progu nie przerywa natychmiast działania zadania. Chodzi o to, aby przy zakończeniu ładowania uzyskać pełną informację o ilości wszystkich błędów, a nie tylko początkowych (odciętych wartością parametru). Wystąpienie przynajmniej jednego błędu (bez przekraczania progu) powoduje zakończenie zadania w stanie WARNING.
Dopuszczalna liczba pominiętychMaksymalna dozwolona liczba odrzuconych linii podczas walidacji danych przed zapisem. Jeżeli liczba zostanie przekroczona, to zadanie zakończy się w statusie ERROR. Domyślnie ustawiona jest wartość UNLIMITED, czyli liczba błędów nie ma wpływu na status końcowy zadania. Przekroczenie ustawionego progu nie przerywa natychmiast działania zadania. Chodzi o to, aby przy zakończeniu ładowania uzyskać pełną informację o ilości wszystkich błędów, a nie tylko początkowych (odciętych wartością parametru). Wystąpienie przynajmniej jednego błędu (bez przekraczania progu) powoduje zakończenie zadania w stanie WARNING.
Próbkowanie danych do testów
SampleEveryNthOgranicznik ilości rekordów - wczytujemy co N-ty rekord
SampleRowLimitOgranicznik ilości ładowanych rekordów
Parsowanie wartości – ustawienia domyślne
DefaultBoolParserSpecyfikacja formatu wartości logicznych: Bool
DefaultDateParserSpecyfikacja formatu dat, np. Date(yyyyMMddHHmmss)
DefaultDecimalParserSpecyfikacja formatu liczb stałopozycyjnych, np. Decimal(.)

Treść przykładowego skryptu.

#DESTINATION_TABLE
loading.IBS_CIF

#FILE_HEADER
ACN|ZSYPLN|BOO|CC|CIFCLCD|DLC|LFU|CIFOFF|DAO|DEP|DOB|DOD|EDUC|FAXNUM|LNM| …

#MAPPINGS
ZSYPLN, TARGET_ZSY

#FIELD_TYPES
ZHCV Decimal(.)
DTD1 Date(yyyy/MM/dd)

#FIELD_VALIDATION
CIFCLCD, SKIP
CIFOFF, RECOVER
FAXNUM, NONE

Sekcje skryptu:

  1. #DESTINATION_TABLE – nazwa tabeli docelowej.
  2. #FILE_HEADER – nagłówek pliku wejściowego w postaci oryginalnej (separowanej). Służy do identyfikacji kolumn w przypadku gdy nagłówek nie występuje w pliku danych.
  3. #MAPPINGS – odwzorowanie nagłówków kolumn pliku w kolumny tabeli. Może zostać pominięte jeśli kolumny pasują (z uwzględnieniem wartości parametru TablePrefix).
  4. #FIELD_TYPES – służy do podłączania informacji o formacie wartości do konkretnych pól wejściowych,
  5. #FIELD_VALIDATION – w sekcji można określić sposób walidacji na poziomie pojedynczego pola. Dostępne typy walidacji są takie same jak w parametrze ValidationErrorAction– NONE, SKIP i RECOVER. Sposób walidacji określony dla konkretnej kolumny przesłania wartość określoną ogólnie dla całej tabeli (przez parametr ValidationErrorAction).

Dopuszczalne parsery pól (wartości parametrów Default Parser oraz specyfikacje w sekcji #FIELD_TYPES):

  1. Bool(x), gdzie x jest domyślną wartością zwracaną w przypadku niemożności wczytania wartości. Np. bool(1), bool(). Ostatnia wartość zwróci wartość pustą.
  2. Decimal(separatory), gdzie „separatory” to ciąg znaków, z których każdy jest traktowany jak separator dziesiętny, a pozostałe znaki są POMIJANE (z wyjątkiem następujących: –eE). Zwykle używa się Decimal(.) lub Decimal(,), ale dopuszczalne są też zapisy Decimal(,.)
ważne

Użycie niewłaściwego separatora spowoduje wczytanie liczby z pominiętym znakiem separatora dziesiętnego (czyli liczby za dużej).

  1. DecimalExact(separator), gdzie „separator” to ciąg znaków występujący jako separator dziesiętny. Zwykle będzie DecimalExact(.) lub DecimalExact(,) Użycie niewłaściwego separatora (podobnie jak wystąpienie niedozwolonych znaków w wartości) spowoduje wystąpienie błędu formatu danych. Sposób obsługi błędu zależy od ustawienia właściwości „ValidationErrorAction”
  2. Date(format), gdzie format składa się z liter oznaczających fragmenty daty. Szczegółowy opis znaczenia liter: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx.

Skrót poniżej:

  1. yyyy – rok 4 cyfrowy,
  2. MM – miesiąc,
  3. dd – dzień,
  4. HH – godzina (format 24h),
  5. mm – minuty,
  6. ss – sekundy.

Bulk Copy​

Zadanie łączy ze sobą strumień odczytu danych z tabel dowolnej bazy z szybką metodą zapisu danych do MS Sql Servera (BULK COPY PROTOCOL).

Umożliwia np. sprawne przenoszenie dużych fragmentów danych (lub całych tabel) pomiędzy bazami. Z powodzeniem jest stosowane do klonowania całych hurtowni danych pomiędzy bazami w architekturach DB/2 z/OS a MS SQL Serwer.

Parametry zadania
Rozmiar wsaduRozmiar pojedynczej paczki (transakcji) protokołu Bulk Copy.
Timeout celuTime out połączenia do bazy docelowej (MS Sql) [s].
Baza docelowaNazwa logiczna bazy docelowej. W razie braku wartości, będzie użyta wartość globalnego parametru ‘DefaultDbName’.
Timeout źródłaTime out połączenia do bazy źródłowej (MS Sql) [s].
Baza źródłowaNazwa logiczna bazy źródłowej. Parametr musi mieć ustawioną wartość.
Czyszczenie tabeli docelowejZapytanie czy przed ładowaniem danych należy obciąć całą zawartość tabeli docelowej.

Treść przykładowego skryptu:

#SOURCE_QUERY
SELECT KLDO_PESEL, KLDO_DOK_KOD, KLDO_DOK_NUM, KLPROD_ID_PRODUKTU, KLPROD_UDO_WSK, KLPROD_UDO_DATA_P, KLPROD_UDO_OKRES, KLPROD_UDO_WSK_B
FROM BKK.KLIENT
INNER JOIN BKK.DANE_OSOB
ON KL_ID_DANE_OSOB = KLDO_ID_DANE_OSOB
INNER JOIN BKK.KLIENT_PRODUKTY
ON KL_ID_KLIENTA = KLPROD_ID_KLIENTA
WHERE KL_WSK='A' AND KLPROD_AKT='A' AND KLPROD_TYP='WL'

#DESTINATION_TABLE
dbo.BKK_KLIENCI_BUF_DUPL

#MAPPINGS
KLDO_PESEL, PESEL
KLDO_DOK_KOD, KLDO_DOK_KOD
KLDO_DOK_NUM, KLDO_DOK_NUM
KLPROD_ID_PRODUKTU, PROD_ID_PRODUKTU
KLPROD_UDO_WSK, KLPROD_UDO_WSK
KLPROD_UDO_DATA_P, KLPROD_UDO_DATA_P
KLPROD_UDO_OKRES, KLPROD_UDO_OKRES
KLPROD_UDO_WSK_B, KLPROD_UDO_WSK_B

Sekcje:

  1. #SOURCE_QUERY – treść zapytania do bazy źródłowej
  2. #DESTINATION_TABLE – nazwa tabeli w bazie docelowej
  3. #MAPPINGS – odwzorowania kolumn źródłowych w docelowe.

Skrypt powłoki​

Zadanie umożliwia uruchamianie skryptów shell’a, głównie CMD i POWERSHELL. Posiada możliwość wskazania ścieżki do własnego interpretera poleceń.

Wewnątrz skryptu można umieścić własne parametry, które przed uruchomieniem zostaną podmienione na konkretne wartości. Format parametrów treści skryptu zdefiniowany jest poprzez właściwość ParameterFormat.

  1. Zadanie zakończy się z błędem, jeżeli na standardowym wyjściu błędów pojawią się jakiekolwiek dane (domyślne zachowanie można zmienić przy pomocy właściwości – patrz tabelka).
Nazwa parametruOpis
InterpreterRodzaj interpretera - można podać ścieżkę do pliku <exe> Domyślnym interpreterem jest cmd.exe
ArgumentyArgumenty interpretera. W przypadku powershell'a puste argumenty są automatycznie zamieniane na: -command \"-\" (czytanie danych ze standardowego wejścia).
Katalog roboczyKatalog roboczy, z poziomu którego zostanie uruchomiony skrypt. Można podać ścieżkę absolutną do katalogu, lub nazwę katalogu z konfiguracji, poprzedzoną średnikiem.
Format parametrów wejściowychWyrażenie regularne, na podstawie którego identyfikowane są parametry w skrypcie. Domyślnie parametry przyjmują formę:
#(nazwa_parametru)#
Plik wyjściowyŚcieżka do pliku, w którym zostanie zapisany wynik działania skryptu. Nie jest wymagana, ponieważ dane wyjściowe są zapisywane również w logach i w Message samego zadania.
Maksymalna długość logaMaksymalna ilość wierszy strumienia wyjściowego i strumienia błędów, które zostaną zapisane w logu aplikacyjnym.
Maksymalna długość informacjiMaksymalna ilość wierszy strumienia wyjściowego i strumienia błędów, które zostaną zapisane w polu 'Message' zadania.
Status przy błędachStatus, który przyjmie zadanie w przypadku otrzymania jakichkolwiek danych na standardowym wyjściu błędów. Domyślnie ERROR. Stan „BŁĄD” jest wykrywany gdy na standardowym wyjściu błędów pojawi się jakiś tekst. Przykład dla powłoki powershell: Write-Error ”Some error message” Przykład dla cmd.exe: echo Error message >&2

Przykładowy skrypt obrazujący użycie parametrów zewnętrznych:

xcopy #(DATA)#_CONTRADR.TXT # (TECH)#\#(BANK)#\ /S /I /F /R /K /Y
xcopy #(DATA)#_CUSTDATA.TXT # (TECH)#\#(BANK)#\ /S /I /F /R /K /Y
xcopy #(DATA)#_CONTCUST.TXT # (TECH)#\#(BANK)#\ /S /I /F /R /K /Y
xcopy #(DATA)#_SCHEDULE.TXT # (TECH)#\#(BANK)#\ /S /I /F /R /K /Y
dir # (TECH)#\#(BANK)#\

Transport plików​

Zadanie umożliwia pobranie z bazy / wstawienie do bazy treści plików danych. Obsługuje pola typu CLOB (BLOB, RAW itp.).

  1. File Transport Task jest zadaniem transportującym pliki z bazy na dyski i z dysku do bazy danych. Zadanie posiada możliwość pakowania i rozpakowywania pliku w locie podczas transportu - za pomocą algorytmu ZIP. Jedno zadanie umożliwia transport większej ilości plików.
Parametry zadania
Nazwa bazy danychNazwa bazy danych będącej źródłem lub celem transportu pliku.
FileNameŚcieżka do pliku skryptu opisującego dalsze szczegóły procesu transportowego.
Typ akcjiTyp wykonywanej akcji. Są dwie możliwości:
- transport do bazy z dysku – Upload,
- transport na dysk z bazy Unload

Treść przykładowego skryptu:

#TABLE
0:TABELA_NA_PLIKI
1:TABELA_NA_PLIKI

#DATA_COLUMN
0:F_CONTENT
1:F_CONTENT

#FILE_NAME
0:FilePath1
1:FilePath2

#KEY_COLUMN
0:F_ID
1:F_ID

#KEY_VALUE
0:Log:Id
1:Korekta:Id

#FILE_TRANSFORMATION
0:UNZIP
1:UNZIP

Skrypt podzielony jest na sekcje. Każda sekcja musi posiadać podpunkty numerowane (przynajmniej jeden) dla każdego transportowanego pliku.

  1. #TABLE Definicja tabel do których mają być wgrywane lub z których będą pobierane pliki.
  2. #DATA_COLUMN nazwy kolumn do przechowywania kolejnych transportowanych plików.
  3. #FILE_NAME ścieżki źródłowe lub docelowe dla transportowanych plików.
  4. #KEY_COLUMN kolumna klucza głównego tabeli przechowującej pliki. Potrzebna przy wykonaniu odpowiedniego zapytania SELECT lub UPDATE
  5. #KEY_VALUE wartość klucza głównego dla zapytania pobierającego lub zapisującego plik do bazy.
  6. #FILE_TRANSFORMATION ewentualna transformacja dokonywana w locie na pliku podczas transportu. W tym momencie możliwe tylko pakowanie bądź rozpakowywanie algorytmem ZIP. Sekcja nie jest wymagana.

Paczkowe polecenia SQL​

Zadanie umożliwia iterowanie po tabeli i wykonywanie „paczkami” parametrycznych poleceń SQL. Umożliwia także wykonywanie zwyczajnych zapytań SQL (np. DML). Najpopularniejsze zadanie używane w systemach.

Przetwarzanie obejmuje 3 fazy:

  1. wstępna – przed zapytaniami paczkowymi,
  2. paczkowa,
  3. końcowa – po zapytaniach paczkowych.
Parametry konfiguracyjne
Sprawdzanie typu kluczaUmożliwia sprawdzenie typu klucza na etapie walidacji (techniczne, dla kompatybilności wstecznej). Domyślnie: False.
TimeoutParametr 'Timeout' poleceń SQL, wyrażony w sekundach. Domyślnie: 1 godzina (przygotowanie do długotrwałych poleceń).
Baza danychNazwa logiczna bazy danych, na której będą wykonywane zapytania. Pusta wartość spowoduje, że będzie użyty globalny parametr 'DefaultDbName'.
Ostatnio wykonaneID początkowe ostatnio wykonanej paczki. Wartość używana w zaawansowanych scenariuszach do wznawiania szczególnie długotrwałych zadań.
Częściowe wznawianieOpcja umożliwia wybór, czy wznawianie zadania ma być kontynuowane od miejsca ostatniej skutecznie wykonanej paczki. Jeśli nie, wznawianie wykona ponowne uruchomienie od początku.

Treść przykładowego pliku skryptu:

#TABLE
TMP_CURR_MIRROR_ACC
#COLUMN
TMPCA_ID
#PKG_QTY
1000
#QUERIES
0: insert into TMP_CURR_MIRROR_CLI (#DSTCOLUMNS(TMP_CURR_MIRROR_CLI, TMPCC_)#)
select #SRCCOLUMNS(CLIENTITEM_CURR, CLIIT_)#
from TMP_CURR_MIRROR_ACC (nolock)
join CLIENTITEM_CURR (nolock)
on TMPCA_BRANCH=CLIIT_BRANCH
and TMPCA_TRANSID=CLIIT_TRANSID
and TMPCA_TRANS_TYPE=CLIIT_TRANS_TYPE
and TMPCA_FILE=CLIIT_FILE
and CLIIT_FILE <> 1
where not exists (
select 1 from ERRORS_K (nolock)
where ERR_TR_ID=TMPCA_TR_ID
and ERR_CLI_LINE=CLIIT_LINE
)
and TMPCA_ID between @lowBound and @highBound
and CLIIT_WSAD_ID=SRC_ID
#PREPARING_QUERIES
0: SRC_ID = SELECT max(WSAD_ID) FROM WSAD WHERE WSAD_VISIBLE=1
1: ? drop table TMP_CURR_MIRROR_CLI
2: create table TMP_CURR_MIRROR_CLI
[...]
wskazówka

W edytorze, w sekcjach można używać podpowiadania składni, aktywowanego klawiszami Ctrl+Spacja.

Kolejne zapytania SQL należy oddzielić numerem zapytania + dwukropkiem, lub tylko znakiem dwukropka (można pominąć numer).

Sekcje skryptu:

  1. PREPARING_QUERIES - zapytania wykonywane przed zapytaniami „paczkowymi”,
  2. TABLE – nazwa tabeli, po której następuje iteracja „paczkami”,
  3. COLUMN – nazwa kolumny, po której następuje iteracja „paczkami”,
  4. PKG_QTY – ilość paczek,
  5. QUERIES – treści zapytań paczkowych (patrz niżej),
  6. CLOSING_QUERIES - treści zapytań końcowych, wykonywanych po iteracji „paczkami”.

W zapytaniach paczkowych można korzystać z kilku rozszerzeń:

  1. Parametr @lowBound lub #MIN – dolna granica bieżącej paczki,
  2. Parametr @highBound lub #MAX – górna granica bieżącej paczki.

Nie ma żadnej różnicy pomiędzy tymi rozszerzeniami, jednak obecnie zalecane jest stosowanie wartości #MIN lub #MAX, natomiast ze względów „Historycznych” wartości @lowBound i @highBound również jest poprawne.

W zapytaniach wszędzie można korzystać z kilku rozszerzeń:

  1. #BatchId – wartość bieżącego ID cyklu przetwarzania,
  2. #TaskId – ID bieżącego zadania w środowisku uruchomieniowym,
  3. #TaskRevision – numer powtórki zadania,
  4. #TaskName – nazwa zadania,
  5. #ParamN – wartość napisowa parametru N dostępnego w momencie uruchomienia zadania (określonego na zadaniu lub odziedziczonego z zadań poprzednich).
wskazówka

Można też korzystać z wymienionych parametrów za pomocą składni ##ParamN – wówczas wartość parametru zostanie wstawiona literalnie, do tekstu zapytania. Wariant z pojedynczym znakiem # wstawia do zapytania parametr. Możliwość ta jest przydatna do uzyskiwania jednego szablonu skryptu uruchamianego dla wielu nazw tabel czy kolumn, różniących się np. tylko sufiksem nazwy.

Ponadto, plany zapytań SQL zawierających stałe wartości zamiast parametrów SQL mogą zostać przez serwer przygotowane jako bardziej optymalne.

Zaawansowane rozszerzenia:

  1. #SRCCOLUMNS(TabelaA, PrefixA [, Omit1 [, Omit2 …]] )#

  2. #DSTCOLUMNS(TabelaB, PrefixB [, Omit1 [, Omit2 …]] )#

    ‎Wyrażenia rozwijane w listę nazw kolumn tabeliA oraz tabeli - kolejno dla kolumn występujących w obydwu tabelach (dopasowanie z pominięciem specyficznych dla tabel prefiksów), opcjonalnie z pominięciem kolumn wymienionych jako OmitN. Przydatne do automatycznego formatowania długich zapytań typu INSERT dotyczących bardzo rozbudowanych schematów tabel.

  3. #SET# - analogia do powyższego, dotyczy zapytań UPDATE, gdzie klauzula będzie rozwinięta do listy a1=b1, a2=b2, a nazwy tabel źródłowej i docelowej będą pobrane z treści reszty zapytania.

Raport SQL​

Przygotowuje proste raporty na podstawie wzorca tekstowego, wypełniając elementy szablonowe wynikiem dowolnego zapytania SQL.

Parametry zadania
Typowe kodowanie znakówKodowanie pliku wejściowego – do wyboru lista najpopularniejszych kodowań: ISO-8859-2 (Latin2), Mazovia, Windows 1250, UTF-8, UTF-16. Ustawienie „OTHER” powoduje że do głosu dochodzi wartość parametru „Encoding”
Kodowanie znakówNumer kodowania .NET (patrz: Opis działania systemu >Strony kodowe)
TimeoutTime out połączenia do bazy [s]
Separator kolumnCiąg znaków oddzielających kolumny w pliku danych. Można wpisywać sekwencje specjalne: \t
Baza danychNazwa logiczna bazy danych. W przypadku nie wypełnienia wartości będzie użyta baza wskazana przez globalny parametr „DefaultDbName”.
Plik wyjściowyNazwa pliku wyjściowego raportu (postaci zwykłej ścieżki-parametru: podkatalog\plik.csv;KATALOG).
Obcinanie pustych wartościCzy obcinać wartości puste z brzegów napisów wyjściowych? Bardzo przydatne dla pól typu „CHAR(n)” – o stałej długości uzupełnianej spacjami.

Przykładowy skrypt zadania:

#REPORT_TEMPLATE
Raport poprawnosci nowego wsadu:
* Ilosc rachunkow nowego lustra: {0}
* Ilosc klientow nowego lustra: {1}
* Ilosc rachunkow starego lustra: {2}
--------------------------------------------------
Zawartość tabeli WSAD:
{3}
#PARAMS
0: select b2it_wsad_id, count(*) as Ile from bik2_item group by b2it_wsad_id

1: select b2cliit_wsad_id, count(*) as Ile from bik2_clientitem group by b2cliit_wsad_id
2: declare @old_acc_mirror varchar(50);
select top 1 @old_acc_mirror = name from sys.objects where name like 'BIK2_ITEM_OLD%' order by create_date desc;
EXEC('select b2it_wsad_id, count(*) as Ile from ' + @old_acc_mirror + ' group by b2it_wsad_id')
3: select top 20 * from WSAD order by WSAD_ID desc

Sekcje skryptu:

  1. #REPORT_TEMPLATE – szablon raportu. Odnośniki do danych mają postać {n}, gdzie n jest numerem zapytania z sekcji #PARAMS. W wersji minimalnej może mieć postać {0}

    ‎Jeśli wynikiem jest pojedyncza wartość skalarna, będzie wstawiona jako taka.

    ‎Jeśli wynikiem jest tabela, zostanie dołączony nagłówek w pierwszej linii.

  2. #PARAMS – kolejne numerowane zapytania, których wyniki należy podstawić pod odnośniki w sekcji #REPORT_TEMPLATE

Zadanie nadaje się do generowania raportów nadających się do otwierania przez program Microsoft Office Excel – w tym celu należy nazwać plik tak, aby miał rozszerzenie „.xls” oraz zdefiniować prosty szablon raportu zawierający jedynie: {0}

Paczkowy pakiet przetwarzania danych​

Zadanie Paczkowy pakiet Masowego Przetwarzania Danych służy do uruchomienia zadania Pakiet Masowego Przetwarzania Danych pewną ilość razy.

  1. Ilość uruchomień jest wyznaczana na podstawie zakresu danych występujących, w określonej w parametrach zadania, kolumnie tabeli w bazie danych.
  2. Wykonanie zadania rozpoczyna się od pobrania minimalnej i maksymalnej wartości w kolumnie podanej w parametrze Nazwa kolumny klucza należącej do tabeli z parametru Nazwa tabeli kluczaz bazy określonej w parametrze Baza. Wskazana kolumna musi być typu liczbowego (np.; int, bigint, numeric, decimal, float) lub być wyrażeniem SQL dającym taki typ wyniku. Dopuszczalny jest również typ tekstowy, ale Użytkownik musi się upewnić, że dane w tej kolumnie są liczbami i są zapisane w takiej postaci aby poprawnie zadziałały operatory SQL min i max (np. wyrównane do takiej samej długości za pomocą wiodących zer). W parametrze Nazwa tabeli klucza może być podana nazwa tabeli lub podzapytanie SQL w postaci dającej się użyć w klauzuli FROM.
  3. Zakres wartości od minimalnej do maksymalnej dzielony jest na przedziały o długości równej parametrowi Maksymalny rozmiar paczki (a w przypadku ostatniego przedziału – pozostałość zakresu). Należy podkreślić, że parametr ten nie określa ilości elementów w każdej paczce – może ich być mniej (nawet 0) albo więcej (jeżeli są duplikaty). Przedziały są zamknięte obustronnie, a różnica pomiędzy górną granicą poprzedniego przedziału, a dolną następnego wynosi 1. Należy to uwzględnić przy typie danych float, gdyż ze względu na zaokrąglenia może dojść do zgubienia elementów pomiędzy przedziałami. Dla każdego przedziału wykonywane są następujące działania w podanej kolejności:
  • Wykonanie zapytania podanego w parametrze Przed pakietem (jeżeli podano jakieś).
  • Wykonanie pakietu Masowego Przetwarzania Danych.
  • Wykonanie zapytania podanego w parametrze Po pakiecie (jeżeli podano jakieś).
  1. W treści zapytań Przed pakietem i Po pakiecie można używać napisów #MIN i #MAX, zostaną one zamienione na początek i koniec aktualnego przedziału.
  2. Wartości te mogą być również dostępne wewnątrz pakietu Masowego Przetwarzania Danych jeśli zostaną przekazane przez jego parametry uruchomieniowe. Aby to zrobić należy podać {#MIN} lub {#MAX} jako wartość parametru uruchomieniowego.

image

  1. Dopuszczalny czas wykonania zapytań znajdującego zakres danych, Przed pakietem i Po pakiecie można określić w sekundach w parametrze „Timeout”. Pozostałe parametry są parametrami zadania „Pakiet Masowego Przetwarzania Danych” i należy je wypełnić zgodnie z jego dokumentacją.

Parametry zadania

Nazwa kolumny kluczaNazwa kolumny lub wyrażenie, z którego zostanie pobrany zakres wartości.
Nazwa tabeli kluczaNazwa tabeli lub podzapytanie, w którym znajduje się kolumna klucza.
BazaBaza danych, w której znajduje się tabela klucza.
Przed pakietemZapytanie wykonywane przed każdym wykonaniem pakietu przetwarzania.
Po pakiecieZapytanie wykonywane po każdym wykonaniu pakietu przetwarzania.
TimeoutMaksymalny dopuszczalny czas wykonania zapytań określającego zakres danych, „Przed pakietem” i „Po pakiecie”.

Pakiet przetwarzania danych​

Zadanie służy do definiowania złożonych transformacji danych, obejmujących różne źródła danych, miejsca docelowe, odwołania do zewnętrznego kodu itp.

Zadanie przetwarzania do uruchomienia zwykle będzie wymagać ustawienia kilku elementów:

  1. argumentów wywołania (dla całego pakietu) – np. dat granicznych – prezentowane w sekcji ustawień Argumenty pakietu,
  2. wartości parametrów bloczków – np. ścieżek do plików – prezentowane w sekcji Bloczek: <nazwa> (typ),
  3. wartości parametrów wspólnych dla wszystkich zadań typu przetwarzanie danych.

Parametry dwóch pierwszych rodzajów, choć różnią się dla każdego zadania, są automatycznie rozpoznawane i prezentowane jako oddzielne parametry do ustawienia w panelu Właściwości.

image

Parametry wspólne dla wszystkich zadań typu przetwarzanie danych:

Parametry
Minimalny poziom błęduMinimalny poziom błędu powodujący zgłoszenie błędu z przetwarzania pakietu. Powoduje ustawienie statusu ERROR na zadaniu. Domyślnie: 10. Opcja jest dostępna jedynie wtedy, kiedy nie został zdefiniowany algorytm wyznaczania statusu końcowego FinishStatusDefinition.
Minimalny poziom ostrzeżeniaMinimalny poziom błędu powodujący zgłoszenie ostrzeżenia z przetwarzania pakietu. Powoduje ustawienie statusu WARNING na zadaniu. Domyślnie: 9. Opcja jest dostępna jedynie wtedy, kiedy nie został zdefiniowany algorytm wyznaczania statusu końcowego FinishStatusDefinition.
Definicja statusu końcowegoDefinicja statusu końcowego, jaki przyjąć ma zadanie na koniec wykonania pakietu. Status określany jest na podstawie poziomu krytyczności napotkanych błędów oraz ich liczby. Ustawienie definicji powoduje wyłączenie stosowania parametrów MinErrorLevel i MinWarningLevel. Szczegółowy opis tej opcji znajduje się poniżej.

Poziomy błędów i ostrzeżeń​

Pakiet Masowego Przetwarzania Danych w trakcie działania zgłasza komunikaty o błędach. Każdy z takich komunikatów ma przypisany poziom błędu – im wyżej tym błąd poważniejszy.

  1. Np. wartość 10 oznacza nieoczekiwany wyjątek w przetwarzaniu,
  2. wartość 1 oznacz ostrzeżenie dotyczące mapowania wartości,
  3. wartość 3 odrzucenie rekordu z przetwarzania (bez zatrzymywania działania pakietu).

Pakiet w trakcie działania śledzi maksymalną wartość poziomu błędu.

  1. Aby przełożyć tą wartość na status zadania (OK, WARNING, ERROR) zostały zdefiniowane parametry ogólne: Minimalny poziom błędu, Minimalny poziom ostrzeżenia.
  2. Jeśli poziom błędu będzie >= Minimalny poziom błędu, zadanie zgłosi status wykonania ERROR, co będzie skutkowało przerwaniem gałęzi przetwarzania hierarchii zadań. Analogicznie – przekroczenie wartości Minimalny poziom ostrzeżenia ustawi status WARNING.

Definicja statusu końcowego - algorytm wyznaczania statusu końcowego zadania​

  1. Definicja statusu końcowego domyślnie jest pusta, a znaczenie mają parametry Minimalny poziom błędu i Minimalny poziom ostrzeżenia.
  2. Oba parametry definiują w prosty sposób sytuacje, kiedy zadanie ma przyjąć statusy WARNING i ERROR.
  3. W przypadku ustalenia szczegółowej definicji statusu końcowego oba podstawowe parametry tracą swoje znacznie i ich wartości nie będą uwzględniane.

Do określenia algorytmu wyznaczania statusu końcowego służy edytor kolekcji pokazany na poniższym rysunku.

Pic 246

  1. Po lewej stronie widoczne są cztery zdefiniowane sytuacje. Algorytm wyznaczania statusu będzie analizował każdą z sytuacji w kolejności „od góry”.
  2. W przypadku, gdy liczba i poziom błędów w pakiecie spowoduje, że któraś z sytuacji zostanie spełniona, to zwrócony zostanie status definiujący tę konkretną sytuację.
  3. Wszystkie kolejne sytuacje nie będą już wtedy analizowane.
  4. W przypadku, gdy żadna ze zdefiniowanych sytuacji nie zostanie spełniona, to zadanie otrzyma status końcowy OK.
  5. Prawa strona rysunku przedstawia szczegóły wybranej sytuacji. Można w niej określić przedział od minimalnego do maksymalnego poziomu błędu (wagi), oraz minimalną liczbę błędów z tego przedziału, konieczną do spełnienia tej sytuacji.
  6. Oczywiście można również sprecyzować status zadania, jaki zostanie zwrócony w tym konkretnym przypadku. Oprócz standardowych statusów spoczynkowych TaskManagera: OK, WARNING, ERROR, można również zdefiniować własne statusy (np. status DECISION jest właśnie takim statusem).

Biorąc pod uwagę powyższą przykładową definicję, zadanie zwróci status:

  1. ERROR, jeżeli będzie przynajmniej jeden błąd na poziomie 10 i wyższym,
  2. WARNING, jeżeli będzie przynajmniej jeden błąd na poziomie 9 i nie będzie błędów z większą wagą,
  3. DECISION, jeżeli będzie przynajmniej 10 błędów na poziomie od 2 do 8 lub przynajmniej 100 błędów na poziomie 1 i nie będzie żadnych błędów na poziomie wyższym od 8,
  4. OK, jeżeli nie zajdzie żadne z powyższych.

Typy parametrów – argumentów wywołania pakietów​

Po stronie zadań parametry są wyłącznie napisami. Po stronie pakietów przetwarzania danych argumenty wywołania mają typy, często inne niż napisowe. W celu pogodzenia tej sytuacji można pod argumenty wywołania pakietu podłączyć adnotację Parser skonfigurowaną do stosownej zmiany typu wartości.

  1. Np. jeśli parametr ma wartości postaci „20100214” i oznacza datę (yyyyMMdd) przypisaną do parametru D2, pod argument wywołania można podłączyć parser Napis>Data ze stosownym formatem daty yyyyMMdd.

Domyślne wartości argumentów​

W podobny sposób można rozwiązać problem parametrów posiadających wartość domyślną.

  1. Np. gdy pakiet przetwarzania może działać w kilku trybach, w zależności od ustawienia parametrów typu „wartość logiczna”, które są wymagalne na wejściu, a pożądane jest mieć pewien domyślny sposób wykonania pakietu.
  2. Można takim argumentom wywołania ustawić adnotację Wartość stała zawierającą domyślną wartość parametrów. W takiej sytuacji nie będzie trzeba ustawiać wartości parametru po stronie konfiguracji zadania.

Dodatkowe informacje patrz: Argumenty wywołania pakietu.

Kopiowanie przyrostowe​

Zadanie Kopiowanie przyrostowe utrzymuje w drugiej bazie aktualną kopię jednej lub wielu tabel. Przy każdym uruchomieniu kopiuje tylko te wiersze, których kolumna przyrostu – znacznik czasu, rosnący klucz liczbowy albo rowversion SQL Servera – przesunęła się od poprzedniego przebiegu, ładuje je do tabeli roboczej po stronie celu i scala z tabelą docelową po jej kluczu głównym.

To zwyczajne zadanie harmonogramu: wskazujesz dwie bazy logiczne, podajesz listę tabel i ustawiasz cykliczność. W żadnej z baz nie trzeba niczego instalować, a źródło jest wyłącznie czytane.

Co robi, a czego nie robi

RobiNie robi
Kopiuje nowe i zmienione wiersze oknami, bez przeładowywania całej tabeliNie używa CDC, replikacji, triggerów ani czytania logu
Scala po kluczu głównym celu, więc wiersz skopiowany ponownie jest aktualizowany, a nie dublowanyNie zapewnia spójności transakcyjnej między tabelami – każda tabela jest przetwarzana niezależnie
Działa między różnymi silnikami baz (zob. Wsparcie silników)Nie przenosi zmian DDL, indeksów, więzów ani zachowania IDENTITY
Opcjonalnie przenosi usunięcia, pełnym przebiegiem po kluczach źródłaNie widzi samego usunięcia – znacznik czasu nie umie go wyrazić
Jest odporne na przerwanie w trakcie działania – żadne dane nie są przechowywane pomiędzy uruchomieniamiNie skopiuje wiersza, w którym aktualizacja nie ruszyła kolumny przyrostu
wskazówka

Jeśli potrzebujesz pełnego przeładowania tabeli przy każdym przebiegu, użyj zadania Bulk Copy. Jeśli potrzebujesz przetwarzania wiersz po wierszu, to zadanie dla pakietu przetwarzania danych.

Jak wygląda jedno uruchomienie​

┌───────────────────────────────────┐
│ Baza źródłowa (tylko czytanie) │
│ │
│ ┌──────────────────┐ │
│ │ Tabela źródłowa │ │
│ └──────────────────┘ │
└───────────────────────────────────┘
│
│ 1. jedno okno wierszy
▼
┌───────────────────────────────────┐
│ Baza docelowa │
│ │
│ ┌───────────────────────┐ │
│ │ Tabela robocza │ │
│ │ cel + _INC │ │
│ └───────────────────────┘ │
│ │ │
│ │ 2. MERGE │
│ ▼ │
│ ┌───────────────────────┐ │
│ │ Tabela docelowa │◄────┐ │
│ └───────────────────────┘ │ │
│ │ │
│ ┌───────────────────────┐ │ │
│ │ Tabela kluczy │─────┘ │
│ │ cel + _INC_KEYS │ │
│ └───────────────────────┘ │
└───────────────────────────────────┘
▲
│ 3. tylko KeySweep:
│ wszystkie klucze główne
│
┌──────────────────┐
│ Tabela źródłowa │
└──────────────────┘

4. DELETE wierszy bez pary
Tabela kluczy (_INC_KEYS) → Tabela docelowa

Kroki 1 i 2 powtarzają się dla kolejnych okien, aż tabela nadrobi zaległości. Kroki 3 i 4 wykonują się raz, na koniec tabeli, i tylko gdy DeleteMode ma wartość KeySweep.

Zadanie przetwarza Workers tabel równolegle, każdą na własnych połączeniach, i kończy się, gdy skończy się ostatnia. Cykliczność zapewnia harmonogram – jedno uruchomienie to jedna sesja nadrabiania.

Ruchome okno​

Obie krawędzie okna pochodzą z danych, nigdy z zegara, więc nic tutaj nie zależy od strefy czasowej ani od rozjazdu zegara maszyny, na której działa zadanie.

Zakładka (Overlap)
|<------->|
--o-----o------o--|----o----|-----o------o-----o-----o--|------------> kolumna przyrostu
| | |
najstarszy wiersz dolna krawędź pierwszego sufit
w źródle okna = znacznik celu = najnowsza wartość w źródle
minus Overlap (rowversion: MIN_ACTIVE_ROWVERSION() - 1)

|<- ChunkSize ->|<- ChunkSize ->|
+---------------+---------------+-------+ dla każdego okna:
| okno 1 | okno 2 | ... | TRUNCATE tabeli roboczej
+---------------+---------------+-------+ ładowanie okna
MERGE do tabeli docelowej
przerwa ChunkPauseSeconds
  • Sufit — najnowsza wartość obecna w źródle w chwili startu. Wiersze, które pojawią się powyżej, poczekają na następne uruchomienie.
  • Znacznik celu — najnowsza wartość już obecna w tabeli docelowej. To jedyna rzecz, którą zadanie pamięta, i leży ona w bazie docelowej, a nie w zadaniu.
  • Zakładka (Overlap) — o ile poniżej znacznika zaczyna się pierwsze okno. Jest potrzebna, bo transakcja rozpoczęta wcześniej może zatwierdzić się później: jej wiersze mają starszy znacznik niż wiersze już skopiowane. Overlap musi być większy od najdłuższej transakcji zapisującej w źródle, inaczej takie wiersze zostaną pominięte na zawsze. Wiersze skopiowane po raz drugi na styku okien nie szkodzą — MERGE aktualizuje je w miejscu.
  • ChunkSize — szerokość jednego okna. Ogranicza rozmiar dziennika transakcyjnego bazy docelowej przypadający na jedno okno, dzięki czemu pierwsze, pełne załadowanie dużej tabeli staje się praktycznie wykonalne. 0 oznacza jedno okno bez podziału.
  • Okna są domknięte jednostronnie, (dolna, górna], dzięki czemu w obrębie jednej sesji żaden wiersz nie zostaje skopiowany dwukrotnie.
  • Pusty cel — pierwsze okno zaczyna się o jeden tik poniżej najstarszego wiersza źródła, dzięki czemu pierwsze ładowanie rozpoczyna się bezpośrednio od rzeczywistych danych, bez konieczności przechodzenia przez szereg pustych okien od najwcześniejszego możliwego momentu.

Jeśli przebieg zostanie przerwany albo zadanie zostanie zatrzymane, jego wykonywanie zatrzymuje się pomiędzy oknami. Znacznik celu pozostaje wówczas po prostu niższy, a kolejne uruchomienie rozpoczyna pracę od tej wartości.

Rodzaje kolumny przyrostu​

Rodzaj wynika z wartości kolumny, nie z konfiguracji. Decyduje o tym, w jakich jednostkach podaje się Overlap i ChunkSize:

Typ kolumnyJednostka oknaUwagi
datetime, datetime2, timestamp (Oracle/DB2/PostgreSQL), dowolna data z czasemsekundyPrzypadek typowy. ChunkSize 86400 to jedna doba na okno.
int, bigint, decimal, dowolny typ całkowity lub stałopozycyjnyjednostki kluczaDla stale rosnącego klucza sztucznego albo sekwencji. ChunkSize 100000 to 100 000 kluczy na okno.
rowversion / timestamp (SQL Server)tiki licznikaSufitem jest MIN_ACTIVE_ROWVERSION() - 1, poniżej którego nic nie może się już zatwierdzić, więc Overlap może być 0. Kolumna w celu musi być binary(8).

Wymagania wobec kolumny, sprawdzane przez Check:

  • NOT NULL. Wiersz z wartością NULL nigdy nie zostałby przypisany do żadnego okna, a poszczególne silniki bazodanowe różnią się sposobem sortowania wartości NULL, przez co same granice okien byłyby nieprzewidywalne.
  • Musi rosnąć przy każdej zmianie wiersza. Jeśli aplikacja aktualizuje wiersz bez modyfikacji tej kolumny, dana zmiana nie zostanie skopiowana. Jest to jedyny aspekt, którego zadanie nie jest w stanie zweryfikować automatycznie.
  • Powinna być pierwszą kolumną w obrębie jakiegoś indeksu. Bez indeksu każde okno wymaga pełnego skanu tabeli, przez co podział na okna staje się niekorzystny zamiast pomocnego. Mechanizm Check zgłasza wówczas stosowne ostrzeżenie.

Zarówno tabela źródłowa, jak i docelowa muszą posiadać klucz główny po obu stronach — to na jego podstawie operacja MERGE dopasowuje odpowiadające sobie wiersze.

Parametry​

Ustawiane w <params> zadania w hierarchii albo w oknie właściwości w archITekt Studio.

ParametrEtykieta w StudioDomyślnieZnaczenie
SourceDbNameBaza źródłowa– (wymagany)Nazwa logiczna bazy źródłowej.
DestinationDbNameBaza docelowaglobalny DefaultDbNameNazwa logiczna bazy docelowej.
FileName–nazwa zadaniaGdzie leży lista tabel: lista.txt;KATALOG_LOGICZNY (katalog logiczny z konfiguracji), samo lista.txt (szukane w globalnym DefaultDirName hierarchii, w katalogu logicznym TASKS albo obok pliku hierarchii) lub ścieżka absolutna. Bez tego parametru nazwą pliku jest nazwa zadania.
WorkersLiczba wątków4Ile tabel kopiowanych równolegle. Przy pierwszym, pełnym ładowaniu zostaw 1, żeby nie zdławić źródła.
OverlapZakładka okna300O ile cofnięte jest pierwsze okno, w jednostkach znacznika. Zob. Ruchome okno.
ChunkSizeSzerokość okna86400Szerokość jednego okna, w jednostkach znacznika. 0 to jedno okno – rozsądne tylko dla małych tabel.
ChunkPauseSecondsPrzerwa między oknami [s]1Przerwa w sekundach rzeczywistych między oknami, żeby źródło obsłużyło własny ruch.
DeleteModeUsunięciaNoneNone albo KeySweep. Zob. Przenoszenie usunięć.
CreateMissingTablesZakładanie brakujących tabelfalseZakłada w celu brakujące tabele i kolumny. Typy przepisuje wprost ze schematu źródła, więc ma to sens tylko między bazami tego samego silnika.
BatchSizeRozmiar wsadu1000Liczba wierszy w paczce BulkCopy.
SqlBulkCopyOptionsOpcje BulkCopyKeepIdentityZostaw KeepIdentity. Tabela robocza dziedziczy właściwość IDENTITY tabeli docelowej, więc bez tej flagi ładowanie przenumeruje klucze i MERGE trafi w niewłaściwe wiersze.
StagingTableSchemaSchema tabeli roboczej(pusta)Schema tabeli roboczej, analogicznie do Schema tabel docelowych. Pusta oznacza tę samą schemę co tabela docelowa.
StagingTablePrefixPrefiks tabeli roboczej(pusty)Prefiks nazwy tabeli roboczej, analogicznie do Prefiks nazwy docelowej.
StagingTableSuffixPrzyrostek tabeli roboczej_INCPrzyrostek nazwy tabeli roboczej. Nie może być pusty – pusty wskazywałby tabelę docelową, a każde okno zaczyna się od wyczyszczenia tabeli roboczej.
TargetSchemaSchema tabel docelowych(pusta)Schema tabel docelowych. Pusta oznacza tę samą schemę co w źródle.
TargetPrefixPrefiks nazwy docelowej(pusty)Doklejany przed nazwę tabeli docelowej.
TargetSuffixSufiks nazwy docelowej(pusty)Doklejany za nazwę tabeli docelowej.
SourceDbCmdTimeout, DestinationDbCmdTimeoutTimeout źródła / celu3600Timeout zapytań w sekundach.

Nazwy tabel docelowych. Trzy konwencje nazwy nakładają nazwę źródłową na docelową. Dla tabeli źródłowej a.b: TargetSchema=x daje x.b; razem z TargetPrefix=p_ i TargetSuffix=_s daje x.p_b_s. Gdy wszystkie trzy są puste, tabela docelowa nazywa się dokładnie tak jak źródłowa, tyle że w drugiej bazie – przypadek typowy. Obie strony mogą być tą samą bazą, co jest wygodne do przetestowania całego mechanizmu, ale wtedy trzeba ustawić przynajmniej jedną z trzech konwencji, inaczej zadanie kopiowałoby tabele same w siebie; Check taką konfigurację odrzuca.

Lista tabel​

Skryptem zadania jest zwykła lista tabel, jedna na linię. Kolumny rozdziela tabulator, bo nazwa tabeli może legalnie zawierać spacje.

dbo.Orders ModifiedUtc
dbo.OrderLines ModifiedUtc WHERE Status = 'ACTIVE' -Payload,-Notes
dbo.Events EventId
# dbo.Heap ChangedAt brak klucza głównego, wyłączona do czasu jego dodania
KolumnaWymaganaZnaczenie
1takNazwa tabeli, ze schemą jak w źródle.
2takKolumna przyrostu.
3+nieWHERE <warunek> i/lub -kolumna,-kolumna, w dowolnej kolejności. Wszystko inne to komentarz.
  • Linia zaczynająca się od # albo -- jest komentarzem. Tak wyłącza się tabelę bez usuwania jej z listy.
  • WHERE <warunek> to gołe SQL doklejane do każdego zapytania o źródło – krawędzi okna, okien i przebiegu po kluczach – więc cel staje się spójnym lustrem podzbioru.
  • -kolumna,-kolumna powoduje wyłączenie wskazanych kolumn z procesu kopiowania. Pominięta kolumna nie musi istnieć w tabeli docelowej; jeśli jednak istnieje, operacja MERGE jej nie modyfikuje, dzięki czemu tabela docelowa może przechowywać w niej własną wartość. Nie jest możliwe pominięcie kolumny klucza głównego ani kolumny przyrostu.
  • Samo WHERE bez warunku jest błędem, a nie „brakiem filtra".
  • Lista wklejona ze spacjami zamiast tabulatorów spowoduje wyraźny błąd, zamiast w niezauważalny sposób zniekształcić nazwę.

Zamiast osobnego pliku lista może zostać umieszczona bezpośrednio w pliku XML hierarchii, jako wewnętrzny skrypt zadania.

Przykładowe zadanie w hierarchii:

<task>
<name>MirrorOrders</name>
<type>TaskModule.Task.CopyDataIncrements;TaskModule.dll</type>
<status>START_PENDING</status>
<params>
<param key="FileName" value="MirrorOrders.txt;DATA_MIRROR_TASKS" />
<param key="SourceDbName" value="SRC" />
<param key="DestinationDbName" value="MIRROR" />
<param key="ChunkSize" value="3600" />
</params>
<nextTasks/>
</task>

W archITekt Studio​

Zadanie znajduje się w przyborniku pod nazwą Kopiowanie przyrostowe. Po przeciągnięciu go na graf hierarchii powstaje zadanie z wypełnionym typem, plikiem skryptu utworzonym na podstawie wzorca – zawierającym zakomentowany przykład listy tabel – oraz parametrami widocznymi w oknie właściwości pod etykietami z tabeli powyżej. Dwukrotne kliknięcie zadania otwiera listę tabel w edytorze tekstu.

image

Check zachowuje się odmiennie w trybie projektowym: w archITekt Studio weryfikuje listę tabel oraz konfigurację zadania, lecz nie nawiązuje połączenia z bazami danych, dzięki czemu walidacja hierarchii pozostaje szybka i możliwa do przeprowadzenia ze stacji roboczej niemającej dostępu do baz danych. Kontrole schematu wymienione poniżej są wykonywane na serwerze, przed uruchomieniem zadania.

Jedna tabela, krok po kroku​

  1. Zadanie pyta bazę źródłową o najnowszą wartość przyrostu (pierwszy wiersz po indeksie) → baza źródłowa zwraca sufit.
  2. Zadanie pyta bazę docelową o najnowszą wartość przyrostu w tabeli docelowej → baza docelowa zwraca znacznik celu.
  3. Dolna krawędź pierwszego okna = znacznik minus Overlap (dla pustego celu: tik poniżej najstarszego wiersza źródła).
  4. Zadanie zakłada w bazie docelowej tabelę roboczą, jeśli jeszcze nie istnieje.
  5. Dla każdego okna o szerokości ChunkSize: TRUNCATE tabeli roboczej → odczyt okna ze źródła (dolna krawędź wyłącznie, górna włącznie) → ładowanie BulkCopy do tabeli roboczej → MERGE tabeli roboczej w docelową po kluczu głównym → przerwa ChunkPauseSeconds.
  6. Jeżeli DeleteMode = KeySweep: TRUNCATE tabeli kluczy → odczyt wszystkich wartości klucza głównego ze źródła → ładowanie BulkCopy do tabeli kluczy → DELETE wierszy celu bez pary w tabeli kluczy.

Przenoszenie usunięć​

Znacznik czasu nie jest w stanie wyrazić faktu usunięcia: wiersz po prostu przestaje istnieć, a żadne okno nigdy o nim nie wspomni. Przy ustawieniu DeleteMode = None (wartość domyślna) usunięte wiersze pozostają zatem w tabeli docelowej bezterminowo.

Ustawienie DeleteMode = KeySweep eliminuje ten problem. Po skopiowaniu wszystkich okien danej tabeli zadanie wczytuje komplet kluczy głównych ze źródła do drugiej tabeli roboczej, a następnie usuwa z tabeli docelowej każdy wiersz, dla którego nie znaleziono odpowiednika. Operacja ta jest celowo wykonywana po przetworzeniu okien: wiersz wstawiony pomiędzy pobraniem kluczy a kopiowaniem danych zostałby skopiowany, a następnie natychmiast usunięty jako rekord osierocony.

W praktyce:

  • Jest to pełny przebieg po kluczach źródła, w związku z czym koszt odpowiada w przybliżeniu jednemu pełnemu odczytowi kolumn klucza. Jest to znacznie tańsze niż kopiowanie całej tabeli, jednak nie pozbawione kosztu.
  • Zaleca się przypisanie mu osobnego węzła hierarchii z ustawieniem DeleteMode = KeySweep, uruchamianego rzadziej niż przyrosty – na przykład raz na dobę lub raz w tygodniu, w zależności od tego, jak długo można tolerować obecność zaległego, usuniętego wiersza.
  • Jeżeli tabela źródłowa okaże się pusta, przebieg zostaje pominięty wraz z odpowiednim ostrzeżeniem, zamiast prowadzić do wyczyszczenia tabeli docelowej – puste źródło znacznie częściej wynika z błędu konfiguracji niż z zamierzonego działania.
  • Usunięcia stanowią jedyny przypadek, w którym zapis do tabeli docelowej odbywa się poza operacją MERGE, dlatego wykorzystywane konto musi posiadać uprawnienie DELETE do tabel docelowych.

Check – tryb raportu​

Check wykonuje się przed każdym startem, a w archITekt Studio można go wywołać na żądanie. Jest czystym raportem: łączy się z obiema bazami, czyta oba schematy i nic nie zapisuje. W archITekt Studio zatrzymuje się na liście tabel i konfiguracji, i nie łączy się z bazami – zob. W archITekt Studio.

Sprawdza, dla każdej tabeli:

  • czy tabela istnieje w źródle oraz czy odpowiadająca jej tabela istnieje w bazie docelowej (lub zostanie utworzona, jeśli włączona jest opcja CreateMissingTables);
  • czy kolumna przyrostu istnieje i posiada atrybut NOT NULL;
  • czy obie tabele posiadają klucz główny oraz czy kolumny klucza tabeli docelowej istnieją również w tabeli źródłowej;
  • czy każda kopiowana kolumna istnieje w tabeli docelowej;
  • czy kolumny pominięte w kopiowaniu istnieją w tabeli źródłowej, nie stanowią klucza głównego ani kolumny przyrostu oraz nie posiadają w tabeli docelowej atrybutu NOT NULL bez zdefiniowanej wartości domyślnej;
  • czy tabela docelowa nie zawiera kolumny typu rowversion innej niż binary(8);
  • czy istniejąca tabela robocza posiada ten sam zestaw kolumn co tabela kopiowana;
  • czy tabela źródłowa i tabela docelowa nie są tą samą tabelą.

Ostrzega, gdy kolumna przyrostu nie jest pierwszą kolumną żadnego indeksu – kopiowanie będzie działać i będzie wolne.

Zakładane obiekty i uprawnienia​

ObiektGdzieKto zakładaUwagi
Tabela robocza cel + StagingTableSuffixbaza docelowazadanie, przy pierwszym użyciuSELECT ... INTO z tabeli docelowej plus indeks po kluczu głównym. Zostaje między uruchomieniami i jest ponownie używana.
Tabela kluczy robocza + _KEYSbaza docelowazadanie, przy pierwszym użyciu, tylko przy KeySweepWyłącznie kolumny klucza głównego.
Tabele docelowe i brakujące kolumnybaza docelowatylko przy CreateMissingTablesTabele bez IDENTITY, dokładane kolumny zawsze NULL.

Minimalne uprawnienia:

  • Źródło: SELECT na wymienionych tabelach. Nic więcej, nigdy.
  • Cel: SELECT, INSERT, UPDATE na tabelach docelowych, a przy KeySweep także DELETE; na tabelach roboczych dodatkowo prawo do TRUNCATE (na SQL Serverze to ALTER na tabeli). CREATE TABLE i CREATE INDEX, o ile nie założysz tabel roboczych ręcznie. Cel z kolumną IDENTITY wymaga dodatkowo prawa do przełączania IDENTITY_INSERT.

Wsparcie silników​

Mechanizm jest obojętny silnikowo poza dwoma miejscami:

  • Tworzenie tabel roboczych odbywa się za pomocą składni SELECT ... INTO, właściwej dla SQL Servera. W przypadku innego silnika bazodanowego po stronie docelowej należy jednorazowo utworzyć tabele robocze ręcznie – jako kopie tabeli docelowej (lub wyłącznie jej kolumn klucza) wraz z indeksem opartym na kluczu głównym. Pozostała część mechanizmu działa wówczas bez żadnych zmian.
  • Proces ładowania wykorzystuje szybki protokół BulkCopy, jeżeli bazą docelową jest SQL Server, natomiast w pozostałych przypadkach korzysta z instrukcji INSERT wykonywanych w paczkach. Oba warianty działają poprawnie, jednak wariant zastępczy charakteryzuje się niższą wydajnością.

Scalanie korzysta z MERGE silnika tam, gdzie on istnieje, a gdzie nie – z pary UPDATE + INSERT wygenerowanej z tej samej definicji. Przebieg kasujący to przenośne NOT EXISTS. Źródłem może być dowolny silnik wspierany przez platformę.

Przepisy​

  • Pierwsze, pełne ładowanie. Workers = 1, ChunkSize na tyle mały, żeby jedno okno liczyło się w minutach, nie w godzinach (dla ruchliwej tabeli – godzina danych), ChunkPauseSeconds kilka sekund. Najpierw Check, potem niech idzie; przejdzie od najstarszego wiersza do najnowszego przez tyle okien, ile trzeba. Workers i ChunkSize podnieś, kiedy nadrobi.
  • Stan ustalony. ChunkSize równy dobie jest odpowiedni, gdy odstęp między uruchomieniami jest znacznie krótszy niż doba: w takiej sytuacji zazwyczaj przypada jedno okno na przebieg. Wartość Overlap powinna przekraczać o kilka minut czas trwania najdłuższej transakcji zapisującej.
  • Lustro podzbioru. Należy dodać warunek WHERE w linii opisującej tabelę. Warto pamiętać, że późniejsze zawężenie filtra pozostawia w tabeli docelowej wiersze, które nie należą już do danego podzbioru – zostaną one usunięte podczas przebiegu KeySweep. Rozszerzenie filtra jest trudniejsze do przeprowadzenia: nowo objęte, starsze wiersze znajdują się poniżej znacznika celu i nie zostaną automatycznie uwzględnione, w związku z czym konieczne jest usunięcie tabeli docelowej (lub dotkniętych wierszy) i ponowne wczytanie danych przez zadanie.
  • Szeroka tabela, węższa kopia. Zaleca się wyłączenie niepotrzebnych kolumn za pomocą oznaczenia -kolumna. Rozwiązanie to ogranicza ruch sieciowy, nie zmniejsza natomiast obciążenia po stronie źródła.
  • Testowanie mechanizmu w obrębie jednej bazy danych. Należy wskazać tę samą bazę danych jako źródłową i docelową oraz ustawić parametr TargetSuffix = _COPY. W przypadku pominięcia tego ustawienia konfiguracja zostanie odrzucona przez mechanizm Check, co uniemożliwia przypadkowe skopiowanie tabel do samych siebie.

Ograniczenia i pułapki​

  • Aktualizacja niemodyfikująca kolumny przyrostu pozostaje niewidoczna dla mechanizmu. Żadna z opisanych funkcjonalności nie jest w stanie takiej zmiany wykryć.
  • Wartość Overlap mniejsza niż czas trwania najdłuższej transakcji powoduje ciche pominięcie części wierszy. Jest to jedyny parametr, którego wartość warto ustalić na podstawie pomiaru, a nie oszacowania.
  • Obsługa usunięć wymaga ustawienia DeleteMode = KeySweep. Bez tego ustawienia rozmiar tabeli docelowej wyłącznie rośnie.
  • Brak spójności pomiędzy tabelami. Poszczególne tabele są przetwarzane niezależnie i równolegle, w związku z czym raport odwołujący się jednocześnie do dwóch odzwierciedlonych tabel może zaobserwować jedną z nich w stanie nieznacznie starszym niż druga.
  • Zmiana filtra lub listy kolumn wymaga zachowania ostrożności. Zob. Przepisy powyżej; nieaktualna tabela robocza zawierająca poprzedni zestaw kolumn jest zgłaszana przez mechanizm Check – należy ją usunąć, zostanie ona utworzona ponownie.
  • Zmiana schematu w tabeli źródłowej (np. dodanie nowej kolumny) jest zgłaszana przez mechanizm Check do momentu, w którym odpowiadająca jej kolumna zostanie dodana w tabeli docelowej – ręcznie albo za pomocą opcji CreateMissingTables.

Błędy, zatrzymanie i wznawianie​

  • Niepowodzenie przetwarzania jednej tabeli nie zatrzymuje przetwarzania pozostałych; przebieg kończy się statusem ERROR, a tabele, dla których wystąpił błąd, zostają wymienione w komunikacie zadania.
  • Błąd zaklasyfikowany jako błąd serwera (np. zerwane połączenie, restart usługi, zakleszczenie) skutkuje, zamiast statusem ERROR, ustawieniem po upływie minuty statusu RESUME_PENDING, po czym harmonogram ponownie uruchamia zadanie. Wznowienie stanowi zwykłe ponowne uruchomienie i jest bezpieczne właśnie dlatego, że znacznik celu jest jedynym elementem pamiętanym przez zadanie.
  • Zatrzymanie zadania umożliwia dokończenie przetwarzania bieżącego okna, po czym zadanie zatrzymuje się przed rozpoczęciem kolejnego. Przebieg oparty na kluczach zostaje w takim przypadku pominięty. Żadne okno nie zostaje scalone częściowo: dane okno zostaje scalone w całości albo wcale.

Komunikaty w logu, które warto znać​

KomunikatCo znaczy
{0}: {1} wiersz(y), znacznik przesunięty do {2}Informacja o postępie przetwarzania tabeli w trakcie nadrabiania zaległości – jeden wiersz komunikatu na każde okno.
{0}: {1} wiersz(y) w czasie {2}.Tabela osiągnęła stan bieżący (nadrobiła zaległości).
{0}: tabela źródłowa jest pusta - nie ma czego kopiować.Tabela źródłowa nie zawiera żadnych wierszy lub żaden z nich nie spełnia warunku filtra.
{0}: bez indeksu na {1} każde okno to pełny skan - dzielenie na okna wtedy szkodzi, a nie pomaga.Ostrzeżenie zgłaszane przez mechanizm Check. Należy dodać indeks lub ustawić wartość ChunkSize = 0.
{0}: przenoszenie usunięć pominięte - puste źródło wyczyściłoby cały cel...Mechanizm KeySweep odmówił wykonania operacji na pustym źródle. Należy zweryfikować filtr oraz zawartość tabeli źródłowej.
{0}: tabela robocza {1} ma inny zestaw kolumn niż kopiowany - skasuj ją, zostanie założona od nowa.Zmianie uległa lista kolumn lub schemat tabeli docelowej. Należy usunąć tabelę roboczą.
{0}: kolumna przyrostu {1} dopuszcza NULL - musi być NOT NULL.Należy poprawić definicję kolumny w tabeli źródłowej lub wybrać inną kolumnę przyrostu.
Nieobsługiwany typ kolumny przyrostu: {0} - dozwolone są znaczniki czasu, liczby całkowite, decimal i rowversion.Kolumna posiada typ danych, dla którego nie można wyznaczyć okien, lub jej typ różni się pomiędzy tabelą źródłową a docelową.

Strony kodowe​

Poniższa tabela prezentuje numery kodowań (wartość występujących w różnych miejscach parametrów „Encoding”) wraz z opisem i numerem strony kodowej Windows.

CodePageIdentifier and nameWindowsCodePage
37IBM0371252 *
437IBM4371252 *
500IBM5001252 *
708ASMO-7081256 *
720DOS-7201256 *
737ibm7371253 *
775ibm7751257 *
850ibm8501252 *
852ibm8521250 *
855IBM8551252 *
857ibm8571254 *
858IBM008581252 *
860IBM8601252 *
861ibm8611252 *
862DOS-8621255 *
863IBM8631252 *
864IBM8641256 *
865IBM8651252 *
866cp8661251 *
869ibm8691253 *
870IBM8701250 *
874windows-874874
875cp8751253 *
932shift_jis932
936gb2312936
949ks_c_5601-1987949
950big5950
1026IBM10261254 *
1047IBM010471252 *
1140IBM011401252 *
1141IBM011411252 *
1142IBM011421252 *
1143IBM011431252 *
1144IBM011441252 *
1145IBM011451252 *
1146IBM011461252 *
1147IBM011471252 *
1148IBM011481252 *
1149IBM011491252 *
1200utf-161200
1201unicodeFFFE1200 *
1250windows-12501250
1251windows-12511251
1252Windows-12521252
1253windows-12531253
1254windows-12541254
1255windows-12551255
1256windows-12561256
1257windows-12571257
1258windows-12581258
1361Johab949 *
10000macintosh1252 *
10001x-mac-japanese932 *
10002x-mac-chinesetrad950 *
10003x-mac-korean949 *
10004x-mac-arabic1256 *
10005x-mac-hebrew1255 *
10006x-mac-greek1253 *
10007x-mac-cyrillic1251 *
10008x-mac-chinesesimp936 *
10010x-mac-romanian1250 *
10017x-mac-ukrainian1251 *
10021x-mac-thai874 *
10029x-mac-ce1250 *
10079x-mac-icelandic1252 *
10081x-mac-turkish1254 *
10082x-mac-croatian1250 *
12000utf-321200 *
12001utf-32BE1200 *
20000x-Chinese-CNS950 *
20001x-cp20001950 *
20002x-Chinese-Eten950 *
20003x-cp20003950 *
20004x-cp20004950 *
20005x-cp20005950 *
20105x-IA51252 *
20106x-IA5-German1252 *
20107x-IA5-Swedish1252 *
20108x-IA5-Norwegian1252 *
20127us-ascii1252 *
20261x-cp202611252 *
20269x-cp202691252 *
20273IBM2731252 *
20277IBM2771252 *
20278IBM2781252 *
20280IBM2801252 *
20284IBM2841252 *
20285IBM2851252 *
20290IBM290932 *
20297IBM2971252 *
20420IBM4201256 *
20423IBM4231253 *
20424IBM4241255 *
20833x-EBCDIC-KoreanExtended949 *
20838IBM-Thai874 *
20866koi8-r1251 *
20871IBM8711252 *
20880IBM8801251 *
20905IBM9051254 *
20924IBM009241252 *
20932EUC-JP932 *
20936x-cp20936936 *
20949x-cp20949949 *
21025cp10251251 *
21866koi8-u1251 *
28591iso-8859-11252 *
28592iso-8859-21250 *
28593iso-8859-31254 *
28594iso-8859-41257 *
28595iso-8859-51251 *
28596iso-8859-61256 *
28597iso-8859-71253 *
28598iso-8859-81255 *
28599iso-8859-91254 *
28603iso-8859-131257 *
28605iso-8859-151252 *
29001x-Europa1252 *
38598iso-8859-8-i1255 *
50220iso-2022-jp932 *
50221csISO2022JP932 *
50222iso-2022-jp932 *
50225iso-2022-kr949 *
50227x-cp50227936 *
51932euc-jp932 *
51936EUC-CN936 *
51949euc-kr949 *
52936hz-gb-2312936 *
54936GB18030936 *
57002x-iscii-de57002
57003x-iscii-be57003
57004x-iscii-ta57004
57005x-iscii-te57005
57006x-iscii-as57006
57007x-iscii-or57007
57008x-iscii-ka57008
57009x-iscii-ma57009
57010x-iscii-gu57010
57011x-iscii-pa57011
65000utf-71200 *
65001utf-81200 *

Inne zadania​

Puste zadanie​

Zadanie nie wykonujące żadnych użytecznych operacji, służy jako centralny punkt startowy, końcowy lub synchronizacyjny w sieci zależności.

Zadanie c#​

Inne zadanie zdefiniowane w kodzie Systemu, nie posiadające własnej dedykowanej ikonki. Może realizować całkowicie dowolne funkcje. Definicja wymaga znajomości programowania w .NET i obsługi kompilatora.

Zobacz również​

Mechanizm generowania pakietów migracyjnych

Logowanie błędów i ostrzeżeń