SSIS OLE DB Destination versus AS400 DB2
Při svém bádání nad možným i nemožným propojování světů a galaxií jsem narazil na problém, který myslím stojí za to uveřejnit a podělit se s vámi. Již (dovolím si říci) spolehlivě fungující technologie OLE DB přináší občas mnohá překvapení v podobě chybových hlášení, jejichž popis nenajdete nikde na internetu a to ani na stránkách výrobců a vývojářů propojovaných technologií. Můj případ byl naštěstí vyjímkou a řešení svého problému jsem našel (sice až úplně dole v pomyslné hromadě informací) na internetu v nějakém velmi zastrčeném vlákně jakési diskuzní skupiny.
A teď již k samotnému problému. Jedná se o použítí Data Flow Component, konkrétně OLE DB Destination adaptéru v SLQ Server Integration Services (SSIS). Tak jako užívám OLE DB Source komponentu pro pumpování dat z tabulek IBM AS400 DB2 stroje, chtěl jsem použít pro zpáteční cestu logicky OLE DB Destination adaptér. Vytvořil jsem tedy nové Native OLE DB připojení a jako poskytovatele jsem použil 'IBM DB2 UDB for iSeries IBMDA400 OLE DB Provider'. Je to ten samý provider kterého používám tahání dat z AS400 do SQL Serveru 2005. Bohužel, po té co jsem nakonfiguroval připojení, ověřil, že test spojení proběhl, komponenta při své validaci nahlásí chybu:
TITLE: Microsoft Visual Studio
------------------------------
Error at Export Product Monitoring to AS400 [OLE DB Destination [526]]: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80004005. An OLE DB record is available. Source: "IBMDA400 File Rowset" Hresult: 0x80004005 Description: "CPF4328: Member ROI13P not journaled to journal *N.".
Error at Export Product Monitoring to AS400 [OLE DB Destination [526]]: Opening a rowset for "A73ROE.ROI16P" failed. Check that the object exists in the database.
------------------------------
ADDITIONAL INFORMATION: Exception from HRESULT: 0xC02020E8 (Microsoft.SqlServer.DTSPipelineWrap)
------------------------------
Zlí jazykové tvrdí, že jediná možnost jak toto vyřešit je ta, že zapnete 'journaling' tabulky ke které přistupujete na AS400. Komponenta totiž požaduje transakční zpracování a to bez zapnutého 'journalingu' na straně AS400 nelze. Alespoň takové vysvětlení jsem dostal. Navíc administrátoři těchto systémů k přistupují k zapínání 'journalingu' velmi neradi, už proto, že tzv. 'journaling' je neskutečný požírač prostoru a i když nastavíte velikosti souborů kam se se změny ukládají, musíte nějakým způsobem zajistit postupné odmazávání starších verzí těchto odkládacích ('journalovacích') souborů, protože systém po dosažení velikosti souboru tento ponechá a vytvoří nový. Nedochází tedy k přepisu starého souboru.
Řešení které zde popisuji nevyžaduje vůbec žádný 'journaling' ani jinou podobnou úchylárnu na straně 'Velké Modré'. Stačí jen, když místo zmiňovaného a na OLE DB Source komponentách úspěšně používaného poskytovatele s názvem 'IBM DB2 UDB for iSeries IBMDA400 OLE DB Provider' použijete jiného, který se též nachází pod skupinou Native OLE DB\SQL Native Client a jmenuje se (pozor!!" skoro stejně) 'IBM DB2 UDB for iSeries IBMDASQL OLE DB Provider'. V tuto chvíli vám již OLE DB Destination komponenta zafunguje bez zmiňované chyby.
P.S: Není to buhví jaké řešení, ale je to řešení. Pokud by někdo z vás měl zkušennosti s psaním vlastních SSIS komponent (já jsem již nějaké napsal, ale občas by se mi šikla nejaká ta konzultace) budu rád když se ozvete.
Tak se zatím mějte krásně.
Mirek