Spúšťač je špeciálny druh uloženej procedúry, ktorá sa vykonáva pri konkrétnych udalostiach v tabuľke. Spúšťač je spojený s konkrétnou tabuľkou a najčastejšie plní ochrannú úlohu pre údaje. V časti 1.5 sme hovorili o integrite údajov a spomenuli sme, že spúšť je najsilnejšia ochrana. Vtedy sme mali málo informácií, a preto sme podrobne zvažovali len obmedzenia a vo vzťahu k spúšťačom sme sa obmedzili na všeobecné slová.

Existujú tri udalosti, na ktoré môžu spúšťače reagovať – pridávanie, zmena a vkladanie údajov, t.j. akýkoľvek pokus o ovplyvnenie údajov. Keď dôjde k pokusu o vloženie, aktualizáciu alebo vymazanie údajov v tabuľke a pre danú akciu je v tejto tabuľke deklarovaný spúšťač, zavolá sa automaticky. Nedá sa to obísť. Na rozdiel od vstavaných procedúr sa spúšťače nedajú volať priamo a neprijímajú ani neprijímajú parametre.

Spúšťače sú najlepším spôsobom, ako zabezpečiť integritu údajov na nízkej úrovni, pričom jedinou nevýhodou je, že sú pomalšie ako obmedzenia. Hlavnou výhodou spúšťačov je, že môžu obsahovať komplexnú spustiteľnú logiku. Môžu:

  • vykonávať kaskádové zmeny v závislých tabuľkách v databáze, čím poskytuje komplexnejšiu integritu údajov ako obmedzenie CHECK;
  • deklarovať jednotlivé chybové hlásenia;
  • obsahovať nenormalizované údaje;
  • porovnať stav údajov pred a po zmene.

Toto sú hlavné výhody a na konci tejto časti uvidíte, že ich je oveľa viac.

Spúšťače môžete použiť na kaskádové zmeny alebo vymazania v závislých databázových tabuľkách. Napríklad spúšťač na vymazanie údajov z tabuľky tpPhoneType môže vymazať zodpovedajúce riadky v iných tabuľkách, ktoré majú riadky spojené s vymazávaným identifikátorom typu telefónu. Ak sa tak nestane, spojenie sa preruší a integrita databázy sa považuje za zničenú.

Na rozdiel od obmedzenia CHECK môžu spúšťače odkazovať na polia v inej tabuľke. Môžete napríklad umiestniť spúšťač pridávania na tabuľku tbPosition, ktorá vyhľadá hlavnú pozíciu pre pridávanú pozíciu a skontroluje, či existuje zamestnanec s príslušnou pozíciou.

3.4.1. Vytvorenie spúšťača

Na vytvorenie spúšťačov použite príkaz CREATE TRIGGER. Príkaz špecifikuje tabuľku, pre ktorú je spúšťač deklarovaný, udalosť, pre ktorú sa spúšťač vykoná, a jednotlivé príkazy spúšťača. Vo všeobecnosti je príkaz uvedený vo výpise 3.2.

Zoznam 3.2. Všeobecný pohľad na príkaz CREATE TRIGGER

CREATE TRIGGER názov_spúšťača ZAPNUTÉ (tabuľka | zobrazenie) [S ŠIFROVANÍM] ((PRE | PO | NAMIESTO ) ([VLOŽIŤ] [, ] [AKTUALIZÁCIA]) [S PRIDANÍM] [NIE JE NA REPLIKÁCIU] AKO [(AK AKTUALIZOVAŤ (stĺpec ) [ ( AND | OR ) AKTUALIZÁCIA (stĺpec) ] [ ...n ] | IF (COLUMNS_UPDATED() (bitový_operátor) aktualizovaná_bitová maska) (operátor_porovnania ) bitová_maska_stĺpca [ ...n ] ) ] príkaz_sql [ ...n ] ) )

Predtým, ako zvážime skutočný príklad, zvážme dve poznámky. Keď vytvoríte spúšťač, informácie o spúšťači sa vložia do systémových tabuliek sysobjects a syscomments. Ak sa vytvorí spúšťač s rovnakým názvom ako existujúci spúšťač, nový spúšťač prepíše existujúci. SQL Server nepodporuje pridávanie spúšťačov deklarovaných používateľom do systémových tabuliek, takže ich nemôžete vytvoriť pre systémové tabuľky.

SQL Server nepovoľuje použitie nasledujúcich príkazov v tele spúšťača:

  • ALTER DATABASE;
  • VYTVORIŤ DATABÁZU;
  • DISK INIT;
  • ZMENA VEĽKOSTI DISKU;
  • DROP DATABASE;
  • NAČÍTAŤ DATABÁZU;
  • LOAD LOG;
  • PREKONFIGURÁCIA;
  • OBNOVIŤ DATABÁZU;
  • OBNOVIŤ ZÁZNAM.

Aby ste si nepamätali všetky tieto vyhlásenia, je ľahšie zapamätať si, že nemôžete meniť štruktúru databázy.

3.4.2. Vrátenie zmien späť v spúšťači

Deklarácia spúšťača môže obsahovať príkaz ROLLBACK TRANSACTION, aj keď neexistuje žiadna zodpovedajúca BEGIN TRANSACTION. Ako sme už povedali, pri akejkoľvek zmene vyžaduje SQL server transakciu. Ak to nie je výslovne uvedené, vytvorí sa implicitná transakcia. Ak sa vykoná príkaz ROLLBACK TRANSACTION, všetky zmeny v spúšťači a zmeny, ktoré spôsobili spustenie spúšťača, sa vrátia späť.

Pri používaní vrátenia by ste mali zvážiť nasledovné:

  • Ak sa spustí príkaz ROLLBACK TRANSACTION, obsah transakcie sa vráti späť. Ak sú po ROLLBACK TRANSACTION príkazy, príkazy sa vykonajú. Toto nemusí byť potrebné pri použití príkazu RETURN;
  • Ak spúšťač vráti transakciu späť, definované užívateľom, potom sa úplne vráti späť. Ak spúšť spustí modul, príkazy pre modul sa tiež zrušia. Následné príkazy modulu sa nevykonajú;
  • Mali by ste minimalizovať použitie ROLLBACK TRANSACTION vo svojom spúšťacom kóde. Vrátenie transakcie vytvára prácu navyše, pretože všetka práca, ktorá nebola dokončená tento moment v transakcii bude neúplná. To bude mať negatívny vplyv na výkon. Spustite transakciu po overení všetkého, takže nemusíte nič v spúšťači vracať.

Pokračujme v štúdiu spúšťačov v praxi. Vytvorme napríklad spúšťač, ktorý iba vráti späť transakciu a nakoniec uvidíme skutočný príklad a to, ako vrátenie funguje:

VYTVORIŤ SPÚŠŤAČ u_tbPeoples NA dbo.tbĽudia NA AKTUALIZÁCIU AKO TRANSAKCIU VRÁTENIA

Všetky akcie som ako vždy rozdelil do riadkov, aby boli lepšie viditeľné a lepšie sa čítali a študovali tému. V prvom riadku za príkazom CREATE TRIGGER je názov. Pri pomenovaní spúšťačov sa riadim nasledujúcim pravidlom:

  • názov začína jedným alebo viacerými písmenami u (aktualizácia), i (vloženie) alebo d (vymazanie). Pomocou týchto písmen môžete ľahko určiť, ktoré akcie sa spúšťajú;
  • za podčiarkovníkom nasleduje názov tabuľky, pre ktorú sa spúšťač vytvára.

Za názvom nasleduje kľúčové slovo ON a názov tabuľky, pre ktorú sa spúšťač vytvára.

Druhý riadok obsahuje kľúčové slovo FOR a udalosť, pri ktorej sa spúšťač spustí. AT tento príklad je špecifikovaná akcia UPDATE, t.j. aktualizovať. A nakoniec po kľúčové slovo AS je telo spúšte, t.j. príkazy, ktoré sa majú vykonať. V tomto príklade sa vykoná len jeden príkaz - ROLLBACK TRANSACTION, t.j. rollback.

Teraz sa pokúsme zmeniť údaje v tabuľke tbPeoples tak, aby sa spúšťač spustil:

AKTUALIZOVAŤ SET tbPeoples vcFamil="dsfg"

V tomto príklade sa pokúšame zmeniť obsah poľa „vcFamil“ pre všetky záznamy v tabuľke tbPeoples. Prečo sa snažíme? Áno, pretože pri zmene spúšťača funguje vrátenie transakcie. Načítajte údaje, aby ste sa uistili, že sú všetky údaje na svojom mieste a nezmenili sa:

VYBERTE * Z tbPeoples

Napriek tomu, že pri aktualizácii údajov sme nespustili transakciu, príkaz ROLLBACK TRANSACTION prebehol bez chýb a zmeny boli zrušené.

3.4.3. Zmeňte spúšťač

Ak chcete zmeniť deklaráciu existujúceho spúšťača, môžete ho zmeniť bez toho, aby ste ho museli odstraňovať a znova vytvárať. V deklarácii spúšťača môžete odkazovať na objekty, ktoré neexistujú. Ak v čase vytvárania reklamy nejaký objekt neexistuje, zobrazí sa vám iba upozornenie.

Príkaz ALTER TRIGGER sa používa na aktualizáciu spúšťača. Celkový pohľad na operátora je uvedený vo výpise 3.3.

Zoznam 3.3. Spustite vyhlásenie o aktualizácii

ALTER TRIGGER názov_spúšťača ON (tabuľka | zobrazenie) [ WITH ENCRYPTION ] ( ( (PRE | PO | NAMIESTO) ( [ VYMAZAŤ ] [ , ] [ VLOŽIŤ ] [ , ] [ AKTUALIZOVAŤ ] ) [ NIE JE NA REPLIKÁCIU ] AKO príkaz_sql [ .. .n ] ) | ( (PRE | PO | NAMIESTO) ( [ VLOŽIŤ ] [ , ] [ AKTUALIZÁCIA ] ) [ NIE JE NA REPLIKÁCIU ] AKO ( AK AKTUALIZÁCIA (stĺpec) [ ( AND | ALEBO ) AKTUALIZÁCIA (stĺpec) ] [ . ..n ] |IF(COLUMNS_UPDATED() ( bitový_operátor ) aktualizovaná_bitová maska) (operátor_porovnania ) bitová_maska_stĺpca [ ...n ] ) príkaz_sql [ ...n ] ) )

Zmeňme náš spúšťač u_tbPeoples tak, aby reagoval aj pri pridávaní záznamov. Aby sme to dosiahli, vykonáme nasledujúci dotaz:

ALTER TRIGGER u_tbPeoples ON dbo.tbPeoples PRE AKTUALIZÁCIU, VLOŽTE AKO TRANSAKCIU VRÁTENIA

Ako vidíte, príkaz na aktualizáciu je podobný vytváraniu spúšťača. Rozdiel je v tom, že prvý riadok obsahuje príkaz ALTER TRIGGER. V druhom riadku došlo k zmene a teraz bude spúšťač fungovať nielen pri aktualizácii (UPDATE), ale aj pri pridávaní (INSERT).

Skúste pridať položku a potom sa uistite, že nie je pridaná, pretože spúšťač vrátenia zmien teraz funguje aj na pridávaní položiek. Príklad pridania záznamu:

INSERT INTO tbPeoples(vcFamil) VALUES("PETECHKIN")

Môžete povoliť alebo zakázať konkrétny spúšťač alebo všetky spúšťače v tabuľke. Keď je spúšťač zakázaný, stále existuje v tabuľke, ale nespustí sa pri zadaných udalostiach. Spúšťač môžete zakázať príkazom ALTER TABLE. Vo všeobecnosti operátor vyzerá takto:

Tabuľka ALTER TABLE (ENABLE | DISABLE) TRIGGER (ALL | trigger_name [,..n])

Ako vidíte, zmena ovplyvňuje samotnú tabuľku, nie spúšťač. Skúsme deaktivovať predtým vytvorený spúšťač:

ALTER TABLE tbPeoples ZAKÁZAŤ TRIGGER u_tbPeoples

Na prvý riadok napíšeme príkaz ALTER TABLE a názov tabuľky, ktorú chceme zmeniť. Druhý riadok musí obsahovať kľúčové slovo DISABLE (zakázať) alebo ENABLE (povoliť) a kľúčové slovo TRIGGER. A nakoniec názov spúšťača.

Skúste teraz pridať príspevok do tabuľky tbPeoples. Tentoraz všetko dobre dopadne.

Namiesto názvu spúšťača môžete zadať kľúčové slovo ALL, ktoré vyžaduje, aby boli ovplyvnené všetky spúšťače v zadanej tabuľke. Napríklad v nasledujúcom príklade povolíme všetky spúšťače:

ALTER TABLE tbĽudia POVOLIŤ SPÚŠŤAŤ VŠETKO

3.4.4. Odstránenie spúšťačov

Na odstránenie spúšťača môžete použiť príkaz DROP TRIGGER. Vymaže sa automaticky, keď sa vymaže tabuľka, ktorá je k nemu priradená.

