Databßzov² server firmy Informix °ady 7 existuje ji₧ n∞kolik let. Poslednφ verze tΘto °ady 7.3X je dostupnß ji₧ tΘm∞° rok. Je tedy mo₧nΘ ji s jist²m odstupem hodnotit a porovnat s p°edchßzejφcφmi °adami (5 a 6). UrΦit∞ lze °φci, ₧e tato °ada je lepÜφ v mnoha ohledech, mezi kter²mi bych zd∙raznil:
podstatn∞ vylepÜenΘ monitorovßnφ
Na druhΘ stran∞ je t°eba p°iznat, ₧e alespo≥ pro poΦßteΦnφ obdobφ nasazenφ klade vyÜÜφ nßroky na administrativu (p°edevÜφm znalosti administrßtora databßzovΘho serveru v oblasti sprßvy systΘmu - UNIXu) - ovÜem to je p°irozenß da≥ za novou architekturu a vylepÜenφ databßzovΘho serveru.
V nßsledujφcφm textu bych rßd zmφnil Φßst n∞kter²ch nov²ch Φi mΘn∞ znßm²ch (nebo spφÜ nevyu₧φvan²ch) postup∙, kterΘ mohou zkvalitnit aplikace ve v²Üe uveden²ch oblastech. VÜechny p°φklady jsou odzkouÜenΘ v prost°edφ dbaccess na databßzi stores7 anebo sysmaster. Doufßm, ₧e nßsledujφcφ °ßdky budou u₧iteΦnΘ alespo≥ pro n∞kterΘ aplikaΦnφ programßtory (pokud zcela nevyhynuli).
ZaΦneme n∞Φφm jednoduÜÜφm
Chcete-li spojit dva °et∞zce do jedoho bez koncov²ch mezer za prvnφm z nich, vyu₧ijte funkce TRIM a operßtoru z°et∞zenφ (ô||ô) pro nßsledujφcφ v²b∞r:
SELECT TRIM (fname) || ô ô || lname fullname FROM customer;
Funkce TRIM se v²born∞ hodφ takΘ v p°φpad∞, kdy₧ t°eba sklßdßte jmΘna adresß°∙ a soubor∙ ulo₧en²ch v databßzi nebo sestavujete p°φkazovou °ßdku vΦetn∞ argument∙. Bez funkce TRIM by byly tyto po₧adavky v ulo₧en²ch procedurßch ne°eÜitelnΘ.
Databßze sysmaster
Databßze sysmaster je v databßzovΘm systΘmu Informix pom∞rn∞ dlouho. Jejφ nezve°ejn∞n² zßklad obsahovala ji₧ verze 5.X. P°esto se pou₧φvß pom∞rn∞ mßlo, i kdy₧ obsahuje spoustu u₧iteΦn²ch informacφ, kterΘ lze s ·sp∞chem pou₧φt v aplikacφch. Jejφ schΘma (i se struΦn²m popisem) najdete v adresß°i $INFORMIXDIR/etc, pod nßzvem sysmaster.sql. Podrobn∞jÜφ popis n∞kter²ch tabulek a pohled∙ najdete v manußlu INFORMIX-OnLine Dynamic Server AdministratorÆs Guide.
Najdete v nφ t°eba tabulku sysdatabases se seznamem databßzφ, kterΘ jsou v danΘm serveru vytvo°eny, vΦetn∞ jejich vlastnostφ jako je vlastnφk, jmΘno prostoru, ve kterΘm je databßze umφst∞na, datum vytvo°enφ a typ logovßnφ databßze. Pomocφ nßsledujφcφho p°φkazu m∙₧ete ve vlastnφ aplikaci vytvo°it podobn² seznam, jak² poskytuje onmonitor v nabφdce Status/Databases:
SELECT name, (DBINFO (ôdbspaceö, partnum)), created, is_logging, is_buff_log, is_ansi
FROM sysmaster:sysdatabases;
Dßte-li si prßci a napφÜete ulo₧enou proceduru, kterß konvertuje hodnoty ze sloupc∙ is_logging, is_buff_log a is_ansi na k≤dy N, B, U a U*, dostanete v²pis zcela shodn² s onmonitorem. Velmi podobnß je tabulka systabnames, kterß obsahuje seznam vÜech tabulek ve vÜech databßzφch serveru vΦetn∞ Φφsla partnum, kterΘ identifikuje tblspace (adresu ulo₧enφ) tabulky.
Z tabulky sysptnhdr zase m∙₧ete zjistit skuteΦn² poΦet °ßdek v tabulce, i kdy₧ t°eba do nφ prßv∞ te∩ importujete mili≤ny °ßdek a ona je zamΦena. Je t°eba si uv∞domit, ₧e poΦet °ßdek nrows z tabulky systables je aktualizovßn a₧ p°φkazem update statistics, zatφmco poΦet nrows z tabulky sysptnhdr je aktualizovßn pr∙b∞₧n∞. Z tabulky sysptnhdr m∙₧ete rovn∞₧ urΦit celkov² poΦet tabulce p°id∞len²ch strßnek (nptotal) i poΦet skuteΦn∞ pou₧it²ch strßnek (npused). Tabulka sysptnhdr takΘ obsahuje p°φÜtφ p°id∞lenΘ Φφslo do sloupce SERIAL - serialv. UvedenΘ ·daje m∙₧ete jinak zjistit utilitou oncheck (ta se vÜak z aplikace volß podstatn∞ obtφ₧n∞ji):
SELECT T.tabname, T.nrows, H.nrows, H.nptotal, H.npused, H.serialv
FROM systables T, sysmaster:sysptnhdr H
WHERE tabid > 99 AND T.partnum = H.partnum;
KonfiguraΦnφ parametry databßzovΘho serveru lze p°eΦφst z tabulky sysconfig. Nßzev parametru je cf_name, platnß hodnota cf_effective, hodnota parametru p°i startu serveru cf_original a standardnφ hodnota (nenφ-li parametr uveden v $INFORMIXDIR/etc/$ONCONFIG) cf_default:
SELECT cf_name, cf_effective, cf_original, cf_default
FROM sysmaster:sysconfig
Velmi jednoduÜe lze napsat ulo₧enou proceduru, kterß jako vstupnφ argument dostane jmΘno konfiguraΦnφho parametru a vrßtφ jeho platnou hodnotu.
Funkce DBINFO
Funkce DBINFO vßm umo₧nφ p°eΦφst velmi d∙le₧itΘ informace, kterΘ aplikaΦnφm programßtor∙m dlouho chyb∞ly. UrΦit∞ mezi n∞ pat°φ poslednφ Φφslo, kterΘ server p°id∞lil do sloupce typu SERIAL û legitimnφ po₧adavek v ulo₧enΘ procedu°e. Porovnejte c_serial, c_max:
INSERT INTO customer (customer_num, fname, lname) VALUES (0, "Jan", "Sokol");
SELECT DBINFO (ôsqlca.sqlerrd1ö) c_serial, MAX (customer_num) c_max
FROM customer;
Pomocφ funkce DBINFO m∙₧ete takΘ urΦit, kolik °ßdek jste poslednφm p°φkazem SQL zpracovali (vlo₧ili, smazali, opravili). Porovnejte c_before, c_plus a c_after:
SELECT COUNT (*) c_before FROM customer WHERE state = "CO";
UPDATE customer SET state = "CO" WHERE state = "NJ";
SELECT DBINFO ('sqlca.sqlerrd2') c_plus, COUNT (*) c_after
FROM customer WHERE state = "CO";
Funkce DBINFO umo₧≥uje zjistit i jmΘno poΦφtaΦe c_dbhost, na kterΘm b∞₧φ databßzov² server, i typ databßzovΘho serveru vΦetn∞ verze c_ver:
SELECT DBINFO (ôdbhostnameö) c_dbhost, DBINFO (ôversionö, ôfullö) c_ver
FROM systables T WHERE T.tabid = 1;
Typ a verzi databßzovΘho serveru m∙₧ete pomocφ funkce DBINFO vypsat i po Φßstech:
SELECT DBINFO (ôversionö, ôserver-typeö), DBINFO (ôversionö, ômajorö),
DBINFO (ôversionö, ôminorö), DBINFO (ôversionö, ôosö), DBINFO (ôversionö, ôlevelö),
FROM systables T WHERE T.tabid = 1;
Funkce DBINFO a databßze sysmaster
JeÜt∞ zajφmav∞jÜφ informace zφskßte zapojenφm funkce DBINFO p°i Φtenφ sysmaster. K nejd∙le₧it∞jÜφm informacφm, kterΘ DBINFO vracφ, pat°φ sid (session identifier), kter² je vstupnφm klφΦem k administrßtorsk²m (nejenom) informacφm v databßzi sysmaster. Podle tohoto klφΦe m∙₧ete nap°φklad zjistit aktivnφ otev°enou databßzi z tabulky sysopendb (nenφ zve°ejn∞na) vΦetn∞ spousty zajφmav²ch atribut∙ (typ logovßnφ databßze, ·rove≥ izolace proces∙, nßrodnφ prost°edφ, p°φznak v²luΦnΘho otev°enφ databßze):
SELECT * FROM sysmaster:sysopendb
WHERE odb_sessionid = DBINFO (ôsessionidö) AND odb_iscurrent = ôYö;
Z pohledu syssession zase m∙₧ete p°eΦφst login u₧ivatele username, UID klienta, PID klientskΘho procesu (ne pro vzdßlenΘ klienty ve Windows), hostname klienta, jmΘno terminßlu tty (pro znakovΘ klienty):
SELECT sid, username, uid, pid, hostname, tty
FROM sysmaster:syssessions WHERE sid = DBINFO (ôsessionidö);
Pro monitorovßnφ Φasov∞ nßroΦn²ch klientsk²ch program∙ se hodφ tabulka syssesprof. Z tΘto tabulky lze pro aktußlnφ b∞h programu (p°esn∞ji session) p°eΦφst t°eba poΦet Φtenφ isread, zßpis∙ iswrite, oprav isrewrite a mazßnφ isdelete (v tΘto tabulce je spousta dalÜφch zajφmav²ch ·daj∙):
SELECT isreads, iswrites, isrewrites, isdeletes
FROM sysmaster:syssesprof WHERE sid = DBINFO (ôsessionidö);
Funkce DBINFO umo₧nφ pro ka₧dou tabulku urΦit jmΘno dbspace, ve kterΘm je ulo₧ena. Prvnφ p°φkaz urΦφ dbspace pro tabulky aktußlnφ databßze a druh² pro vÜechny tabulky v serveru (a n∞co navφc):
SELECT tabname, DBINFO (ôdbspaceö, partnum)
FROM systables WHERE tabid > 99 AND tabtype =ö'Tö;
SELECT dbsname, tabname, DBINFO (ôdbspaceö, partnum)
FROM sysmaster:systabnames;
Jestli₧e nechcete nebo nem∙₧ete pou₧φt funkci DBINFO, m∙₧ete dbspace pro tabulky urΦit i jin²m zp∙sobem:
SELECT T.tabname, D.name
FROM systables T, sysmaster:sysdbstab D
WHERE T.tabtype = "T" AND T.tabid > 99
AND TRUNC (T.partnum / POW (2, 20)) = D.dbsnum;
Uveden² p°φklad vychßzφ ze vÜeobecn∞ znßmΘ skuteΦnosti, ₧e hornφch 12 bit∙ (z celkov²ch 32) Φφsla tblspace (n∞kdy naz²vanΘ partnum) je Φφslo dbspace, kterΘ se nachßzφ v tabulce sysdbstab.
Pohodln∞jÜφ zpracovßnφ NULL hodnot
Hodnoty NULL v databßzi zt∞₧ujφ programßtor∙m ₧ivot. U₧ jenom proto, ₧e filtr na n∞ se pφÜe jinak ne₧ filtr na ostatnφ hodnoty (IS [NOT] NULL). Funkce NVL umo₧≥uje nahradit hodnotu NULL ve sloupci libovolnΘho typu za n∞jakou vhodnou zarß₧ku, kterou lze v klientskΘm programu nebo ulo₧enΘ procedu°e lΘpe zpracovat:
SELECT fname, lname, NVL (address2, "N/A") FROM customer;
UvedenΘ nßpady tvo°φ jen malou Φßst nov²ch mo₧nostφ aplikaΦnφch programßtor∙. Namßtkou lze jmenovat: