
Az életem történetét itt hagytam abba 2009-ben. Egy kis nyári rápihenés után folytatnám. A következő kérdés, hogyan lettem én SQL-programozó, hogyan találkoztam és barátkoztam meg az akkori világ leges-legkiforratlanabb SQL-termékével, a Microsoft SQL Server 4.21A-val?
Ez az SQL Server verzió közvetlenül azután került a piacra valamikor '94-ben, hogy a Microsoft megvette a Sybase-től az SQL Server forráskódját. Nevezetes történet: a pici Microsoft megvette a nagy Sybase-től a forráskódot, de a ravasz Sybase csak és kizárólag Windows-platformra adta el neki, az összes többi oprendszerre - okos előrelátással - megtartotta magának. Mi az, hogy Windows NT 3.0, ugye? 0,6%-os piaci részesedés. Cöcö. Vigyétek! Így esett, hogy a Sybase kinyírta önmagát.
Na szóval, banki informatikai szakértőként javában szakértettem a DBase III adatbázisokat, amikor akkori főnököm valami tizenhetedik vagy kilencvenkettedik érzékére hallgatva felcsapott Microsoft Partnernek. Így kerültem az egyik legelső Microsoft-partnerhez dógozni. Úgy tehát, hogy nem csináltam semmit, nem voltam éleselméjű, csak úgy megesett. (Itt jegyzem meg, hogy addigra kis tanácsadó cégünk 50% bővüléssel 3 fősre duzzadt.) Én csak arra emlékszem, hogy a Microsoft-partnerek kezdőkörébe tartozott például a már akkor is milliárdos forgalmú Albacomp, meg még egy-két ilyen nagyágyú (Rolitron), és az egyik legelső MS Partneri összeröffenésen (összeröffentek vagy öten) arra próbálták rávenni a nagy cégek a Microsoftot (persze esélytelenül), hogy a kicsiket zárják ki a buliból. Ezeken a megbeszéléseken teljes jogú tagként ott csücsült a főnököm a maga 3 fős cégével, és jókat röhögött magában. Szerintem nem tudták róla, hogy ő eleve egy kicsi.

Hamarosan egy új alkalmazás fejlesztésénél - meglepő módon - a Microsoft SQL Serverre esett a választásunk, én lettem a programozó. Én addig még az életben nem írtam le egy épkézláb SQL-utasítást, mert hát tanultam ugyan a főiskolán, de élő SQL-motort nem láttunk, papíron ment a buli. Na akkor fejlesszünk. Mondanom sem kell, akkor és úgy jöttem rá a halmazorientált világ szépségeire, hogy nem találtam meg azt a parancsot, amivel soronként lehetett volna kezelni a táblák rekordjait. Mintha abban az őslény SQL Serverben nem lett volna kurzor. De jobb is, hogy nem volt, mert talán még mind a mai napig soronként lépegetnék, hisz a dibézben is úgy volt. Meg aztán azt is hiányoltam, hogy egy lekérdezésnek hol adom meg, melyik indexet használja. Időbe tellett, mire leesett, hogy SEHOL, indexet az SQL Server maga választ az általam létrehozott készletből. A mellékelt ábrán egy Index Tuning varázslatot látunk, Trabantra megkomponálva.

És hát a triggerek! Mint az köztudomású, az angol trigger szó a magyar trógerből származik, mint ahogy a dollár is a tallérból, ami pedig a szittya-ószanszkrit-szkíta trutyi szavunk egy változata. Na szóval tróger. Amikor azokat felfedeztem, teljesen rájuk kattantam, az egész alkalmazás egy halom triggerből kezdett állni. Öröm az ilyet debuggolni! És öröm nézni a deadlockokat is, amiket én okoztam a rosszul megírt triggereimmel.
És akkor ugye a dzsoin. Azt tudtátok, hogy akkoriban az ANSI SQL-ből még hiányzott a join, így minden gyártó saját szintaxist alkotott? Az SQL Server például ezt:
SELECT * FROM Table1, Table2 where Table1.id=Table2.id
Nagyon aranyos! A left outer join meg ez volt:
SELECT * FROM Table1, Table2 where Table1.id*=Table2.id
De a legnagyobb kihívás talán mégis a korrelált szabkveri volt, amit még akkor sem értettem, amikor már megalkottam életem első ilyen lekérdezését. Emlékszem, ott bogarásztam az eredményhalmazt, és nem hittem a szememnek, hogy mit le nem kérdezett az SQL-motor egyetlen ügyes SELECT-tel! Régi szép idők!

Ja, és a grafikus felület. Ha jól emlékszem, az SQL Server 4.21A-hoz vagy nem volt menedzsmenteszköz, vagy annyira gyenge volt, hogy nem használtam. Management Studio? Ugyaaaaaaaaaan! TSQL! Mindent-mindent-mindent, de mindent Notepadben kellett csinálni, mégpedig elsőre hibátlanul kellett megcsinálni, mert nem volt ám ALTER utasítás! Ha megszültem egy táblát (CREATE TABLE), de abból kifelejtettem egy mezőt, akkor az vagy kimaradt, vagy vissza kellett menni a kályhához (DROP TABLE). "Szerencsére" a referenciális integritás még nem volt feltalálva, így nem kellett attól tartani, hogy egy táblát nem lehet törölni a kapcsolatai miatt. Mi az, hogy kapcsolat? Ugyaaaaaaaaaaaan!
Nem volt ám IDENTITY sem. Hogyan generál az ember egyedi, növekvő kulcsértéket IDENTITY nélkül? Úgy, hogy az INSERT-re tesz egy triggert, ami felébred, körülnéz, és leszelektálja a MAX(ID)+1-et. Nagyon frankó, de ez csak egyfelhasználós esetben működik helyesen. Akkor mit csinálunk? Az INSERT kedvéért zároljuk az egész táblát, nehogy két tranzakció ugyanazt a MAX(ID+1-et próbálja beinzertálni. Naggggggggggggggggggyon hatékony!
Egy szó mint száz, lehetett ugyan alkalmazást készíteni a korai SQL Serverrel (és a vele akkoriban még tökéletesen megegyező Sybase-termékkel), de ha mai szemmel ránézünk, egy gány volt az egész. S.T. szavaival élve: fostalicska 