Príklad odstránenia spúšťača:

DROP TRIGGER u_tbĽudia

Ak chcete vykonať túto akciu, musíte mať príslušné práva. Rovnako ako pri procedúrach, funkciách a objektoch zobrazenia môžete odstrániť viacero spúšťačov naraz zadaním ich názvov oddelených čiarkami.

3.4.5. Ako fungujú spúšťače?

V tejto kapitole sa podrobnejšie pozrieme na to, ako odlišné typy spúšťače. K tomu napíšeme množstvo príkladov, ktoré sa čo najviac približujú realite a zároveň získame dobrú prax v programovaní Transact-SQL a vytváraní spúšťačov.

INSERT spúšťač

Čo sa stane, keď sa spustí spúšťač pridania záznamu? Poďme sa pozrieť na kroky, ktoré server robí:

  • Používateľ vykoná príkaz INSERT na pridanie záznamov;
  • Spúšťač sa nazýva;

V čase, keď bol vyvolaný spúšťač, v databáze ešte neprebehla žiadna fyzická zmena. V tele spúšťača vidíte pridané záznamy ako vloženú tabuľku. Nie, takáto tabuľka v databáze nie je, vložená je logická tabuľka, ktorá obsahuje kópiu riadkov, ktoré sa majú vložiť do tabuľky. Konkrétnejšie obsahuje protokol aktivity príkazu INSERT. Údaje v tejto tabuľke môžete použiť na určenie, ktoré údaje sa majú vložiť. Riadky z vloženej tabuľky vždy duplikujú jeden alebo viac riadkov v tabuľke spúšťačov.

Všetky aktivity modifikácie údajov sa zaznamenávajú, ale informácie v protokole transakcií nie sú čitateľné. Vložená tabuľka vám však umožňuje odkazovať a definovať zmeny.

Vložená tabuľka obsahuje vždy rovnakú štruktúru ako tabuľka, na ktorej je umiestnený spúšťač.

Zakážme používanie spúšťača na pridávanie záznamov, v ktorých sa meno zamestnanca rovná Vasya. Príklad takéhoto spúšťača je možné vidieť vo výpise 3.4.

Výpis 3.4. Pomocou vloženej tabuľky

CREATE TRIGGER i_tbPeoples ON dbo.tbPeoples PRE VLOŽENIE AKO DECLARE @Name varchar(50) SELECT @Name=vcName FROM vložené AK @Name="Vanya" ZAČAŤ TLAČIŤ "CHYBA" VRÁTENIE TRANSAKCIE KONIEC

V tomto príklade vytvárame spúšťač na pridávanie záznamov. Vo vnútri spúšťača deklarujeme premennú @Name typu varchar s dĺžkou 50 znakov. Do tejto premennej uložíme obsah poľa „vcName“ vloženej tabuľky. Ďalej skontrolujeme, či sa meno rovná Vasya, potom nahlásime chybu a vrátime späť transakciu. V opačnom prípade bude riadok úspešne pridaný.

Na konsolidáciu materiálu napíšme spúšťač, ktorý zakáže nulové hodnoty pre pole „vcName“. Kód takéhoto spúšťača je možné vidieť vo výpise 3.5.

VYTVORIŤ SPÚŠŤAČ i_tbPeoples ON dbo.tbĽudia PRE VLOŽENIE, AKO AK EXISTUJE (VYBERTE * FROM vložené, KDE vcName je NULL) ZAČNITE TLAČIŤ „CHYBA, musíte vyplniť pole vcName“ VRÁTENIE TRANSAKCIE KONIEC

V tomto príklade kontrolujeme, či vložená tabuľka obsahuje záznamy s nulová hodnota polia "vcName", potom vrátime späť pokus o pridanie.

DELETE spúšťač

Keď sa spustí spúšťač odstránenia, spustí sa rovnaká logika ako pri pridávaní záznamov:<.p>

  • Používateľ vykoná príkaz DELETE na pridanie záznamov;
  • Server uloží informácie o požiadavke do protokolu transakcií;
  • Spúšťač sa nazýva;
  • Potvrdenie zmien a fyzická zmena údajov.

Vymazané riadky sa umiestnia do odstránenej tabuľky, ktorú môžete použiť na zobrazenie odstránených riadkov. Toto je logická tabuľka, ktorá odkazuje na údaje protokolu príkazu DELETE.

Musíte zvážiť:

  • keď sú riadky pridané do vymazanej tabuľky, stále existujú v tabuľke databázy;
  • pamäť je pridelená pre vymazanú tabuľku, takže je vždy vo vyrovnávacej pamäti;
  • spúšťač vymazania sa nevykoná v operácii TRUNCATE TABLE, pretože táto operácia nie je protokolovaná a nevymaže riadky.

Skúsme vytvoriť spúšťač, ktorý zabráni vymazaniu používateľa s konkrétnym menom. Príklad takéhoto spúšťača je možné vidieť vo výpise 3.6.

Výpis 3.6. Príklad zabránenia odstráneniu pomocou spúšťača

VYTVORIŤ SPÚŠŤAČ d_tbPeoples ON dbo.tbĽudia NA ODSTRÁNIŤ, AKO AK EXISTUJE (VYBERTE * Z odstránené WHERE vcName="rrp") ZAČAŤ TLAČIŤ „CHYBA, tohto používateľa nie je možné odstrániť“ TRANSAKCIA VRÁTENIA KONIEC

V tomto príklade skontrolujeme, či sa v odstránenej tabuľke nachádza položka s názvom „rlr“, a potom vymazanie vrátime späť. Pridajte položku do tabuľky s názvom „rlr“ a skúste ju odstrániť. Ako odpoveď by ste mali vidieť chybu.

Čo ak sa pokúsite odstrániť viacero záznamov? Napríklad nasledujúci príklad vymaže dve položky:

DELETE FROM tbPeoples WHERE vcName="rr" alebo vcName="BASSIL"

Žiadna z nich nebude vymazaná, aj keď zákaz je len na názov „rlr“ a Vasily nespôsobuje konflikty v spúšťači. Celá transakcia je zrušená.

Pozrime sa na ďalší príklad, v ktorom je odvolanie generálneho riaditeľa zakázané. Bez spúšťača to nejde:

VYTVORIŤ SPÚŠŤAČ d_tbPeoples ON dbo.tbĽudia NA VYMAZANIE, AKO AK EXISTUJE (VYBERTE * FROM odstránené WHERE idPosition=1) ZAČAŤ TLAČIŤ „CHYBA, tohto používateľa nie je možné odstrániť“ TRANSAKCIA VRÁTENIA NÁVRAT KONIEC

V tomto príklade je vymazanie položky zakázané, ak sa pole „idPosition“ rovná 1. Skúste položku vymazať takto:

DELETE FROM tbPeoples WHERE idPosition=1

Najzaujímavejšie je, že neuvidíte chybu spúšťača, ale obmedzenia cudzieho kľúča. Generálny riaditeľ má telefónne čísla a záznam nemožno vymazať, ak existuje externé pripojenie, inak bude narušená integrita. To znamená, že sa spúšťa po skontrolovaní všetkých obmedzení CHECK a cudzích kľúčov. Je to celkom logické, pretože obmedzenia fungujú rýchlejšie a je žiaduce ich najskôr skontrolovať. Ak rýchla kontrola dá negatívny výsledok, prečo robiť zložitejšie kontroly v spúšťači.

Platí to nielen pre spúšťače mazania, ale aj pre zmenu a vkladanie, práve sme uvažovali o príklade, pretože sme narazili na zaujímavý dotaz, na ktorom je vhodné ukázať poradie vykonávania v praxi.

spúšťač AKTUALIZÁCIE

Aktualizácia prebieha v dvoch fázach – vymazanie a vloženie. Nie, fyzicky dochádza k zmene v databáze, tento spúšťač má dve fázy. Existujúce riadky sa teda umiestnia do vymazanej tabuľky (teda to, čo bolo) a do vloženej tabuľky sa umiestnia nové údaje. Spúšťač môže skontrolovať tieto tabuľky, aby určil, ktoré riadky sa môžu zmeniť a ako.

Môžete deklarovať spúšťač na monitorovanie aktualizácie špecifického poľa zadaním voľby IF UPDATE. To umožňuje spúšťaču izolovať aktivitu konkrétneho stĺpca. Keď sa zistí aktualizácia konkrétneho stĺpca, spúšťač môže vykonať určité akcie, ako je napríklad vyvolanie chybovej správy, že stĺpec nemožno aktualizovať.

Poďme vytvoriť spúšťač v tabuľke tbPeoples, ktorý zobrazí správu, ak sa pole „vcName“ zmení

VYTVORIŤ SPÚŠŤAČ u_tbPeoples NA dbo.tbĽudia NA AKTUALIZÁCIU, AKO AK AKTUALIZÁCIU (vcName) TLAČIŤ „Dúfam, že ste zadali správne meno“

Za príkazom IF UPDATE sa nachádza pole v zátvorkách, ktoré je potrebné skontrolovať, či nebolo zmenené. Ak áno, vykoná sa príkaz po kontrole. V tomto prípade ide o zobrazenie správy s pomocou PRINT. Keď sa zadané pole nezmení, príkaz sa samozrejme nevykoná. Ak potrebujete vykonať viacero príkazov, skombinujte ich so BEGIN a END.

Nasledujúci dotaz testuje spúšťač:

AKTUALIZOVAŤ SET tbPeoples vcName="IVANUSHKA" WHERE vcFamil="POCHECHKIN"

Uistite sa, že sa zobrazuje správa zo spúšťača.

Pomocou spúšťača sa pokúsime zakázať zmenu polí, ktoré tvoria celé meno ("vcFamil", "vcName" a "vcSurName"). Ak to chcete urobiť, ak sa jedno z týchto polí zmení, zobrazíme na obrazovke správu o zákaze a vrátime transakciu:

VYTVORIŤ SPÚŠŤAČ u_tbĽudia NA dbo.tbĽudia NA AKTUALIZÁCIU, AKO AK AKTUALIZOVAŤ (vcName) ALEBO AKTUALIZOVAŤ (vcFamil) ALEBO AKTUALIZOVAŤ (vcSurname) ZAČAŤ TLAČ

S dotazom, ako je tento, je ľahké zistiť, ako skontrolovať aktualizácie viacerých polí naraz a vygenerovať viacero príkazov. Všimnite si, že kontrolu vykonáva príkaz UPDATE, nie príkaz IF UPDATE. Ani neviem, prečo vývojári SQL Servera spájajú tieto dva výroky. Prvým je logický operátor a druhým je kontrola, či bolo pole aktualizované.

3.4.6. NAMIESTO

V tabuľkách a prehliadačoch môžete zadať spúšťač NAMIESTO OF. Akcie takéhoto spúšťača sa vykonávajú namiesto príkazov, ktoré spúšťač vygenerovali. Nejasné? Zvážte príklad. Povedzme, že na udalosti aktualizácie tabuľky máte MIESTO spúšťača. Ak používateľ vykoná aktualizáciu, spúšťač sa vykoná, ale príkaz spustený používateľom iba vygeneruje udalosť. Samotná aktualizácia údajov by sa mala uskutočniť pomocou spúšťacích príkazov.

Každá tabuľka alebo prehliadač je obmedzený na jeden spúšťač na udalosť. V prehliadači, ktorý má aktivovanú možnosť CHECK OPTIONS, nemôžete vytvoriť spúšťače NAMIESTO OF.

Ako možno použiť INSTEAD OF? Povedzme, že máme objekt zobrazenia, ktorý vyberá údaje z dvoch tabuliek. Ako už vieme, údaje zobrazenia je možné upraviť len vtedy, ak všetky patria do rovnakej tabuľky. Ale pomocou spúšťača môžete aktualizovať ľubovoľný počet tabuliek.

Vytvorme objekt zobrazenia, ktorý vyberie priezvisko zamestnanca a pracovnú pozíciu. Nazvime tento objekt zobrazenia Peoples:

CREATE VIEW People AS SELECT vcFamil, vcPositionName FROM tbPosition ps, tbPeoples pl WHERE ps.idPosition=pl.idPosition

Teraz si na tomto view objekte vytvoríme NAMIESTO spúšť, pomocou ktorej bude možné pridávať záznamy a zároveň budú správne zaregistrované, každý vo svojej tabuľke:

Výpis 3.7. MIESTO spúšťača na vkladanie údajov

