COMPUTERWORLD
pod kapotou
Trigger

DneÜnφ dφl databßzovΘ abecedy je v∞novßn databßzov²m objekt∙m, kterΘ umo₧≥ujφ vyjßd°it procedurßln∞ integritnφ omezenφ (IO). Jak ji₧ je patrnΘ z nßzvu, nebudeme se pokouÜet o ₧ßdnΘ ΦeskΘ p°ijatelnΘ vyjßd°enφ tohoto dnes populßrnφho databßzovΘho pojmu, t°eba₧e se lze setkat s v²razy jako spouÜt∞Φ, spouÜ¥ apod. Co je to vÜak trigger? Jak Φasto zd∙raz≥uji, nejde op∞t o nic p°φliÜ novΘho. Ji₧ v roce 1976 byla koncepce triggeru popsßna ve v²zkumnΘ zprßv∞ IBM Specifications and Interactions of Trigger Subsystem in an Integrated Database System od K.P.Eswarena. Trigger byl popsßn jako ôp°eddefinovanß databßzovß procedura, kterß podmφn∞n∞ nebo nepodmφn∞n∞ automaticky nßsleduje nebo p°edchßzφ jinou databßzovou operaciö. Definice vychßzejφcφ spφÜe z p°ipravovanΘho standardu SQL3 pova₧uje trigger spφÜe za pojmenovan² databßzov² objekt, kter²

  • je implicitn∞ aktivovßn, jestli₧e nastane udßlost podmi≥ujφcφ jeho spuÜt∞nφ,
  • je-li aktivovßn, vyvolß akci, je-li spln∞na danß podmφnka.

PodstatnΘ je pojmenovßnφ triggeru. Je mo₧nΘ se na n∞j odkazovat v hlßÜenφch o chybßch, lze jej zruÜit p°φkazem DROP, v °ad∞ implementacφ lze trigger doΦasn∞ ôumrtvitö a pozd∞ji ôo₧ivitö. Za zd∙razn∞nφ stojφ i automatickß aktivace odrß₧ejφcφ pouze v²skyt jist²ch udßlostφ evokovan²ch u₧ivatelem Φi aplikaΦnφmi programy.

Udßlostφ se myslφ specifickß situace vyskytujφcφ se v databßzovΘm systΘmu, nap°. vstup (INSERT) °ßdku x do tabulky P╪EDSTAVEN═(N┴ZEV, JM╔NO_F). Je-li nap°. spln∞na podmφnka, ₧e x.JM╔NO_F neodpovφdß ₧ßdnΘmu °ßdku z tabulky FILM, lze operaci INSERT vhodnou akcφ odmφtnout. Uveden² p°φklad z°ejm∞ znamenß kontrolu referenΦnφ integrity mezi tabulkou P╪EDSTAVEN═ a FILM. Je patrnΘ, ₧e triggerem lze implementovat mnohem obecn∞jÜφ IO, z°ejm∞ i takovß, kterß nejdou vyjßd°it neprocedurßln∞ na ·rovni konstrukt∙ definice databßze podle standardu SQL92. V²hodou navφc je, ₧e je souΦasn∞ k dispozici mo₧nost definovat akci. Akce je procedura nebo posloupnost procedurßlnφch operacφ, kterß implementuje potencißln∞ netrivißlnφ procesnφ logiku, po₧adovanou aplikacφ. Jestli₧e souΦasnou mo₧nosti referenΦnφ integrity je nap°. kaskßdovΘho odstran∞nφ °ßdk∙, pak akcφ v triggerech lze implementovat slo₧it∞jÜφ procesy. Nap°. zv²Üenφ rozpoΦtu odd∞lenφ (tabulka ODD╠LEN═) m∙₧e triggerem spustit akci, kterß procentußln∞ zv²Üφ odm∞ny jeho zam∞stnanc∙ (tabulka ZAM╠STNANEC). Tento p°φklad odpovφdß zajiÜt∞nφ spφÜe n∞jakΘho pravidla specifikovanΘho aplikacφ (Φasto se hovo°φ o business rules).

Trigger p°edstavuje procedurßlnφ °eÜenφ jist²ch problΘm∙, kterΘ nebylo mo₧nΘ jednoduÜe °eÜit neprocedurßlnφm zp∙sobem. Jde zvlßÜt∞ o to, jak reagovat p°i naruÜenφ IO, kde zatφm SQL92 nabφzφ spφÜe chybovΘ hlßÜenφ nebo jednoduchou akci (nap°. dosazenφ NULL nebo implicitnφ hodnoty). Slo₧it∞jÜφ akce se stßvß souΦßstφ aplikaΦnφho programu, na rozdφl od °eÜenφ s triggerem, kter² ji naopak p°enese k definici databßze. Navφc, vyvolßnφ triggeru nastßvß jindy ne₧ p°i naruÜenφ neprocedurßlnφch IO ve stßvajφcφm SQL.

Pou₧itφ trigger∙

Kontrola integrity databßze Φi zajiÜ¥ovßnφ aplikaΦnφch po₧adavk∙ pomocφ trigger∙ tedy zvyÜuje mo₧nosti danΘ neprocedurßlnφmi konstrukty. Pou₧itφ trigger∙ je ovÜem ÜirÜφ. Lze jimi mimo jinΘ zjiÜ¥ovat:

  • ochranu dat, tj. trigger m∙₧e kontrolovat, zdali u₧ivatel mß prßvo provΘst operaci. V databßzovΘm serveru PROGRESS lze pomocφ triggeru dokonce omezovat data viditelnß pro u₧ivatele, tj. trigger m∙₧e b²t spuÜt∞n p°i operaci SELECT.
  • auditnφ zßznamy, tj. triggerem lze udr₧ovat specißlnφ soubory (₧urnßly) se zßznamy jist²ch operacφ nap°. na citliv²ch datech,
  • aktualizaci pohled∙, kterΘ nemusφ b²t aktualizovatelnΘ na ·rovni standardu SQL92. Tento prvek v sob∞ mß nap°. InterBase. Sprßvce databßze naprogramuje vlastn∞ ôruΦn∞ö aktualizaci pohledu p°φm²m vstupem dat do zdrojov²ch tabulek.
  • replikaci, kde trigger zajiÜ¥uje vytvo°enφ buffer∙ zm∞n replikovan²ch tabulek, kterΘ poslΘze replikaΦnφ server propaguje do cφlov²ch databßzφ.

V²hody trigger∙ zahrnujφ:

  • rychlejÜφ v²voj aplikace (akce provßd∞nΘ triggery jsou vytvo°eny a umφst∞ny jednou, nemusφ b²t k≤dovßny pro ka₧dou aplikaci),
  • globßlnφ provßd∞nφ aplikaΦnφch pravidel (trigger je definovßn jednou a lze ho pou₧φt pro jakoukoli aplikaci, kterß m∞nφ tabulku),
  • jednoduÜÜφ ·dr₧ba aplikaΦnφch pravidel (zm∞na ve sv∞t∞ aplikace vy₧aduje pouze zm∞nu triggeru, nikoliv vφce aplikaΦnφch program∙),
  • centrßlnφ aktivace trigger∙ vyhovuje dob°e architektu°e klient/server, tj. data a operace se zbyteΦn∞ ôneprotahujφö sφtφ.

Specifikace trigger∙

Hlavnφ nev²hodou souΦasn²ch p°φstup∙ ke trigger∙m je v tom, ₧e triggery nebyly nabφdnuty standardem SQL92. Auto°i standardu z°ejm∞ podcenili rostoucφ po₧adavky na pou₧φvßnφ trigger∙. P°itom v systΘmech Sybase, Ingres a Interbase se triggery pou₧φvajφ ji₧ od roku 1989. Volba syntaxe, sΘmantika i implementace trigger∙ se tak staly u jednotliv²ch v²robc∙ S╪BD jist²m problΘmem, ve kterΘm z°ejm∞ nejvhodn∞jÜφ cestou je mo₧nost vyu₧φt ji₧ °adu let znßmΘho nßvrhu p°φstupu k trigger∙m podle p°ipravovanΘho standardu SQL3.

Podle SQL3 jsou udßlosti spouÜt∞jφcφ trigger aktualizaΦnφ operace INSERT, DELETE a UPDATE (bu∩ na vybranΘ sloupce nebo na celou tabulku). Mo₧nost vyu₧φvajφcφ SELECT (viz zmφn∞n² PROGRESS) je tedy nestandardnφ. Podmφnka m∙₧e b²t vyjßd°itelnß jakoukoliv SQL podmφnkou, akce m∙₧e b²t jak²koliv SQL p°φkaz, tj. vyu₧φvajφcφ dokonce procedurßlnφ p°φkazy, tak jak je nabφzφ v SQL3 jazyk pro psanφ transakcφ (SQL/PSM). DalÜφ volbou je Φas aktivace. Trigger m∙₧e b²t aktivovßn p°ed (BEFORE) nebo po (AFTER) aktualizaΦnφ operaci. Akce m∙₧e b²t provedena pro ka₧d² °ßdek (FOR EACH ROW), kter² spl≥uje podmφnku, nebo pouze jednou pro cel² p°φkaz triggeru (FOR EACH STATEMENT). Druhß mo₧nost je implicitnφ. Proto₧e p°i formulaci podmφnky Φi akce triggeru pro UPDATE je Φasto pot°eba odkaz na starou a novou hodnotu, lze pou₧φt klauzuli REFERENCING, kde starou hodnotu (OLD) a novou (NEW) lze vhodn∞ p°ejmenovat s klφΦov²m slovem AS. Nap°. chceme-li m∞nit v tabulce P╪EDSTAVEN═ p°edstavenφ, tj. provßd∞t UPDATE pro jmΘno filmu, lze v t∞le CREATE TRIGGER pou₧φt

REFERENCING OLD AS P┘VODN═

NEW AS NOV▌

Uva₧ujme p°φklad, kdy p°i zm∞n∞ p°edstavenφ (dvojice nßzev kina spolu s filmem) v tabulce P╪EDSTAVEN═ se hlφdß, aby film nebyl od V∞ry ChytilovΘ (stßlφ nßvÜt∞vnφci kina ji nemajφ rßdi). Trigger m∙₧e vypadat nßsledovn∞:

CREATE TRIGGER NE_CHYTIL

BEFORE UPDATE OF FILM ON P╪EDSTAVEN═ /* udßlost * /

REFERENCING OLD AS P┘VODN═

NEW AS NOV▌

WHEN ((SELECT REÄIS╔R /* podmφnka* /

FROM FILM F

WHERE F.JM╔NO_F = NOV▌. JM╔NO_F) = Chytilovß)

CALL_TO_NECHTEJI (ôTento film neö) /* akce * /

Proto₧e SQL/PSM nenφ doposud k dispozici, provßdφ se zßpis akci v jednotliv²ch S╪BD r∙zn∞. Nap°. v ORACLE se pou₧φvß PL/SQL, tj. jazyk z rodiny 4GL jazyk∙. Podobn∞ k problΘmu p°istupuje SYBASE Φi INGRES (spφÜe CA-OpenIngres). V poslednφm p°φpad∞ jsou triggery naz²vßny pravidla (rules). Ta volajφ ulo₧enΘ procedury provßd∞jφcφ akce. P°ipome≥me ale, ₧e koncepce t∞chto pravidel odpovφdß pouze mo₧nosti AFTER.

Implementace trigger∙

Co se t²Φe implementace, mohlo by se zdßt, ₧e trigger je ulo₧enß procedura. V₧dy tomu tak ale nenφ. Nap°. S╪BD ORACLE udr₧uje zdrojovΘ texty trigger∙ v databßzi, p°iΦem₧ ke kompilaci dochßzφ a₧ po prvnφm pou₧itφ triggeru. Naopak, trigger m∙₧e volat ulo₧enou proceduru. Nap°. v Microsoft SQL Severu m∙₧e dokonce jφt o volßnφ vzdßlenΘ procedury (RPC - Remote Procedure Call).

Implementace trigger∙ se takΘ liÜφ v mno₧stvφ, kolik jich je dovoleno na jednu tabulku. Nap°. SQLBase firmy Centura Software Corp. (d°φve Gupta Corp.) povoluje 6 trigger∙ (t°i operace x 2 mo₧nosti aktivace), Microsoft SQL Server povoluje 3 triggery. Obecn∞jÜφ p°φstup v SQL3 ovÜem dovoluje definovat i vφce trigger∙ na jednu udßlost a Φas aktivace. Po°adφ jejich aplikace odpovφdß po°adφ jejich vytvo°enφ v databßzi. Proto₧e trigger m∙₧e zp∙sobit vyvolßnφ dalÜφho triggeru, lze hovo°it o kaskßdßch trigger∙.

V²hody trigger∙ jsou nespornΘ. Bude ovÜem zajφmavΘ, jak se databßzovΘ firmy vyrovnajφ se standardem SQL3. Trigger je velmi siln² mechanismus, jeho₧ pou₧itφ v²razn∞ ovliv≥uje nßvrh IS v architektu°e klient/server. Znamenß op∞t dalÜφ p°esun logiky z aplikace k databßzi.



<seznam dφl∙ serißlu>   <COMPUTERWORLD>