CREATE TRIGGER i_People ON dbo.People MIESTO VLOŽENIA AKO BEGIN -- Pridať pozíciu INSERT INTO tbPosition (vcPositionName) SELECT vcPositionName FROM vložené i -- Pridať pracovníka INSERT INTO tbPeoples (vcFamil, SELECTcPosition,iPosition,WREbROM i.vcPositionName=pn.vcPositionName KONIEC

V tomto príklade začínajú zaujímavosti hneď na druhom riadku. Toto špecifikuje príkaz INSTEAD OF a udalosť, na ktorú sa má reagovať. V tomto prípade je udalosťou vloženie (INSERT).

Ako spúšťací kód vykonáme dva SQL dotazy: pridanie pozície zamestnanca a samotného zamestnanca. Prvý dotaz je celkom jednoduchý, pretože je taký jednoduchý ako výber všetkých názvov úloh z vloženej tabuľky a ich vloženie do tabuľky tbPosition. Ale v druhej požiadavke okrem vloženia priezviska zamestnanca musíte nájsť pozíciu a urobiť spojenie, inak nemá zmysel rozbiehať takéto zložité podvody. Tento problém vyriešim takto:

INSERT INTO tbPeoples (vcFamil, idPosition) SELECT vcFamil, idPosition FROM vložené i,tbPosition pn WHERE i.vcPositionName=pn.vcPositionName

Skúste nasledujúci dotaz na pridanie záznamov do objektu zobrazenia:

INSERT INTO People VALUES("IVANUSHKIN", "Clerk")

Spustite nasledujúci dotaz a uistite sa nový vstup pridané:

SELECT * FROM People

Pri aktualizácii tabuľky nastáva jeden problém – musíte priradiť aktualizované údaje k existujúcim. Prvá požiadavka, ktorá vás napadne, je:

AKTUALIZOVAŤ SET tbPosition vcPositionName=i.vcPositionName Z tbPosition pn, vložené i KDE i.vcPositionName = pn.vcPositionName

Tu prepájame tabuľku pozícií s vloženou tabuľkou. Takáto požiadavka však nebude nikdy splnená. prečo? Vložená obsahuje nové hodnoty, zatiaľ čo tbPosition obsahuje staré a názvy úloh nebudú nikdy prepojené. Ak prepojíme odstránenú tabuľku, záznamy budú prepojené, ale nebudeme poznať nové hodnoty, ktoré je potrebné zadať do tabuľky. Problém je možné vyriešiť, ale najlepšou možnosťou by bolo pridať kľúčové polia do objektu zobrazenia:

ALTER VIEW People AS SELECT idPeoples, pl.idPosition, vcFamil, vcPositionName FROM tbPosition ps, tbPeoples pl WHERE ps.idPosition=pl.idPosition

Teraz MIESTO spúšťača na aktualizáciu údajov bude vyzerať ako Výpis 3-8.

Výpis 3.8. Aktualizácia prepojeného zobrazenia pomocou spúšťača

CREATE TRIGGER u_People ON dbo.People NAMIESTO AKTUALIZÁCIE AKO ZAČIATOK AKTUALIZÁCIE tbPosition SET vcPositionName=i.vcPositionName Z tbPosition pn, vložené i WHERE i.idPosition=pn.idPosition vložené AKTUALIZÁCIE plbHEvamit.lbPles .idPeoples=pl.idĽudia KONČÍ

Pred aktualizáciou údajov odporúčam vymazať všetky spúšťače, ktoré sme vytvorili v tejto časti, inak môžu nastať problémy, pretože sme vytvorili niekoľko spúšťačov, ktoré zakazujú aktualizáciu. Skúste teda z úradníka urobiť generálneho riaditeľa:

AKTUALIZÁCIA People SET vcFamil="IVANUSHKIN", vcPositionName="CEO" WHERE idPeoples=40 AND idPosition=13

Takáto aktualizácia nie je ideálna, pretože aktualizáciou názvu pozície jedného zamestnanca sa mení názov pre všetkých zamestnancov tejto pozície. Príručky je potrebné upravovať veľmi opatrne.

Používateľ, ktorý požaduje spúšťač, musí mať tiež povolenie na vykonanie všetkých príkazov v tabuľke. Musíte mať teda práva na aktualizáciu tabuľky zamestnancov a tabuľky pozícií.

3.4.7. Viac o spúšťačoch

Spúšťače môžete použiť na vynútenie komplexnej referenčnej integrity pomocou:

  • Vykonávanie akcií alebo kaskádová aktualizácia alebo odstraňovanie. Referenčná integrita sa môže líšiť pri použití obmedzení FOREIGN KEY a REFERENCE v príkaze CREATE TABLE. Spúšťač je však užitočný na zabezpečenie vykonania potrebných akcií, keď je potrebné vykonať kaskádové vymazanie alebo aktualizácie, pretože spúšťače sú výkonnejšie. Ak na spúšťanej tabuľke existuje obmedzenie, pred spustením spúšťača sa skontroluje. Ak je obmedzenie porušené, spúšťač nefunguje. Ak obmedzenie nefunguje, pomocou spúšťača môžete implementovať komplexnejšie kontroly, ktoré určite zabezpečia, že údaje nenarušia integritu a používateľ zadá iba povolené údaje;
  • Musíte počítať s tým, že do tabuľky je možné vložiť niekoľko riadkov naraz. Mali by ste to vziať do úvahy pri písaní spúšťačov, ako sme to urobili pri vytváraní príkladov pomocou INSTEAD OF;
  • Obmedzenia, pravidlá a predvolené hodnoty môžu byť generované iba štandardom systémové chyby. Ak potrebujete vlastné správy, mali by ste použiť spúšťače.

Pri navrhovaní spúšťačov by ste mali mať na pamäti, že tabuľky môžu mať viacero spúšťačov pre danú akciu. Každý spúšťač môže byť deklarovaný pre niekoľko alebo jednu akciu. Napríklad nasledujúci príklad spracováva dve udalosti INSERT a UPDATE:

VYTVORIŤ SPÚŠŤAČ iu_tbPeoples ON dbo.tbĽudia PRE VLOŽENIE, AKTUALIZOVAŤ AKO akciu

Ak je k jednej akcii priradených niekoľko spúšťačov, takže názvy nie sú v konflikte, môžete k názvu pridať slovo, ktoré bude popisovať akcie, ktoré sa majú vykonať, alebo priradenie.

Vlastník tabuľky môže určiť prvý a posledný spúšťač. Keď je na tabuľku umiestnených viacero spúšťačov, vlastník môže použiť sp_settriggerorder (o tabuľkách uložených systémov si povieme v ďalšej kapitole) na určenie prvého spúšťača, ktorý sa má spustiť, a posledného spúšťača. Poradie ostatných spúšťačov nie je možné nastaviť.

Vlastníci tabuliek nemôžu vytvárať spúšťače pre prehliadače a dočasné tabuľky. Spúšťače však môžu odkazovať na prehliadače a dočasné tabuľky. Spúšťače by nemali vrátiť sady výsledkov, aj keď nie je zakázané niečo vytlačiť pomocou príkazu PRINT, ale mali by ste si byť vedomí toho, že používateľ to uvidí iba vtedy, keď sa transakcia vráti späť. Je teda možné nahlásiť iba chybu, ale nie úspešné vykonanie, aj keď nám to vo väčšine prípadov stačí.

Teraz si povedzme o výkone spúšťačov. Sú dostatočne rýchle, pretože:

  • sú umiestnené na serveri a na ich vykonanie nevyžadujú sieťové volania, pokiaľ nie sú sieťové volania v samotnom spúšťacom kóde;
  • tabuľky Insert a Deleted sa nachádzajú vo vyrovnávacej pamäti, takže prístup k nim je pomerne rýchly, pokiaľ neobsahujú veľa riadkov a prístupy k tabuľkám neobsahujú zložité vzťahy s inými tabuľkami.

Spúšťače používajte iba v prípade potreby. Pokúste sa umiestniť hlavné operácie integrity na obmedzenia. Ak nie je iné východisko, udržujte deklaráciu spúšťacích príkazov čo najjednoduchšie, aby ste zlepšili výkon servera. Pretože spúšťač je súčasťou transakcie, zámky sú držané až do dokončenia transakcie, takže rýchlosť spracovania je tu najdôležitejšia.

3.4.8. Spúšťacie cvičenie

Pozrime sa na pár príkladov na upevnenie vedomostí a zároveň si pozrieme hotové riešenia, ktoré sa vám môžu v budúcnosti hodiť.

Veľmi často je v databázach potrebné ukladať históriu. Na ukladanie zmien si mnohí vyberajú samostatnú tabuľku. Za čo? Hlavná tabuľka bude obsahovať len najnovšie údaje, použije minimálnu veľkosť a vďaka tomu bude vykonaná čo najrýchlejšie. História bude v samostatnej tabuľke a môže byť dokonca uložená v samostatnej tabuľke. skupina súborov, ktorý nám poskytne celkom výkonné funkcie pri rezervovaní dát.

Vytvorme teda spúšťač, ktorý po zmene alebo odstránení riadkov v tabuľke tbPeoples ich skopíruje do tabuľky tbpeoplesHistory. Ak by bol primárny kľúč vo forme jedinečného identifikátora, problém by sa vyriešil takto:

VYTVORIŤ SPÚŠŤAČ ud_tbPeoples ON dbo. tbPeoples PRE AKTUALIZÁCIU, ODSTRÁNIŤ AKO VLOŽIŤ DO tbPeoplesHistory SELECT newid(), del.* FROM Vymazané del

Tabuľka tbPeoplesHistory opakuje tabuľku tbPeoples jedna k jednej, ale má svoj vlastný primárny kľúč, to znamená, že na začiatok štruktúry tbPeoples sme pridali jedno pole. Prečo, keď môžete použiť pole primárneho kľúča hlavnej tabuľky? Faktom je, že tento kľúč je najlepšie ponechať nedotknutý, aby ste mohli kedykoľvek obnoviť spojenie záznamu z histórie s inými tabuľkami v databáze.

V tomto príklade sa obsah tabuľky Deleted skopíruje do tabuľky tbPeoplesHistory. Dotaz je zjednodušený tým, že primárny kľúč je možné vygenerovať pomocou funkcie newid().

Ale v našej úlohe sa primárny kľúč automaticky zvýši a nedá sa vygenerovať. Musíte uviesť všetky polia:

CREATE TRIGGER ud_tbPeoplesHistory NA dbo.tbPeoples PRE AKTUALIZÁCIU, ODSTRÁŇTE AKO VLOŽTE DO tbPeoplesHistory (idPeoples, vcFamil, vcName, vcSurname, idPosition, ddelDateBirthDay*FROMd SELECT del.

Teraz sa pozrime, ako môžeme zabrániť vymazaniu viac ako jedného riadku:

CREATE TRIGGER d_tbPeoples ON dbo.tbPeoples FOR DELETE AS IF (SELECT count(*) FROM delete)>1 ZAČAŤ TLAČ "Nemôžete odstrániť viac ako jeden riadok" TRANSAKCIA VRÁTENIA KONIEC

Akýkoľvek spúšťač môže obsahovať príkazy UPDATE, INSERT alebo DELETE, ktoré ovplyvňujú iné tabuľky, ako sa to stalo v príklade histórie zmien. Keď je vnorenie povolené, spúšťač, ktorý upravuje tabuľku, môže aktivovať (vykonaním operácie aktualizácie na inej tabuľke, ktorá má svoj vlastný spúšťač) ďalší spúšťač, ktorý môže spustiť tretí spúšťač, atď.

Vnorenie je povolené pri inštalácii, ale môžete ho vypnúť a znova povoliť pomocou systémovej procedúry sp_configure. Napríklad nasledujúci príklad zakáže vnorené spúšťače:

sp_configure 'vnorené spúšťače', 0

Spúšťače môžu mať prílohy až do 32 úrovní. Ak dôjde k nejakej spúšťacej slučke, limit bude prekročený. Spúšťač sa preruší a transakcia sa vráti späť.

Vnorený spúšťač sa nebude volať dvakrát v rámci tej istej transakcie, ani sa samotný spúšťač nezavolá ako odpoveď na druhú aktualizáciu tej istej tabuľky. Ak napríklad spúšťač zmení tabuľku, ktorá reťazovo zmení pôvodnú tabuľku, spúšťač sa znova nezavolá.

Ak sa na jednej z úrovní vyskytne chyba, všetky zmeny údajov sa vrátia späť. Všetky vnorené spúšťače sa považujú za jednu transakciu, čo znamená, že počas vykonávania TRANSAKCIE ROLLBACK sa neuložia žiadne zmeny.

Vnorené spúšťače sa ťažko vyvíjajú, pretože vyžadujú komplexný a dobre naplánovaný dizajn. Kaskádová zmena môže zmeniť údaje, ktoré ste nechceli ovplyvniť. Preto je niekedy jednoduchšie deaktivovať vnorené spúšťače.

Akýkoľvek spúšťač môže ovplyvniť iné tabuľky alebo rovnakú tabuľku. Ak je povolená možnosť rekurzívneho volania, spúšťač, ktorý zmení údaje v tabuľke, sa môže znova spustiť. Štandardne je táto možnosť pri vytváraní databázy zakázaná. Túto voľbu môžete povoliť pomocou príkazu ALTER DATABASE. Príklad povolenia rekurzívnych spúšťačov:

ALTER DATABASE FlenovSQLBook SET RECURSIVE_TRIGGERS ON

Ak je možnosť vnorenia zakázaná, potom je zakázaná aj rekurzia, čo je potrebné vždy pamätať.

Môžete tiež vytvoriť rekurzívne odstránenie pomocou spúšťača. Napríklad v nasledujúcom príklade vytvoríme spúšťač, v ktorom sa pri odstránení zamestnanca vymažú aj jeho telefónne čísla, pretože čísla bez zamestnanca v tabuľke jednoducho nie sú potrebné:

VYTVORIŤ SPÚŠŤAČ d_tbPeoples ON dbo.tbĽudia PRE ODSTRAŇOVANIE AKO ODSTRÁNENIE pn Z tbPhoneNumbers pn, vložené i KAM pn.idPeoples=i.idPeoples

Na vykonanie určitých výpočtov je možné použiť spúšťače. Povedzme, že tabuľka tbPeoples by mala obsahovať pole, v ktorom je uložený počet telefónnych čísel. Samozrejme, ide o denormalizáciu údajov, pretože číslo sa dá vždy spočítať, ale nezabudnite, že ide o príklad. Na podporu poľa môžete vytvoriť nasledujúce spúšťače:

  1. Pri pridávaní záznamu do telefónneho stola zvyšujeme hodnotu poľa v tabuľkách zamestnancov;
  2. Pri odstraňovaní telefónneho čísla zmenšujeme hodnoty polí.

Skúste si to sami implementovať, aby ste si upevnili vedomosti a precvičili prácu s SQL dotazmi.

Ak chcete definovať tabuľky so spúšťačom, spustite sp_depends. Ak chcete zobraziť všetky závislosti tabuľky tbPeoples, spustite napríklad nasledujúci príkaz:

EXEC sp_depends "tbPeoples"

Ak chcete zistiť, ktoré spúšťače existujú v konkrétnej tabuľke a aké akcie, spustite sp_helptrigger. Nasledujúci príklad zobrazuje všetky spúšťače, ktoré patria k objektu zobrazenia Ľudia (ak chcete zobraziť spúšťače tabuľky, zadajte jej názov):

EXEC sp_helptrigger Ľudia

Ak chcete zobraziť kód existujúceho spúšťača, použite sp_helptext. Napríklad nasledujúci príkaz vám umožňuje vidieť text spúšťača u_People, ktorý sme vytvorili pre objekt zobrazenia.

spúšťač:

<Определение_триггера>::= (CREATE | ALTER) TRIGGER trigger_name ON (table_name | view_name ) ( ( FOR | AFTER | INSTEAD OF ) ( [ DELETE] [,] [ INSERT] [,] [ UPDATE] ) [ WITH APPEND ] [ NOT FOR REPLIKÁCIA ] AKO príkaz_sql[...n] ) | ( (PRE | PO | NAMIESTO ) ( [,] ) [ S PRILOŽENÍM] [ NIE JE NA REPLIKÁCIU] AS ( AK AKTUALIZOVAŤ(názov_stĺpca) [ (A | ALEBO) AKTUALIZOVAŤ( column_name)] [...n] |IF (COLUMNS_UPDATES()(process_bit_operator) change_mask) (comparison_bit_operator )bit_mask [...n]) sql_operator [...n] ) )

Spúšťač je možné vytvoriť iba v aktuálnej databáze, ale v rámci spúšťača je možné pristupovať k iným databázam vrátane tých, ktoré sa nachádzajú na vzdialenom serveri.

Zvážte priradenie argumentov z CREATE | ALTER TRIGGER .

Názov spúšťača musí byť v rámci databázy jedinečný. Voliteľne môžete zadať meno vlastníka.

Keď zadáte argument WITH ENCRYPTION, server zašifruje spúšťací kód, takže nikto vrátane administrátora k nemu nemôže pristupovať ani ho čítať. Šifrovanie sa často používa na skrytie algoritmov spracovania údajov autora, ktoré sú duševným vlastníctvom programátora alebo obchodným tajomstvom.

Typy spúšťačov

V SQL Server sú dve možnosti, ktoré určujú správanie spúšťačov:

  • PO. Spúšťač sa vykoná po úspešnom vykonaní príkazov, ktoré ho vyvolali. Ak sa príkazy z akéhokoľvek dôvodu nedajú úspešne dokončiť, spúšťač sa nevykoná. Je potrebné poznamenať, že zmeny údajov v dôsledku vykonania požiadavky používateľa a vykonania spúšťača sa vykonávajú v tele jednej transakcie: ak sa spúšťač vráti späť, zmeny používateľa budú tiež odmietnuté. Pre každú operáciu môžete definovať viacero spúšťačov AFTER (INSERT, UPDATE, DELETE). Ak tabuľka obsahuje viacero spúšťačov AFTER, môžete použiť systémovú uloženú procedúru sp_settriggerorder na určenie, ktorý z nich sa vykoná ako prvý a ktorý ako posledný. V predvolenom nastavení sú všetky spúšťače na serveri SQL Server AFTER spúšťače.
  • NAMIESTO . Spúšťač sa volá namiesto vykonávania príkazov. Na rozdiel od spúšťača AFTER je možné definovať spúšťač NAMIESTO OF v tabuľke aj v zobrazení. Pre každú operáciu INSERT , UPDATE , DELETE je možné definovať iba jeden spúšťač INSTEAD OF.

Spúšťače sa líšia typom príkazov, na ktoré reagujú.

Existujú tri typy spúšťačov:

  • INSERT TRIGGER – Spustí sa pri pokuse o vloženie údajov pomocou príkazu INSERT.
  • UPDATE TRIGGER – spustí sa pri pokuse o zmenu údajov pomocou príkazu UPDATE.
  • DELETE TRIGGER – spustí sa pri pokuse o vymazanie údajov pomocou príkazu DELETE.

Konštrukcie [DELETE][,][INSERT][,][UPDATE] a PRE | po | NAMIESTO ) ( [,] určiť, na ktorý príkaz bude spúšť reagovať. Pri vytváraní je potrebné zadať aspoň jeden príkaz. Povolený vytvorenie spúšťača, ktorý reaguje na dva alebo všetky tri príkazy.

Argument WITH APPEND vám umožňuje vytvoriť viacero spúšťačov každého typu.

O vytvorenie spúšťača s argumentom NOT FOR REPLICATION je zakázané spustenie, kým sa tabuľky upravujú replikačnými mechanizmami.

Konštrukcia AS sql_operator[...n] definuje množinu SQL príkazov a príkazov, ktoré sa vykonajú pri spustení spúšťača.

Všimnite si, že v rámci spúšťača nie je povolených niekoľko operácií, ako napríklad:

  • vytváranie, úprava a mazanie databázy;
  • obnovenie zálohy databázy alebo protokolu transakcií.

Tieto príkazy nie sú povolené, pretože ich nemožno vrátiť späť, ak sa transakcia, ktorá spúšťa spúšťač, vráti späť. Tento zákaz pravdepodobne žiadnym spôsobom neovplyvní funkčnosť vytvorených spúšťačov. Je ťažké nájsť takú situáciu, keď napríklad po zmene riadku tabuľky potrebujete obnoviť záložnú kópiu protokolu transakcií.

Spúšťacie programovanie

Pri vykonávaní príkazov na pridávanie, úpravu a odstraňovanie záznamov server vytvorí dve špeciálne tabuľky: vložené a vymazané. Obsahujú zoznamy riadkov, ktoré budú vložené alebo odstránené na konci transakcie. Štruktúra vložených a vymazaných tabuliek je totožná so štruktúrou tabuliek, na ktorých je definovaný spúšťač. Každý spúšťač vytvára svoju vlastnú množinu vložených a odstránených tabuliek, takže k nim nemá prístup žiadny iný spúšťač. V závislosti od typu operácie, ktorá spôsobila spustenie spúšťača, sa obsah vložených a odstránených tabuliek môže líšiť:

  • príkaz INSERT - vložená tabuľka obsahuje všetky riadky, ktoré sa používateľ pokúša vložiť do tabuľky; v odstránenej tabuľke nebude žiadny riadok; po dokončení spúšťača sa všetky riadky z vloženej tabuľky presunú do zdrojovej tabuľky;
  • príkaz DELETE - vymazaná tabuľka bude obsahovať všetky riadky, ktoré sa používateľ pokúsi vymazať; spúšťač môže skontrolovať každý riadok a určiť, či je povolené jeho vymazanie; vo vloženej tabuľke nebude riadok;
  • Príkaz UPDATE - po vykonaní vymazaná tabuľka obsahuje staré hodnoty riadkov, ktoré sa po úspešnom dokončení vymažú

Na internete je už veľa článkov o spúšťačoch sql, ale pridám ešte jeden s adekvátnymi príkladmi, aby som upevnil materiál pre tých, ktorí sú „informovaní“ a aby lepšie porozumeli materiálu pre tých, ktorí práve začali pochopiť „zen sql“. Zároveň vytvorím diskusiu k téme.

Hneď musím povedať, že môj názor je len môj názor, niekedy je veľmi kategorický. Z viacerých dôvodov musíte pracovať s vysoko zaťaženými stránkami a zložitými webovými aplikáciami.

Z práce na nich sme získali jednu cennú skúsenosť – sledovanie priorít a štatistík. Čo to znamená? Je to jednoduché: ak máte blog a má 2-3-4-10012 miliónov návštevníkov denne a články sa napíšu len 1-2-3-3435-krát denne (rádovo menej ako počet zobrazení) , potom môže byť rýchlosť uloženia článku (a jeho zložitosť) v pomere k rýchlosti zobrazenia článku úmerne nižšia. Čím viac zobrazujeme, tým je kritickejšie zobrazenie, a nie zachovanie článku/stránky/tabuľky. Čo neznamená, že môžete relaxovať. Uloženie článku za 3-5-10 sekúnd na blogu je v medziach primeranosti, no vygenerovanie stránky za viac ako 2 sekundy (+ kým sa načítajú skripty a štýly s obrázkami) je na hranici „aká pomalá stránky, prečítam si niečo iné“ , a ešte horšie „idem si to kúpiť inde.“

Ak vezmeme priemernú stránku s anketou / karmou, komentármi, počítadlom zobrazení stránky atď., mnohým vývojárom okamžite napadnú konštrukcie ako SELECT count(*) FROM comment WHERE comment.page=page_id. Dobre si pre každý článok vyrátajte súčet hodnotení, súčet komentárov. A na hlavnej stránke máme 10 článkov z každej sekcie. Pri návštevnosti 10 ľudí za sekundu si na priemernom VPS môžete dovoliť 60-100 dotazov na sql na stránku (ahoj, Bitrix).

Ale do čerta s textami (už som to asi pochopil). Holé údaje:

tabuľka blogu

VYTVORIŤ TABUĽKU, AK NEEXISTUJE `blog` (`id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(128) NOT NULL, `text` text NOT NULL, `creation` datetime NOT NULL, `modification` datetime NOT NULL , `img` varchar(128) NOT NULL DEFAULT "default.png", `status` tinyint(4) NOT NULL DEFAULT "2", `user_id` int(11) NOT NULL, `rate` int(11) NOT NULL , `relax_type` tinyint(4) NOT NULL, `times` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `contest` tinyint(1) NOT NULL DEFAULT "0", `views` int(11) NOT NULL DEFAULT "0", `komentár ` int(11) NOT NULL, `url` varchar(128) NOT NULL, PRIMÁRNY KĽÚČ (`id`), UNIQUE KEY `url` (`url`), KEY `country_id` (`country_id`), KEY `user_id ` (`user_id`), KEY `stav` (`stav`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1456435 ;

tabuľku komentárov

VYTVORIŤ TABUĽKU, AK NEEXISTUJE `komentáre` (`názov_vlastníka` varchar(50) NOT NULL, `owner_id` int(12) NOT NULL, `id` int(12) NOT NULL AUTO_INCREMENT, `parent_id` int(12) DEFAULT NULL, `user_id` int(12) DEFAULT NULL, `text` text, `creation` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `status` int(1) NOT NULL DEFAULT "0", PRIMARY KEY (`id`), KEY `owner_name` ( `názov_vlastníka`,`ID_vlastníka`), KĽÚČ `id_rodiča` (`id_rodiča`)) ENGINE=MYISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=243254252 ;

Ako vidíte, v tabuľke blogu má každý článok počítadlo komentárov (pole komentárov).
Jednoduchá prax:
1. Pridaný komentár – zvýšenie počítadla blogu
2. Vymazaný/skrytý komentár – zmenšenie počítadla.
Robiť to v kóde je pohodlné a známe, ale existuje pohodlnejší nástroj - spúšťače.

A tak tu máme 2 udalosti (v skutočnosti 3): vytvorenie komentára a jeho vymazanie (treťou udalosťou je zmena jeho stavu („zmazanie“, zákaz atď.).
Zvážte iba vytvorenie a odstránenie a zmenu stavu nechajte ako domácu úlohu.

Príklad má jednu vlastnosť: komentáre môžu byť pre niekoľko typov článkov.

Vytvorenie komentára:

VYTVORIŤ SPÚŠŤAČ `add_count_comment` PO VLOŽENÍ `komentárov` PRE KAŽDÝ RIADOK ZAČIATOK osobný účet spočítaj koľko komentárov napísal AKTUALIZÁCIA SET používateľa user.countcomment= user.countcomment+1 WHERE user.id = NEW.user_id; // určiť, na čo sa komentár vzťahuje, a okamžite zvýšiť počítadlo v týchto tabuľkách PRÍPAD NOVÝ.`owner_name` KEĎ "Blog" TAK AKTUALIZOVAŤ `blog` SET `blog`.`comment` = `blog`.`comment`+1 WHERE `blog `.id = NEW.`owner_id` ; KEĎ "Článok" TAK AKTUALIZUJTE `článok` NASTAVTE `článok`.`komentár` = `článok`.`komentár`+1 WHERE `článok`.`id` = NOVÉ.`id_vlastníka` ; KEĎ "PopulatePlace" THEN UPDATE `populate_place` SET `populate_place`.`comment` = `populate_place`.`comment`+1 WHERE `populate_place`.`id` = NEW.`owner_id` ; KONCOVÝ PRÍPAD; // tu si uľahčíme prácu s news feedmi // hneď napíšeme url článku, aby sme POTOM nemuseli vyberať zbytočný CASE NEW.`owner_name` KEĎ "Blog" POTOM NASTAVÍME userurl = (SELECT url FROM `blog` WHERE `blog`. id=NEW.`owner_id`); WHEN "Article" THEN SET userurl = (SELECT url FROM `article` WHERE article.id=NEW.`owner_id`); KEĎ "PopulatePlace" THEN SET userurl = ``; KONCOVÝ PRÍPAD; // názov článku napíšte ihneď, aby ste nevybrali THEN CASE NEW.`owner_name` WHEN "Blog" THEN SET usertitle = (vyberte názov z `blog` kde blog.id=NEW.`owner_id`); WHEN "Článok" THEN SET usertitle = (vyberte názov z `článku`, kde article.id=NEW.`id_vlastníka`); KEĎ "PopulatePlace" THEN SET usertitle = ` `; KONCOVÝ PRÍPAD; INSERT INTO user_has_events VALUES (NEW.user_id,NEW.id,"Comments",NOW(),userrurl , usertitle); KONIEC

Podobne odstránenie komentára:

VYTVORIŤ TRIGGER `del_count_comment` PO VYMAZANÍ `komentárov` PRE KAŽDÝ RIADOK ZAČAŤ AKTUALIZOVAŤ SET používateľa user.countcomment= user.countcomment -1 WHERE user.id = OLD.user_id; CASE OLD.`owner_name` WHEN "Blog" THEN UPDATE `blog` SET `blog`.`comment` = `blog`.`comment`-1 WHERE `blog`.`id` = OLD.`owner_id` ; KEĎ "Článok" TAK AKTUALIZUJTE `článok` SET `článok`.`komentár` = `článok`.`komentár`-1 WHERE `článok`.`id` = STARÝ.`id_vlastníka` ; KEĎ "PopulatePlace" THEN UPDATE `populate_place` SET `populate_place`.`comment` = `populate_place`.`comment`-1 WHERE `populate_place`.`id` = OLD.`owner_id` ; KONCOVÝ PRÍPAD; KONIEC

A čo sme teda dostali:
1. Pri vkladaní komentára sme pomocou sql servera automaticky vypočítali súčet komentárov pre konkrétny komentujúci objekt (článok, stránka, poznámka)
2. Vytvorili sme informačný kanál (ahojte všetkým sociálnym sieťam atď.)
3. Pri odstraňovaní komentára odpočítavame všetky údaje.
4. Nepoužili sme rámcové nástroje.
5. Výber všetkých potrebných údajov je rýchly (iba 1 požiadavka pri zobrazení stránky, s výnimkou ostatných „ľavých“ údajov na nej.)

A máme tiež sfingu, ktorá pravidelne vyberá články, ktoré sa v poslednej chvíli zmenili. Na tento účel má blog pole na úpravu.

Pridaný spúšťač:

CREATE TRIGGER `ins_blog` PRED VLOŽENÍM NA `blog` // urobte vloženie času pred uložením informácií "nahradením" údajov. PRE KAŽDÝ RIADOK ZAČIATOK NASTAVIŤ NOVÝ.úprava = TERAZ(); KONIEC

Teraz, výberom na poslednú chvíľu, získame všetky dokumenty, ktoré boli pridané na poslednú chvíľu.

VYTVORIŤ SPÚŠŤAČ `ins_blog` PRED AKTUALIZÁCIOU NA `blogu` // vloží čas pred uložením informácií „nahradením“ údajov. PRE KAŽDÝ RIADOK ZAČIATOK NASTAVIŤ NOVÝ.úprava = TERAZ(); KONIEC

Keď sa údaje zmenia, aktualizujeme aj index vyhľadávania.

Zvyčajne sa v priemernom projekte prenesie všetko, čo sa dá preniesť na stranu servera SQL. Samotný sql server vykonáva takéto operácie rýchlejšie as menšími zdrojmi, ako je možné vykonať pomocou použitého programovacieho jazyka.

UPD: Holivar venovaný účelnosti skomplikovať štruktúru databázy je vyhlásený za otvorený.

333 163

Predchádzajúca syntax sa vzťahuje len na spúšťače DML. Spúšťače DDL majú mierne odlišnú formu syntaxe, ktorá bude uvedená neskôr.

Tu parameter schema_name špecifikuje názov schémy, do ktorej patrí spúšťač, a parameter trigger_name určuje názov spúšťača. Parameter table_name určuje názov tabuľky, pre ktorú sa vytvára spúšťač. (Podporované sú aj spúšťače v zobrazeniach, ako to naznačuje prítomnosť parametra view_name.)

Môžete tiež nastaviť typ spúšťača pomocou dvoch ďalšie možnosti: PO a MIESTO. ( Parameter FOR je synonymom parametra AFTER.) spúšťače typu AFTER sa volajú po vykonaní akcie, ktorá spúšťa spúšť, a MIESTO spúšťačov typu sa vykonajú namiesto akcie, ktorá spustí spúšť. Spúšťače AFTER je možné vytvoriť iba v tabuľkách a spúšťače INSTEAD OF je možné vytvoriť v tabuľkách aj zobrazeniach.

Parametre INSERT, UPDATE a DELETE určujú akciu spúšťača. Akcia spúšťača je príkaz Transact-SQL, ktorý spúšťa spúšťač. Akákoľvek kombinácia týchto troch pokynov je povolená. Príkaz DELETE nie je povolený, ak je použitá voľba IF UPDATE.

Ako môžete vidieť v syntaxi príkazu CREATE TRIGGER, akcia(y) spúšťača je špecifikovaná v špecifikácii AS sql_statement.

Databázový stroj vám umožňuje vytvoriť viacero spúšťačov pre každú tabuľku a pre každú akciu (INSERT, UPDATE a DELETE). V predvolenom nastavení neexistuje žiadny konkrétny príkaz na vykonanie viacerých spúšťačov pre danú modifikujúcu akciu.

Iba vlastník databázy, správcovia DDL a vlastník tabuľky, na ktorej je definovaný spúšťač, môžu vytvárať spúšťače pre aktuálnu databázu. (Na rozdiel od povolení pre iné typy príkazu CREATE toto povolenie nemožno odovzdať.)

Zmena štruktúry spúšťača

Tento príkaz podporuje aj jazyk Transact-SQL ALTER TRIGGER, ktorý upravuje štruktúru spúšte. Táto inštrukcia sa zvyčajne používa na zmenu tela spúšťača. Všetky klauzuly a parametre príkazu ALTER TRIGGER majú rovnaký význam ako klauzuly a parametre príkazu CREATE TRIGGER s rovnakým názvom.

Ak chcete odstrániť spúšťače v aktuálnej databáze, použite príkaz DROP SPÚŠŤ.

Používanie odstránených a vložených virtuálnych tabuliek

Keď vytvoríte akciu spúšťača, zvyčajne musíte určiť, či sa vzťahuje na hodnotu stĺpca pred alebo po jej zmene akciou, ktorá spúšťa spúšťač. Z tohto dôvodu sa na testovanie účinku príkazu, ktorý spúšťa spúšťač, používajú dve špeciálne pomenované virtuálne tabuľky:

    vymazané - obsahuje kópie riadkov vymazaných z tabuľky;

    vložené - obsahuje kópie riadkov vložených do tabuľky.

Štruktúra týchto tabuliek je ekvivalentná štruktúre tabuľky, na ktorej je definovaný spúšťač.

tabuľka vymazaná sa používa, keď je v príkaze CREATE TRIGGER špecifikovaná klauzula DELETE alebo UPDATE, a ak je v tomto príkaze špecifikovaná klauzula INSERT alebo UPDATE, použije sa vložená tabuľka. To znamená, že pre každý príkaz DELETE vykonaný v spúšťacej akcii sa vytvorí vymazaná tabuľka. Podobne pre každý príkaz INSERT vykonaný v spúšťacej akcii sa vytvorí vložená tabuľka.

S príkazom UPDATE sa zaobchádza ako s príkazom DELETE, za ktorým nasleduje príkaz INSERT. Preto sa pre každý príkaz UPDATE vykonaný v spúšťacej akcii vytvorí vymazaná tabuľka aj vložená tabuľka (v tomto poradí).

Vložené a odstránené tabuľky sa implementujú pomocou spravovania verzií riadkov, o ktorých sa hovorí v predchádzajúcom článku. Keď sa vykoná príkaz DML (INSERT, UPDATE alebo DELETE) v tabuľke s príslušnými spúšťačmi, verzie riadkov sa vždy vygenerujú pre všetky zmeny v tejto tabuľke. Keď spúšťač potrebuje informácie z vymazanej tabuľky, pristupuje k údajom v úložisku verzie riadkov. V prípade vloženej tabuľky sa spúšťač pozrie na najnovšie verzie riadkov.

Nástroj na vytváranie verzií riadkov používa systémovú databázu tempdb ako úložisko verzií riadkov. Z tohto dôvodu, ak databáza obsahuje veľké množstvo často používaných spúšťačov, mali by ste očakávať výrazné zvýšenie objemu tohto systémová základňaúdajov.

Rozsah spúšťačov DML

Takéto spúšťače sa používajú na riešenie rôznych problémov. V tejto časti sa pozrieme na niekoľko použití spúšťačov DML, najmä PO spúšťačoch a NAMIESTO PO spúšťačoch.

Spúšťa sa PO

Ako už viete, spúšťače AFTER sa volajú po vykonaní akcie, ktorá spúšťa spúšťač. Spúšťač AFTER sa špecifikuje pomocou kľúčového slova AFTER alebo FOR. Spúšťače AFTER je možné vytvoriť iba na základných tabuľkách. Spúšťače tohto typu možno použiť okrem iného na vykonávanie nasledujúcich operácií:

    vytváranie denníka denníkov aktivít v databázových tabuľkách;

    implementácia obchodných pravidiel;

    presadzovanie referenčnej integrity.

Vytvorte denník denníka

V SQL Server môžete vykonávať zachytávanie zmien údajov pomocou systému CDC (change data capture). Tento problém môžete vyriešiť aj pomocou spúšťačov DML. Nižšie uvedený príklad ukazuje, ako možno použiť spúšťače na vytvorenie protokolu protokolov aktivít v databázových tabuľkách:

USE SampleDb; /* Tabuľka AuditBudget sa používa ako protokol aktivít v tabuľke Project */ GO CREATE TABLE AuditBudget (ProjectNumber CHAR(4) NULL, UserName CHAR(16) NULL, Date DATETIME NULL, BudgetOld FLOAT NULL, BudgetNew FLOAT NULL); GO CREATE TRIGGER trigger_ModifyBudget ON Project PO AKTUALIZÁCII AKO AK AKTUALIZOVAŤ (rozpočet) ZAČAŤ DECLARE @budgetOld FLOAT DECLARE @budgetNový FLOAT DECLARE @projectNumber CHAR(4) SELECT @budgetStarý = (SELECT Budget FROM odstránený) SELECT @rozpočet vložený) = (SELECT Budget FROM SELECT @projectNumber = (SELECT číslo FROM odstránené) INSERT INTO AuditBudget VALUES (@projectNumber, USER_NAME(), GETDATE(), @budgetStarý, @budgetNew) KONIEC

Tento príklad vytvorí tabuľku AuditBudget, ktorá uloží všetky zmeny do stĺpca Rozpočet tabuľky projektu. Zmeny v tomto stĺpci budú zapísané do tejto tabuľky pomocou trigger_ModifyBudget.

Tento spúšťač sa spustí pri každej zmene stĺpca Rozpočet pomocou príkazu UPDATE. Keď sa tento spúšťač spustí, hodnoty riadkov v odstránených a vložených tabuľkách sa priradia zodpovedajúcim premenným @budgetOld, @budgetNew a @projectNumber. Tieto priradené hodnoty spolu s užívateľským menom a aktuálny dátum, sa potom vloží do tabuľky AuditBudget.

Tento príklad predpokladá, že naraz sa bude aktualizovať iba jeden riadok. Preto je tento príklad zjednodušením všeobecného prípadu, keď spúšťač spracováva viacriadkové aktualizácie. Ak spustíte nasledujúce príkazy Transact-SQL:

potom bude obsah tabuľky AuditBudget takýto:

Implementácia obchodných pravidiel

Spúšťače možno použiť na vytvorenie obchodných pravidiel pre aplikácie. Vytvorenie takéhoto spúšťača je znázornené v príklade nižšie:

USE SampleDb; -- Trigger_TotalBudget je príkladom použitia spúšťača na implementáciu obchodného pravidla GO CREATE TRIGGER trigger_TotalBudget ON Project AFTER UPDATE AS IF UPDATE (Rozpočet) ZAČAŤ DECLARE @sum_old1 FLOAT DECLARE @sum_old2 FLOAT DECLARE @sum_new FLOAT_new SELECT @sum ( Rozpočet) FROM vložený) SELECT @sum_old1 = (SELECT SUM(p.Rozpočet) FROM projektu p WHERE p.Number NOT IN (SELECT d.Number FROM vymazané d)) SELECT @sum_old2 = (SELECT SUM(Rozpočet) FROM odstránené) IF @sum_new > (@sum_old1 + @sum_old2) * 1.5 ZAČAŤ TLAČIŤ „Rozpočet nezmenený“ TRANSAKCIA VRÁTENIA NÁVRAT KONIEC ELSE VYTLAČIŤ „Zmena rozpočtu dokončená“ END

Tu vytvoríte pravidlo na kontrolu úpravy rozpočtov projektov. Spúšťač trigger_TotalBudget skontroluje každú zmenu rozpočtu a vykoná iba príkazy UPDATE, ktoré zvýšia súčet všetkých rozpočtov maximálne o 50 %. V opačnom prípade sa príkaz UPDATE vráti späť prostredníctvom príkazu ROLLBACK TRANSACTION.

Presadzovanie obmedzení integrity

Systémy správy databáz používajú dva typy obmedzení na zabezpečenie integrity údajov: deklaratívne obmedzenia, ktoré sú definované pomocou jazykových príkazov CREATE TABLE a ALTER TABLE; obmedzenia procedurálnej integrity, ktoré sú implementované prostredníctvom spúšťačov.

V normálnych situáciách by ste mali používať deklaratívne obmedzenia integrity, pretože sú podporované systémom a používateľ ich nemusí implementovať. Spúšťače sa odporúčajú iba v prípadoch, keď neexistujú žiadne deklaratívne obmedzenia integrity.

Nasledujúci príklad ukazuje, ako vynútiť referenčnú integritu pomocou spúšťačov v tabuľkách Employee a Works_on:

USE SampleDb; GO CREATE TRIGGER trigger_WorksonIntegrity ON Works_on PO VLOŽENÍ, AKTUALIZÁCIA AKO AK AKTUALIZÁCIA(EmpId) BEGIN IF (SELECT Employee.Id FROM Employee, vložené WHERE Employee.Id = insert.EmpId) JE NULL BEGIN RELLBACK TRANSACTION PRINT/RINT KONIEC ELSE TLAČ "Riadok bol vložený/upravený" KONIEC

Spúšťač trigger_WorksonIntegrity v tomto príklade kontroluje referenčnú integritu pre tabuľky Employee a Works_on. To znamená, že každá zmena v stĺpci Id v referenčnej tabuľke Works_on je kontrolovaná a každé porušenie tohto obmedzenia zabráni vykonaniu operácie. (To isté platí pre vkladanie nových hodnôt do stĺpca Id.) Príkaz ROLLBACK TRANSACTION v druhom bloku BEGIN vráti späť príkaz INSERT alebo UPDATE, ak je porušené obmedzenie referenčnej integrity.

V tomto príklade spúšťač kontroluje problémy s referenčnou integritou prvého a druhého prípadu medzi tabuľkami Employee a Works_on. A príklad nižšie ukazuje spúšťač, ktorý kontroluje problémy s referenčnou integritou v treťom a štvrtom prípade medzi rovnakými tabuľkami (o týchto prípadoch sa diskutovalo v článku Transact-SQL – Vytváranie tabuliek):

USE SampleDb; GO CREATE TRIGGER trigger_RefintWorkson2 ON Zamestnanec PO DELETE, AKTUALIZÁCIA AKO AK AKTUALIZÁCIA (Id) BEGIN IF (SELECT COUNT(*) FROM Works_on, vymazané WHERE Works_on.EmpId = delete.Id) > 0 ZAČAŤ TRANSAKCIU VRÁTENIA VRÁTENIA VYTLAČIŤ/upravený riadok nebol vložený " KONIEC ELSE TLAČ "Riadok bol vložený/upravený" KONIEC

MIESTO spúšťačov

Spúšťač ponuky NAMIESTO nahradí príslušnú akciu, ktorá ho spustila. Tento spúšťač sa spustí po vytvorení zodpovedajúcich vložených a odstránených tabuliek, ale pred vykonaním kontroly obmedzenia integrity alebo akejkoľvek inej akcie.

Spúšťače INSTEAD OF je možné vytvoriť na tabuľkách aj zobrazeniach. Keď príkaz Transact-SQL odkazuje na pohľad, ktorý má definovaný spúšťač INSTEAD OF, databázový systém vykoná tento spúšťač namiesto toho, aby vykonal akúkoľvek akciu na akejkoľvek tabuľke. Tento typ spúšťača vždy používa informácie vo vložených a vymazaných tabuľkách vytvorených pre zobrazenie na generovanie akýchkoľvek príkazov potrebných na vygenerovanie požadovanej udalosti.

Hodnoty stĺpca poskytnuté spúšťačom NAMIESTO OF musia spĺňať určité požiadavky:

    hodnoty sa nedajú nastaviť pre vypočítané stĺpce;

    hodnoty sa nedajú nastaviť pre stĺpce s dátovým typom časovej pečiatky;

    hodnoty sa nedajú nastaviť pre stĺpce s vlastnosťou IDENTITY, pokiaľ nie je IDENTITY_INSERT nastavené na ON.

Tieto požiadavky sú platné len pre príkazy INSERT a UPDATE, ktoré odkazujú na podkladové tabuľky. Príkaz INSERT, ktorý odkazuje na zobrazenia so spúšťačom INSTEAD OF, musí poskytovať hodnoty pre všetky stĺpce v tomto zobrazení bez možnosti null. (To isté platí pre príkaz UPDATE. Príkaz UPDATE, ktorý odkazuje na zobrazenie so spúšťačom INSTEAD OF, musí poskytovať hodnoty pre všetky stĺpce zobrazenia bez možnosti null, na ktoré odkazuje klauzula SET.)

Nižšie uvedený príklad ukazuje rozdiel v správaní pri vkladaní hodnôt do vypočítaných stĺpcov pomocou tabuľky a jej zodpovedajúceho zobrazenia:

USE SampleDb; VYTVORIŤ TABUĽKU Objednávky (ID objednávky INT NIE JE NULL, Cena PENIAZE NIE JE NULL, Množstvo INT NIE JE NULL, Dátum objednávky DÁTUM ČAS NIE JE NULL, Celkom AKO Cena * Množstvo, Dátum odoslania AKO DATEADD(DEŇ, 7, dátum objednávky)); GO CREATE VIEW view_AllOrders AS SELECT * FROM Orders; GO CREATE TRIGGER trigger_orders ON view_AllOrders NAMIESTO VLOŽIŤ AKO ZAČAŤ INSERT INTO OrderI SELECT OrderId, Price, Quantity, OrderDate FROM inserted END

Tento príklad používa tabuľku Objednávky, ktorá obsahuje dva vypočítané stĺpce. View_AllOrders obsahuje všetky riadky v tejto tabuľke. Toto zobrazenie sa používa na nastavenie hodnoty v jeho stĺpci, ktorá sa mapuje na vypočítaný stĺpec v základnej tabuľke, na ktorej je zobrazenie vytvorené. To vám umožňuje použiť spúšťač INSTEAD OF, ktorý je v prípade príkazu INSERT nahradený dávkou, ktorá vkladá hodnoty do základnej tabuľky prostredníctvom zobrazenia view_AllOrders. (Príkaz INSERT, ktorý priamo pristupuje k základnej tabuľke, nemôže nastaviť hodnotu do vypočítaného stĺpca.)

prvý a posledný spúšťač

Databázový stroj vám umožňuje vytvoriť viacero spúšťačov pre každú tabuľku alebo zobrazenie a pre každú operáciu (INSERT, UPDATE a DELETE) na nich. Okrem toho môžete zadať poradie vykonania pre viacero spúšťačov definovaných pre konkrétnu operáciu. Pomocou systémového postupu sp_settriggerorder môžete určiť, že jeden zo spúšťačov AFTER definovaných pre tabuľku sa vykoná prvý alebo posledný pre každú spracovanú akciu. Táto systémová procedúra má parameter @order, ktorý možno nastaviť na jednu z troch hodnôt:

    prvý – označuje, že spúšťač je prvým PO spustení na úpravu akcie;

    posledný označuje, že tento spúšťač je posledným spúšťačom AFTER, ktorý sa spustí na spustenie akcie;

    žiadny – znamená, že pre spúšťač neexistuje žiadny konkrétny príkaz na vykonanie. (Táto hodnota sa zvyčajne používa na resetovanie predtým nastaveného poradia spúšťania na prvé alebo posledné.)

Zmena štruktúry spúšťača pomocou príkazu ALTER TRIGGER obráti poradie vykonávania spúšťača (prvé alebo posledné). Použitie systémovej procedúry sp_settriggerorder je znázornené v príklade nižšie:

USE SampleDb; EXEC sp_settriggerorder @triggername = "trigger_ModifyBudget", @order = "first", @stmttype="update"

Na stole je povolený iba jeden prvý a iba jeden posledný PO spustení. Zostávajúce spúšťače AFTER sa vykonajú v nešpecifikovanom poradí. Poradie vykonania spúšťača zistíte pomocou systémovej procedúry sp_helptrigger alebo funkcie OBJECTPROPERTY.

Sada výsledkov vrátená systémovou procedúrou sp_helptrigger obsahuje stĺpec poradia, ktorý určuje poradie, v ktorom sa zadaný spúšťač vykoná. Keď sa volá funkcia objectproperty, jej druhý parameter je buď ExeclsFirstTrigger alebo ExeclsLastTrigger a jej prvý parameter je vždy identifikačné číslo databázový objekt. Ak je vlastnosť špecifikovaná v druhom parametri pravdivá, funkcia vráti 1.

Pretože spúšťač INSTEAD OF sa vykoná pred vykonaním zmien v jeho tabuľke, nemôžete zadať "prvé" alebo "posledné" poradie spustenia pre spúšťače tohto typu.

Spúšťače DDL a ich použitie

Predtým sme sa pozreli na spúšťače DML, ktoré špecifikujú akciu, ktorú má server vykonať, keď je tabuľka upravená príkazmi INSERT, UPDATE alebo DELETE. Database Engine vám tiež umožňuje definovať spúšťače pre príkazy DDL, ako napríklad CREATE DATABASE, DROP TABLE a ALTER TABLE. Spúšťače pre príkazy DDL majú nasledujúcu syntax:

CREATE TRIGGER trigger_name ON (ALL SERVER | DATABASE ) (FOR | AFTER ) ( event_group | event_type | LOGON) AS (dávka | EXTERNAL NAME Method_name) Konvencie syntaxe

Ako môžete vidieť z ich syntaxe, spúšťače DDL sa vytvárajú rovnakým spôsobom ako spúšťače DML. A na úpravu a odstránenie týchto spúšťačov použite rovnaké príkazy ALTER TRIGGER a DROP TRIGGER ako pre spúšťače DML. Preto táto časť pojednáva len o možnostiach CREATE TRIGGER, ktoré sú nové v syntaxi spúšťača DDL.

Prvým krokom pri definovaní spúšťača DDL je špecifikácia jeho rozsahu. klauzula DATABASEšpecifikuje aktuálnu databázu ako rozsah spúšťača DDL a ponuka VŠETKÝ SERVER- aktuálny server.

Po zadaní rozsahu spúšťača DDL musíte určiť, ako sa spúšťač spustí v reakcii na vykonanie jedného alebo viacerých príkazov DDL. Parameter event_type určuje príkaz DDL, ktorý spúšťa spúšťač, a alternatívny parameter event_group určuje skupinu udalostí Transact-SQL. Spúšťač DDL sa spustí po vykonaní akejkoľvek udalosti Transact-SQL špecifikovanej v parametri event_group. Kľúčové slovo PRIHLÁSIŤ SA určuje spúšťač prihlásenia.

Okrem podobnosti medzi spúšťačmi DML a DDL existuje medzi nimi aj niekoľko rozdielov. Hlavný rozdiel medzi týmito dvoma druhmi spúšťačov je v tom, že spúšťač DDL môže mať rozsah na celú databázu alebo dokonca celý server, nie len samostatný objekt. Okrem toho spúšťače DDL nepodporujú spúšťače MIESTO. Ako ste možno uhádli, spúšťače DDL nevyžadujú vložené a vymazané tabuľky, pretože tieto spúšťače nemenia obsah tabuliek.

Nasledujúce podsekcie podrobne uvádzajú dve formy spúšťačov DDL: spúšťače na úrovni databázy a spúšťače na úrovni servera.

Spúšťače DDL na úrovni databázy

Nasledujúci príklad ukazuje, ako môžete implementovať spúšťač DDL, ktorého rozsah je v aktuálnej databáze:

USE SampleDb; GO CREATE TRIGGER trigger_PreventDrop ON DATABASE FOR DROP_TRIGGER AS PRINT "Skôr ako budete môcť spustiť spúšťač, musíte vypnúť "trigger_PreventDrop"" ROLLBACK

Spúšťač v tomto príklade bráni každému používateľovi vymazať akýkoľvek spúšťač pre databázu SampleDb. Klauzula DATABASE určuje, že spúšťač trigger_PreventDrop je spúšťačom na úrovni databázy. Kľúčové slovo DROP_TRIGGER určuje preddefinovaný typ udalosti, ktorý zabraňuje vymazaniu spúšťača.

Spúšťače DDL na úrovni servera

Spúšťače na úrovni servera reagujú na udalosti servera. Spúšťač na úrovni servera sa vytvorí pomocou klauzuly ALL SERVER v príkaze CREATE TRIGGER. V závislosti od akcie vykonanej spúšťačom sú dve odlišné typy spúšťače na úrovni servera: normálne spúšťače DDL a spúšťače prihlásenia. Bežné DDL spúšťa spustenie na základe udalostí príkazu DDL, zatiaľ čo prihlásenie spúšťa spustenie na základe udalostí prihlásenia.

Nasledujúci príklad ukazuje, ako vytvoriť spúšťač na úrovni servera, ktorý je spúšťačom prihlásenia:

USEmaster; GO VYTVORIŤ PRIHLÁSENIE loginTest WITH PASSWORD = "12345!", CHECK_EXPIRATION = ON; PREJSŤ GRANT ZOBRAZIŤ STAV SERVERA PRIHLÁSENIETest; GO CREATE TRIGGER trigger_ConnectionLimit NA VŠETKÝCH SERVEROCH S VYKONANÍM AKO "loginTest" PRE PRIHLÁSENIE AKO ZAČIATOK IF ORIGINAL_LOGIN()= "loginTest" AND (SELECT COUNT(*) ZO sys.dm_exec_sessions WHERE is_user_process) >login1 ROLLBACK = originalname ; KONIEC;

Tu sa najprv vytvorí prihlásenie SQL Server loginTest, ktoré sa potom použije v spúšťači na úrovni servera. Z tohto dôvodu si toto prihlásenie vyžaduje povolenie VIEW SERVER STATE, ktoré sa mu udeľuje prostredníctvom príkazu GRANT. Potom sa vytvorí trigger_ConnectionLimit. Tento spúšťač je spúšťačom prihlásenia, ako naznačuje kľúčové slovo LOGON.

S pomocou pohľadu sys.dm_exec_sessions vykoná sa kontrola, či už bola vytvorená relácia pomocou prihlásenia loginTest. Ak už bola relácia vytvorená, vykoná sa príkaz ROLLBACK. Preto prihlásenie loginTest môže vytvoriť naraz iba jednu reláciu.

Spúšťače a CLR

Podobne ako uložené procedúry a používateľom definované funkcie, spúšťače možno implementovať pomocou Common Language Runtime (CLR). Spúšťače v CLR sa vytvárajú v troch krokoch:

    Zdrojový kód spúšťača je generovaný v jazyku C# resp Visual Basic, ktorý sa následne skompiluje pomocou príslušného kompilátora do objektového kódu.

    Objektový kód je spracovaný príkazom CREATE ASSEMBLY na vytvorenie zodpovedajúceho spustiteľného súboru.

    Príkaz CREATE TRIGGER vytvorí spúšťač.

Nasledujúce príklady ukazujú, ako dokončiť všetky tri kroky vytvorenia spúšťača CLR. Nižšie je uvedený príklad zdrojový kód C# programy pre spúšťač z prvého príkladu v článku. Pred vytvorením spúšťača CLR v nasledujúcich príkladoch musíte najskôr odstrániť spúšťač trigger_PreventDrop a potom odstrániť spúšťač trigger_ModifyBudget pomocou príkazu DROP TRIGGER v oboch prípadoch.

Používanie systému; pomocou System.Data.SqlClient; pomocou Microsoft.SqlServer.Server; public class Triggers ( public static void ModifyBudget() ( SqlTriggerContext context = SqlContext.TriggerContext; if (context.IsUpdatedColumn(2)) // Stĺpec rozpočtu ( float budget_old; float budget_new; string project_number; SqlConnection conn = new SqlConnection("context connection) =true"); conn.Open(); SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = "SELECT Budget FROM DELETED"; budget_old = (float)Convert.ToDouble(cmd.ExecuteScalar()); cmd.CommandText = "SELECT Budget FROM INSERTED"; budget_new = (float)Convert.ToDouble(cmd.ExecuteScalar()); cmd.CommandText = "SELECT Number FROM DELETED"; project_number = Convert.ToString(cmd.ExecuteScalar()); cmd. CommandText = @"INSERT INTO AuditBudget (@projectNumber, USER_NAME(), GETDATE(), @budgetStarý, @budgetNew)"; cmd.Parameters.AddWithValue("@projectNumber", project_number); cmd.Parameters.AddWithValue("@budgetO ", budget_old); cmd.Parameters.AddWithValue("@budgetNew", budget_new); cmd.ExecuteNonQuery(); ) ) )

Priestor názvov Microsoft.SQLServer.Server obsahuje všetky triedy klientov, ktoré môže program v jazyku C# potrebovať. triedy SqlTriggerContext a SqlFunction sú členmi tohto menného priestoru. Okrem toho priestor názvov System.Data.SqlClient obsahuje triedy SqlConnection a SqlCommand, ktoré sa používajú na vytvorenie spojenia a interakcie medzi klientom a databázovým serverom. Pripojenie sa vytvorí pomocou pripájacieho reťazca "context connection = true".

Potom je definovaná trieda Triggers, ktorá sa používa na implementáciu spúšťačov. Metóda ModifyBudget() implementuje spúšťač s rovnakým názvom. Kontextová inštancia triedy SqlTriggerContext umožňuje programu prístup k virtuálnej tabuľke vytvorenej pri spustení spúšťača. V tejto tabuľke sú uložené údaje, ktoré spôsobili spustenie spúšťača. Metóda IsUpdatedColumn() triedy SqlTriggerContext vám oznámi, či bol zadaný stĺpec tabuľky aktualizovaný.

Tento program obsahuje ďalšie dve dôležité triedy: SqlConnection a SqlCommand. Inštancia triedy SqlConnection sa zvyčajne používa na vytvorenie pripojenia k databáze, zatiaľ čo inštancia triedy SqlCommand vám umožňuje vykonávať príkazy SQL.

Program v tomto príklade je možné skompilovať pomocou kompilátora csc, ktorý je v ňom zabudovaný vizuálne štúdio. Ďalším krokom je pridanie odkazu na zostavenú zostavu v databáze:

USE SampleDb; PREJDITE VYTVORIŤ MONTÁŽ CLRStoredProcedures Z "D:\Projects\CLRStoredProcedures\bin\Debug\CLRStoredProcedures.dll" S POVOLANÍM_SET = BEZPEČNÉ

Príkaz CREATE ASSEMBLY berie ako vstup riadený kód a vytvára príslušný objekt, z ktorého sa vytvorí spúšťač CLR. Klauzula WITH PERMISSION_SET v príklade označuje, že prístupové povolenia sú nastavené na SAFE.

Nakoniec, v nižšie uvedenom príklade je trigger_modify_budget vytvorený pomocou príkazu CREATE TRIGGER:

USE SampleDb; PO AKTUALIZÁCII AKO EXTERNÝ NÁZOV CLRStoredProcedures.Triggers.ModifyBudget PREJSŤ VYTVORIŤ TRIGGER trigger_modify_budget ON Project

Príkaz CREATE TRIGGER v príklade sa líši od rovnakého príkazu v predchádzajúcich príkladoch tým, že obsahuje Parameter EXTERNÉHO NÁZOV. Táto možnosť určuje, že kód generuje CLR. Názov v tomto parametri pozostáva z troch častí. Prvá časť je názov zodpovedajúceho zhromaždenia (CLRStoredProcedures), druhá časť je názov verejnej triedy definovanej v príklade vyššie (Triggers) a tretia časť je názov metódy definovanej v tejto triede (ModifyBudget) .

Spúšť Databáza je špeciálne pomenovaný blok PL/SQL uložený v databáze. Každý spúšťač je spojený s konkrétnou tabuľkou a server ORACLE ho automaticky spustí, keď sa v tejto tabuľke vykoná jeden z príkazov DML (INSERT, DELETE, UPDATE) alebo ich kombinácia.

Priradenie spúšťačov. Je možné použiť spúšťače:

1) implementovať komplexné obmedzenia integrity údajov, ktoré nemožno implementovať štandardným spôsobom pri vytváraní tabuľky;

2) predchádzanie nesprávnym transakciám;

3) implementácia postupov komplexného overovania prístupových práv a utajenia údajov;

4) generovanie niektorých výrazov na základe hodnôt dostupných v stĺpcoch tabuliek;

5) implementácia komplexných obchodných pravidiel pre spracovanie údajov (možnosť sledovať "echo", t. j. možnosť aktualizovať údaje tabuliek s ním spojených pri zmene jednej tabuľky).

Vytváranie a povoľovanie spúšťačov. Na vytvorenie a automatický štart spúšťač, platí nasledujúca všeobecná syntax:

CREATE TRIGGER názov spúšťača

(PRED | PO)

(VLOŽIŤ | VYMAZAŤ | AKTUALIZOVAŤ )

ON table_name

< PL/SQL_блок >

V prítomnosti kľúčových slov OR REPLACE sa spúšťač znova vytvorí, ak už existuje.

PRED | AFTER indikuje, kedy bola spúšť spustená. Možnosť PRED znamená, že spúšťač sa spustí pred vykonaním aktivačného príkazu DML; voľba AFTER znamená, že spúšťač sa spustí po vykonaní aktivačného príkazu DML.

VLOŽIŤ | VYMAZAŤ | UPDATE určuje typ príkazu DML, ktorý aktivuje spúšťač. Povolené používanie logická operácia ALEBO zadajte množinu aktivačných príkazov, napríklad: INSERT OR DELETE. Ak je pri použití voľby UPDATE zadaný zoznam stĺpcov, spúšťač sa spustí pri aktualizácii jedného zo zadaných stĺpcov; ak neexistuje zoznam stĺpcov, spúšťač sa spustí, keď sa zmení ktorýkoľvek zo stĺpcov tabuľky priradenej k spúšťaču.

Konštrukt FOR EACH ROW označuje povahu spúšťacej akcie: reťazec alebo operátor. Ak je prítomný konštrukt FOR EACH ROW, potom je spúšťač reťazcový spúšťač; v jeho neprítomnosti je spúšťačom operátor. Spúšťač príkazu sa spustí raz pred alebo po vykonaní príkazu DML, ktorý aktivuje spúšťač, bez ohľadu na to, koľko riadkov v tabuľke priradenej k spúšťaču sa zmení. Riadkový spúšťač sa spustí raz pre každý riadok, ktorý je upravený príkazom DML, ktorý spúšťa spúšťač.

Pomocou kľúčového slova WHEN môžete nastaviť ďalšie obmedzenie pre riadky tabuľky súvisiace so spúšťačom, po úprave ktorých sa spúšťač môže spustiť.

Konštrukcia PL/SQL_block predstavuje blok PL/SQL, ktorý server ORACLE spustí, keď sa spustí spúšťač.

Klasifikácia spúšťačov. V podstate existuje dvanásť typov spúšťačov. Typ spúšťača je určený kombináciou nasledujúcich troch parametrov:

1) povaha vplyvu spúšťača na riadky tabuľky, ktoré sú s ním spojené (reťazec alebo operátor);

2) okamih spustenia spúšťača: pred (PRED) alebo po (PO) vykonaní príkazu DML aktivujúceho spúšťač;

3) typ príkazu DML, ktorý aktivuje spúšťač (INSERT, DELETE, UPDATE);

Poradie aktivácie spúšťačov. Ak má tabuľka niekoľko typov spúšťačov, aktivujú sa podľa nasledujúcej schémy:

1) vykoná sa spúšťač príkazu BEFORE (ak ich je niekoľko, potom sa nedá nič povedať o poradí, v akom sa vykonávajú);

2) vykoná sa spúšťač BEFORE string;

3) vykoná sa príkaz DML, ktorý aktivuje spúšťač, po ktorom nasleduje kontrola všetkých obmedzení integrity údajov;

4) vykoná sa spúšťač reťazca AFTER, po ktorom nasleduje kontrola všetkých obmedzení integrity údajov;

5) vykoná sa spúšťač príkazu AFTER.

spúšťacie predikáty. Ak spúšťač špecifikuje množinu príkazov DML aktivujúcich spúšťač (napríklad INSERT OR DELETE), potom na rozpoznanie, ktorý konkrétny príkaz DML sa vykoná v tabuľke spojenej so spúšťačom, sa použijú predikáty spúšťača: INSERTING, DELETING, UPDATING. Sú to boolovské funkcie, ktoré vracajú TRUE, ak je typ aktivačného operátora rovnaký ako typ predikátu, a inak FALSE. Ak chcete zadať rovnaké akcie, keď sa v podmienenom príkaze vykonajú rôzne príkazy DML, predikáty spúšťača sa kombinujú pomocou logických operácií.

Pseudozáznamy. Pre reťazcové spúšťače existujú špeciálne konštrukcie, ktoré umožňujú pri vykonávaní operátorov DML v riadku tabuľky prístup k starým hodnotám, ktoré v ňom boli pred úpravou, ako aj k novým, ktoré sa objavia v riadku po jeho úprave. Tieto konštrukcie sa nazývajú pseudozáznamy a označujú sa ako staré a nové. Štruktúra týchto pseudozáznamov je zhodná so štruktúrou upraveného riadku tabuľky, ale možno obsluhovať len jednotlivé polia pseudozáznamu. K poliam pseudozáznamov sa pristupuje podľa nasledujúcej schémy: pred starý alebo nový sa umiestni symbol „:“, potom je názov poľa označený bodkou. Hodnoty, ktoré polia pseudozáznamov nadobudnú pri vykonávaní povolení DML, sú definované nasledovne.

Príkaz INSERT - :new pseudo-záznam je ekvivalentný vloženému riadku a :starý pseudo-záznam vo všetkých poliach je NULL.

Príkaz DELETE - :starý pseudozáznam je ekvivalentný riadku, ktorý sa odstraňuje, a :nový pseudozáznam vo všetkých poliach má hodnotu NULL.

Príkaz UPDATE - :new pseudo-záznam je ekvivalentný reťazcu, ktorý je výsledkom aktualizácie, a :starý pseudo-záznam vo všetkých poliach má pôvodnú hodnotu reťazca.

Povoliť, zakázať spúšťače. Spúšťač uložený v databáze je možné dočasne deaktivovať bez jeho odstránenia z databázy. Používa sa na to nasledujúci príkaz:

ALTER TRIGGER názov_spúšťača DISABLE;

Pomocou príkazu môžete po určitom čase zapnúť spúšť

ALTER TRIGGER názov_spúšťača ENABLE;

Pomocou príkazu môžete zakázať alebo povoliť spustenie všetkých spúšťačov spojených s určitou tabuľkou

ALTER TABLE názov_tabuľky (DISABLE | ENABLE) VŠETKY TRIGGERS;

kde DISABLE sa používa na zakázanie a ENABLE sa používa na povolenie všetkých spúšťačov v tabuľke.

Odstránenie spúšťačov z databázy. Zničenie spúšťača, t. j. vymazanie spúšťača z databázy, sa vykonáva pomocou nasledujúceho príkazu:

DROP TRIGGER názov_spúšťača;

Získanie informácií o spúšťačoch. Spúšťače sú uložené v databáze, takže informácie o nich možno získať z pohľadu dátového slovníka USER_TRIGGERS, napríklad pomocou nasledujúceho príkazu:

SELECT * FROM USER_TRIGGERS;

Príklady.

1. Vytvorte spúšťač, ktorý pred vložením ďalšieho riadku do tabuľky KNIGA_POSTAVKA skontroluje prítomnosť špecifikovaný kód knihy v tabuľke KNIGA. Ak v tabuľke KNIGA chýba zadaný kód knihy, mala by sa vygenerovať výnimka s vydaním príslušnej správy.

Pridávanie nových riadkov do tabuľky KNIGA_POSTAVKA sa vykonáva príkazom INSERT. Pretože spúšťač sa musí spustiť pred vykonaním každého príkazu INSERT, musí to byť reťazec BEFORE trigger. Pre zachovanie integrity údajov je potrebné skontrolovať, či zadané kódy kníh sú aj v tabuľke KNIGA. Na tento účel sa pomocou jednoriadkového príkazu SELECT vyberú informácie z tabuľky KNIGA, kde sa v podmienke výberu použije pole pseudo-record_BOOK_CODE: new. Ak je počet riadkov s daným kódom knihy v tabuľke KNIGA nula, bude vyvolaná výnimka a príslušná správa.

Vytvorenie spúšťača TR1 sa vykonáva zadaním nasledujúceho príkazu:

VYTVORTE ALEBO VYMEŇTE SPÚŠŤAČ TR1

PRED VLOŽENÍM NA KNIGA_POSTAVKA

VYBERTE POČET (*) DO KOL Z KNIGA

WHERE BOOK_CODE = :NEW.BOOK_CODE;

AK KOL = 0 TAK RAISE_APPLICATION_ERROR

(–20212 „V ​​tabuľke KNIGA nie sú žiadne informácie o tejto knihe“);

Účinok spúšťača TR1 je možné overiť vykonaním nasledujúceho príkazu, ktorý vloží riadok do tabuľky KNIGA_POSTAVKA a tým spôsobí spustenie spúšťača TR2:

INSERT INTO KNIGA_POSTAVKA VALUES(21;15;'Ivanov';15,

Keďže kód knihy 15 nie je v tabuľke KNIGA, bude vyvolaná výnimka a bude vydaná príslušná správa.

2. Vytvorte spúšťač, ktorý zakáže zadávanie riadkov s hodnotou poľa PRICE vyššou ako 5 000 rubľov do tabuľky KNIGA, ako aj zvýšenie ceny kníh, o ktorých sú informácie uložené v tabuľke KNIGA, o viac ako 20%. V prípade porušenia túto požiadavku výnimka by mala byť vyvolaná s príslušnou správou.

Keďže v dôsledku príkazu INSERT sa do tabuľky KNIGA pridávajú nové riadky a hodnota poľa PRICE v tabuľke KNIGA, ktorá obsahuje cenu knihy, sa môže zmeniť v dôsledku príkazu UPDATE, množina spúšťacích príkazov DML je špecifikovaný v spúšťači. Pretože spúšťač sa musí spustiť pred vykonaním každého zo zadaných príkazov DML, ide teda o reťazec PRED spúšťačom. Keďže akcie vykonávané spúšťačom sú rôzne pre každý zo spúšťacích príkazov DML, ktoré upravujú tabuľku KNIGA, na rozpoznanie typu príkazu DML sa používajú zodpovedajúce predikáty spúšťača INSERTING a UPDAITING. Pretože vkladanie nových riadkov musí overiť novú hodnotu poľa PRICE a úprava hodnoty poľa PRICE musí porovnať novú hodnotu so starou hodnotou, musia sa použiť pseudozáznamy :new a :old.

Vytvorenie spúšťača TR2 sa vykonáva zadaním nasledujúceho príkazu:

VYTVORTE ALEBO VYMEŇTE SPÚŠŤAČ TR2

PRED VLOŽENÍM ALEBO AKTUALIZÁCIOU CENY ON KNIGA

AK VKLADAŤ TAK

AK:NEW.CENA > 5000 TAK

RAISE_APPLICATION_ERROR

(–20102, "Nemôžete robiť záznamy s účtovnou cenou > 5000 v tabuľke KNIGA");

AK AKTUALIZUJETE POTOM

AK:NEW.PRICE > :STARÁ.CENA*1,2 TAK

RAISE_APPLICATION_ERROR

(–20103, "V tabuľke KNIGA nemôžete zmeniť cenu knihy o viac ako 20 %");

Činnosť spúšťača TR2 je možné skontrolovať vykonaním nasledujúcich príkazov, ktoré vložením riadkov do tabuľky KNIGA a aktualizáciou riadkov v tabuľke KNIGA spôsobia jej aktiváciu.

Príkaz na vkladanie riadkov do tabuľky KNIGA spôsobujúci aktiváciu spúšťača TR2:

INSERT INTO KNIGA VALUES(21; "Duna"; "Herbert"; 5268; "Ast",

"Fiction");

Operátor na aktualizáciu riadkov v tabuľke KNIGA spôsobujúci aktiváciu spúšťača TR2:

AKTUALIZÁCIA SÚPRAVY KNIGA CENA=6000;

Keďže tieto vyhlásenia porušujú požiadavky na hodnotu a úpravu ceny kníh, vo všetkých prípadoch bude vyhlásená výnimka a bude vydaná príslušná správa.

3. Vytvorte spúšťač, ktorý do vytvorenej STAT tabuľky obsahujúcej stĺpce:

názov vydavateľstva - IZD,

počet kníh v žánri "román" - KOL_ROM,

počet kníh v žánri "Fantasy" - KOL_FAN,

pri každej úprave tabuľky KNIGA vygeneruje a zapíše do príslušných stĺpcov tabuľky STAT celkový počet kníh pre každého z vydavateľov v kontexte zadaných tém: „Román“ a „Sci-fi“.

Tabuľka KNIGA sa upraví vykonaním nasledujúcich príkazov DML: INSERT, DELETE alebo príkaz UPDATE, ktorý upraví hodnoty stĺpca GENRE v tabuľke KNIGA. Keďže akcie na vytvorenie informácií tabuľky STAT sa vykonávajú po vykonaní každého z príkazov upravujúcich tabuľku KNIGA, potom podľa typu ide o operátor AFTER spúšťač. Keďže akcie vykonávané spúšťačom sú rovnaké pre všetky typy príkazov, ktoré ho aktivujú, nepoužívajú sa žiadne predikáty spúšťača. Pred vytvorením spúšťača je potrebné vytvoriť tabuľku STAT.

Tabuľku STAT možno vytvoriť zadaním nasledujúcej sady príkazov:

STATISTIKA ODPADU TABUĽKY;

VYTVORIŤ STATUS TABUĽKY

(IZD VARCHAR2(15),

KOL_ROM NUMBER(7),

KOL_FAN NUMBER(7)

Vytvorenie spúšťača TR3 sa vykonáva zadaním nasledujúceho príkazu:

VYTVORTE ALEBO VYMEŇTE SPÚŠŤAČ TR3

PO VLOŽENÍ ALEBO VYMAZANÍ ALEBO AKTUALIZÁCII ŽÁNRU

CURSOR V1 IS SELECT PUBLISHING HOUSE,

COUNT(NAME) KOL1

Z KNIGA WHERE ŽÁNRE = "Romantika"

SKUPINA PODĽA VYDAVATEĽSTVA;

CURSOR V2 IS SELECT PUBLISHING HOUSE,

COUNT(NAME) KOL2

Z KNIGA WHERE ŽÁNRE = "Fantasy"

SKUPINA PODĽA VYDAVATEĽSTVA;

VYMAZAŤ ZO STATU;

PRE Z1 V SLUČKE V1

INSERT IN TO STAT VALUES(Z1.PUBLISHER,

PRE Z1 V SLUČKE V2

AKTUALIZÁCIA STATISTICKEJ SADY KOL_FAN = Z1.KOL2

KDE IZD = Z1.NAKLADATEĽSTVO;

AK SQL%NOTFOUND THEN

INSERT IN TO STAT VALUES(Z1.PUBLISHER, 0,

Činnosť spúšťača je možné overiť vykonaním nasledujúcich príkazov, ktoré vložením riadkov do tabuľky KNIGA, odstránením riadkov a aktualizáciou riadkov v tabuľke KNIGA spôsobia spustenie spúšťača TR3.

Príkazy vkladania riadkov v tabuľke KNIGA, ktoré spôsobujú aktiváciu spúšťača TR3:

INSERT INTO KNIGA VALUES(46, "Kacíri Duny", "Herbert",368,

"Ast", "Fantasy");

INSERT INTO KNIGA VALUES(42; "Ingvar a jelša",

"Nikitin", 168, "Ast", "Roman");

Operátory na vymazanie riadkov z tabuľky KNIGA, ktoré spôsobia aktiváciu spúšťača TR3:

DELETE KNIGA WHERE TITLE = "Kozáci";

Príkazy úpravy riadkov v tabuľke KNIGA, ktoré spôsobujú aktiváciu spúšťača TR3:

AKTUALIZÁCIA SADA KNIGA ŽÁNRE="Sci-Fi" WHERE TITLE =

"Ingvar a jelša";

Zobrazenie informácií v tabuľke STAT je možné vykonať pomocou nasledujúceho príkazu.