Príklady spúšťačov na serveri ms sql. Spúšťač (databáza). Spúšťače DDL a ich aplikácie

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 PRE REPLIKÁCIU] AS ( AK AKTUALIZÁCIA(názov_stĺpca) [ (A | ALEBO) AKTUALIZÁCIA( názov_stĺpca)] [...n] |. IF (COLUMNS_UPDATES() (process_bit_operator) change_bit_mask) (comparison_bit_operator) bit_mask [...n]) sql_operator [...n] )

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

Pozrime sa na účel argumentov z CREATE | ALTER TRIGGER.

Názov spúšťača musí byť v rámci databázy jedinečný. Okrem toho 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 vlastných algoritmov spracovania údajov, ktoré sú intelektuálnym vlastníctvom programátora alebo obchodným tajomstvom.

Typy spúšťačov

IN SQL Server Existujú dva parametre, ktoré určujú správanie spúšťačov:

  • PO. Spúšťač sa vykoná po úspešnom dokončení príkazov, ktoré ho vyvolali. Ak príkazy nemožno z akéhokoľvek dôvodu ú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 je spúšťač vrátený 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 máte v tabuľke viacero spúšťačov AFTER, môžete použiť systémovú uloženú procedúru sp_settriggerorder na určenie, ktorý spúšťač sa spustí ako prvý a ktorý sa spustí ako posledný. V predvolenom nastavení sú v SQL Server všetky spúšťače AFTER spúšťačov.
  • NAMIESTO . Spúšťač sa volá namiesto vykonávania príkazov. Na rozdiel od spúšťača AFTER môže byť spúšťač INSTEAD OF definovaný pre tabuľku aj pre zobrazenie. Pre každú operáciu INSERT, UPDATE, DELETE je možné definovať iba jeden spúšťač INSTEAD OF.

Spúšťače sa rozlišujú podľa typu 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 – spúšťa sa pri pokuse o zmenu údajov pomocou príkazu UPDATE.
  • DELETE TRIGGER – spúšťa sa pri pokuse o vymazanie údajov pomocou príkazu DELETE.

Konštrukcie [ VYMAZAŤ] [,] [ VLOŽIŤ] [,] [ AKTUALIZOVAŤ] A PRE | PO | NAMIESTO ) ([,] určiť, na ktorý príkaz bude spúšť reagovať. Pri jeho vytváraní je potrebné zadať aspoň jeden príkaz. Povolený vytvorenie spúšťača, ktorý reaguje na dva alebo všetky tri príkazy.

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.

Upozorňujeme, ž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;
  • zotavenie záložná kópia databázy alebo protokolu transakcií.

Tieto príkazy nie je možné vykonať, pretože ich nemožno vrátiť späť, ak sa transakcia, v ktorej je spúšťač vykonaný, vráti späť. Tento zákaz pravdepodobne žiadnym spôsobom neovplyvní funkčnosť vytvorených spúšťačov. Je ťažké nájsť situáciu, kedy by ste napríklad po zmene riadku tabuľky potrebovali obnoviť zálohu 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é po dokončení transakcie. Štruktúra vložených a vymazaných tabuliek je totožná so štruktúrou tabuliek, pre ktoré 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 ani jeden 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 nebudú žiadne riadky;
  • Príkaz UPDATE - po vykonaní vymazaná tabuľka obsahuje staré hodnoty riadkov, ktoré sa po úspešnom dokončení vymažú

Posledná aktualizácia: 11/09/2017

Spúšťače sú špeciálnym typom uloženej procedúry, ktorá sa volá automaticky pri vykonaní určitej akcie na tabuľke alebo zobrazení, najmä pri pridávaní, zmene alebo odstraňovaní údajov, to znamená pri vykonávaní príkazov INSERT, UPDATE, DELETE.

Formálna definícia spúšťača:

CREATE TRIGGER trigger_name ON (názov_tabuľky | názov_zobrazenia) (PO | NAMIESTO PO) AS sql_expressions

Ak chcete vytvoriť spúšťač, použite príkaz CREATE TRIGGER, za ktorým nasleduje názov spúšťača. Názov spúšťača zvyčajne odráža typ operácie a názov tabuľky, na ktorej sa operácia vykonáva.

Každý spúšťač je spojený s konkrétnou tabuľkou alebo zobrazením, ktorého názov je uvedený za slovom ON .

Potom sa nastaví typ spúšťača. Môžeme použiť jeden z dvoch typov:

    AFTER: Vykonané po dokončení akcie. Definované len pre tabuľky.

    NAMIESTO: vykonaná namiesto akcie (to znamená, že akcia – pridanie, zmena alebo odstránenie – sa nevykoná vôbec). Definované pre tabuľky a zobrazenia

Po type spúšťača nasleduje označenie operácie, pre ktorú je spúšťač definovaný: INSERT, UPDATE alebo DELETE.

Pre spúšťač AFTER ho môžete použiť na niekoľko akcií naraz, napríklad UPDATE a INSERT. V tomto prípade sú operácie označené oddelené čiarkami. Pre spúšťač môžete definovať iba jednu akciu.

A potom za slovom AS prichádza množina SQL výrazov, ktoré vlastne tvoria telo spúšťača.

Vytvorme spúšť. Povedzme, že máme databázové produktydb s nasledujúcou definíciou:

CREATE DATABASE productdb; GO USE productdb; CREATE TABLE Products (Id INT IDENTITY PRIMÁRNY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL);

Definujme spúšťač, ktorý sa spustí pri pridávaní a aktualizácii údajov:

USE productdb; GO CREATE TRIGGER Products_INSERT_UPDATE ON Products PO VLOŽENÍ, AKTUALIZOVAŤ AKO AKTUALIZÁCIU SADA produktov Cena = Cena + Cena * 0,38 WHERE Id = (Vložené ID VYBERTE Z)

Povedzme, že v tabuľke Produkty sú uložené údaje o produktoch. Ale cena produktu často obsahuje rôzne prirážky ako daň z pridanej hodnoty, daň z pridanej korupcie a pod. Ten, kto údaje pridáva, nemusí poznať všetky tieto jemnosti so základom dane a cenu netto určuje on. Pomocou spúšťača vieme upraviť cenu produktu o určitú sumu.

Týmto spôsobom sa spúšťač spustí pri akejkoľvek operácii INSERT alebo UPDATE v tabuľke Produkty. Samotný spúšťač zmení cenu produktu a na získanie produktu, ktorý bol pridaný alebo zmenený, nájdeme tento produkt podľa Id. Akú hodnotu by však malo mať ID takéhoto produktu? Faktom je, že pri pridávaní alebo zmene údajov sa uložia do vloženej medzitabulky. Vytvára sa automaticky. A z nej môžeme získať údaje o pridaných/zmenených produktoch.

A po pridaní produktu do tabuľky Produkty bude mať produkt v skutočnosti o niečo vyššiu cenu ako tá, ktorá bola určená pri pridávaní:

Odstránenie spúšťača

Ak chcete odstrániť spúšťač, musíte použiť príkaz DROP TRIGGER:

DROP TRIGGER Products_INSERT_UPDATE

Vypnutie spúšťača

Stáva sa, že chceme pozastaviť spúšťač, ale nechceme ho úplne odstrániť. V tomto prípade ho možno dočasne vypnúť pomocou príkazu DISABLE TRIGGER:

DISABLE TRIGGER Products_INSERT_UPDATE ON Products

A keď potrebujete spúšťač, môžete ho povoliť pomocou príkazu ENABLE TRIGGER:

POVOLIŤ TRIGGER Products_INSERT_UPDATE ON Products

Spúšťač je podprogram podobný databázovej procedúre, ktorý automaticky volá DBMS pri zmene, odstránení alebo pridaní záznamu v tabuľke. K spúšťačom nie je možné pristupovať z programu, odovzdávať im parametre ani z nich prijímať výsledky. Najčastejšie sa spúšťače používajú na udržiavanie referenčnej integrity a kaskádových operácií v databáze. Referenčné špecifikácie, ktoré definujú kaskádové akcie odstraňovania a aktualizácie a vytvárajú sa pri deklarovaní tabuliek, sú tiež implementované prostredníctvom spúšťačov, ale text týchto spúšťačov nie je možné upravovať.

Účel spúšťačov

Zabrániť zmenám (napríklad zabrániť zmene faktúr po ich odoslaní).
. Zaznamenávanie zmien (napríklad uchovávanie kópií starých údajov).
. Auditujte zmeny (napríklad uchovávajte denník používateľov a rolí zapojených do zmien).
. Zaznamenajte zmeny (napríklad skontrolujte, či sú všetky zmeny datované podľa hodín servera, nie času klienta).
. Implementácia obchodných pravidiel.
. Replikácia údajov (napríklad uloženie záznamu o všetkých zmenách, ktoré budú odoslané do inej databázy v neskoršej verzii).
. Zvýšená produktivita (napríklad aktualizácia zostatku po každom detaile transakcie, aby sa urýchlili dotazy).

Vyhlásenie spúšťačov

VYTVORIŤ SPÚŠŤAČ {PRED|PO} {DELETE|INSERT|UPDATE [OF ]} ON REFERENCIA {STARÝ {[RIADOK]|TABLE [AS] } NOVÝ {RIADOK|TABUĽKA} [AS] }] [PRE KAŽDÝ {VÝKAZ|RIADOK [KEDY ]}]
[ZAČAŤ ATÓMOVÚ]

[KONIEC]

Kľúčové slová

. PRED|PO– čas spustenia – pred | po operácii aktualizácie.
. DELETE|INSERT|UPDATE= spúšťacia udalosť.
. PRE KAŽDÝ RAD– pre každý riadok (spustenie riadku, potom WHEN).
. PRE KAŽDÝ VÝKAZ– pre celý tím (štandardne platné).
. REFERENCIA– umožňuje priradiť až 4 aliasy starým a | alebo nové riadky a | alebo tabuľky, ku ktorým možno pristupovať pomocou spúšťačov.

Spúšťacie obmedzenia

Telo spúšťača nemôže obsahovať nasledujúce príkazy:
. Definovanie, mazanie a zmena databázových objektov (tabuľky, domény atď.)
. Spracovanie transakcie (COMMIT, ROLLBACK)
. Pripojenia a odpojenia k databáze (CONNECT, DISCONNECT)

Vlastnosti aplikácie
. Spúšťač sa vykoná po použití všetkých ostatných (deklaratívnych) kontrol integrity a je užitočný, keď je testovacie kritérium pomerne zložité. Ak deklaratívne kontroly odmietnu operáciu aktualizácie, spúšťače sa nevykonajú. Spúšťač funguje v kontexte transakcie, ale obmedzenie FK nie.
. Ak spúšťač spôsobí dodatočnú úpravu svojej základnej tabuľky, najčastejšie to nepovedie k jeho rekurzívnemu spusteniu, ale toto by sa malo objasniť. SQL Server 2005 poskytuje možnosť špecifikovať rekurziu až do 255 úrovní pomocou kľúčového slova OPTION (MAXRECURSIV 3).
. Spúšťače sa zvyčajne nevykonávajú pri spracovaní veľkých binárnych stĺpcov (BLOB).
. Malo by sa pamätať na to, že pri každej aktualizácii údajov DBMS automaticky vytvorí takzvaný spúšťač virtuálne stoly, ktoré majú v rôznych DBMS rôzne názvy. V InterBase a Oracle – toto sú nové a staré. V SQL Server - vložené a odstránené. Navyše, keď sa údaje zmenia, vytvoria sa oboje. Tieto tabuľky majú rovnaký počet stĺpcov s rovnakými názvami a doménami ako aktualizovaná tabuľka. SQL Server 2005 DBMS poskytuje možnosť špecifikovať tabuľku, vrátane dočasnej, do ktorej sa majú vkladať údaje pomocou kľúčového slova OUTPUT Inserted.ID,... INTO @.
. V mnohých DBMS je povolené deklarovať spúšťače pre niekoľko akcií súčasne. Na implementáciu rôznych reakcií na rôzne akcie poskytuje Oracle predikáty Vymazanie, Vloženie, Aktualizácia, ktoré vracajú hodnotu True pre príslušný typ aktualizácie.
. V Oracle DBMS môžete zadať zoznam stĺpcov (After Update Of) pre spúšťače aktualizácie, čím sa zabezpečí, že spúšťač sa bude volať len vtedy, keď sa zmenia hodnoty iba týchto stĺpcov.
. Pre každú spúšťaciu udalosť možno deklarovať viacero spúšťačov (Oracle má 12 spúšťačov na tabuľku) a poradie, v ktorom sa spúšťajú, je zvyčajne určené poradím, v akom sú vytvorené. V niektorých DBMS, ako napríklad InterBase, je poradie spustenia špecifikované pomocou dodatočného kľúčového slova POSITION. Vo všeobecnosti by sa spúšťače mali vykonať najskôr pre každý príkaz a potom pre každý riadok.
. Spúšťače môžu byť vložené do seba. SQL Server teda umožňuje 32 úrovní vnorenia (na určenie úrovne vnorenia môžete použiť globálnu premennú @@NextLevel).

Nevýhody spúšťačov

Zložitosť. Umiestnenie niektorých akcií s údajmi v databáze komplikuje jej návrh, implementáciu a správu.
. Stealth funkčnosť od používateľa. Je ťažké modernizovať aplikáciu, keď sú niektoré funkcie skryté.
. Vplyv na výkon. S malým počtom spúšťačov sa zvyšuje čas spracovania údajov.

Úprava a odstraňovanie spúšťačov

Ak chcete odstrániť spúšťač, použite príkaz DROP TRIGGER
. Ak chcete zmeniť spúšťač, použite príkaz ALTER TRIGGER....
. Zakázanie spúšťačov
V niektorých prípadoch, napríklad počas dávkového načítania, je potrebné vypnúť spúšťače. Množstvo DBMS poskytuje zodpovedajúce schopnosti. V Oracle a SQL Server sú kľúčové slová DISABLE|ENABLE, v InterBase INACTIVE|ACTIVE v príkaze ALTER TRIGGER.

Vlastnosti priemyselných serverov

1) InterBase/Firebird

VYTVORIŤ SPÚŠŤAČ PRE {AKTÍVNY|NEAKTÍVNY} {PRED|PO} {INSERT|DELETE|UPDATE} [POSITION ]
AS [VYHLÁSIŤ PREMENNÚ [()]]
ZAČAŤ

KONIEC

Príklad:

CREATE TRIGGER BF_Del_Cust PRE zákazníka
AKTÍVNE PRED ZMAZANÍM POZÍCIE 1 AKO
ZAČAŤ
DELETE FROM Orders WHERE Orders.CNum=Zákazník.CNum;
KONIEC;

2) SQL Server

VYTVORIŤ SPÚŠŤAČ ON [SO ŠIFROVANÍM] {PRE|PO|NAMIESTO} {INSERT|UPDATE|DELETE}
AS

POUŽÍVAŤ B1;
Ísť
VYTVORIŤ SPÚŠŤAČ InUpCust1 U zákazníka PO VLOŽENÍ, AKTUALIZÁCIA
AS RAISEERROR('Zmenená tabuľka zákazníkov');

Ďalšie typy spúšťačov

Oracle a SQL Server poskytujú možnosť vytvárať (nahradiť) spúšťače pre zobrazenia, ktoré sa neaktualizujú. Na tento účel sú k dispozícii namiesto kľúčových slov:

VYTVORIŤ SPÚŠŤAČ NAMIESTO VLOŽENIA AKO…

Môžete monitorovať pokusy klienta o aktualizáciu údajov pomocou pohľadov a vykonávať akékoľvek akcie, spracovávať neaktualizované pohľady atď.
. SQL Server DBMS poskytuje spúšťač vrátenia, ktorý v skutočnosti zastaví všetky akcie a vydá správu:

SPÚŠŤAČ ROLLBACK

Poznámky k prednáške o disciplíne „Databázy“

Téma: Postupy a spúšťače

(ako príklad použite MS SQL Server)

zostavovateľ: L. V. Shchegoleva

PetrSU, Katedra aplikovanej matematiky a kybernetiky

Úvod................................................................. ....................................................... ........................

Popis štruktúry databázy ............................................................ ........................

Koncepcia postupu ................................................. ......................................................

Príkazy na prácu s procedúrami ................................................................ ......................................................

Koncept spúšťača ................................................................ ......................................................

Príkazy pre prácu so spúšťačmi................................................................ ......................................................

Príklady implementácií spúšťača ................................................................ ...............

Príklad 1................................................. ......................................................

Príklad 2................................................. ......................................................

Príklad 3................................................. ......................................................

Príklad 4................................................. ......................................................

Príklad 5................................................. ......................................................

PetrSU, Katedra aplikovanej matematiky a kybernetiky

Úvod

IN Táto príručka poskytuje príklady príkazov na vytváranie procedúr a spúšťačov

s popis ich práce.

Všetky príkazy sú napísané v syntaxi MS SQL Server.

Príklady sú uvedené pre databázu, ktorej štruktúra je opísaná v

sekcia 1.

PetrSU, Katedra aplikovanej matematiky a kybernetiky

1 Popis štruktúry databázy

Tabuľka tblFaculty obsahuje informácie o fakultách univerzity.

názov

Popis

atribút

ID fakulty

Názov fakulty

Celé meno dekana

Číslo dekanátu

Telefónne číslo dekanátu

Počet študentov fakulty

Tabuľka tblStudent obsahuje informácie o študentoch vysokých škôl v jednom akademickom roku.

Názov atribútu

Popis

Študentská karta

Meno študenta

štipendium

Tabuľka tblGroup obsahuje informácie o skupinách študentov vysokých škôl v jednom akademickom roku.

Názov atribútu

Popis

ID skupiny

Headman

Číslo skupiny

fakulta

Tabuľka tblSubject obsahuje informácie o odboroch, ktoré študovali študenti fakulty v jednom akademickom roku.

Názov atribútu

Popis

ID položky

Názov položky

Počet vyučovacích hodín

Počet hodín praxe

fakulta

Poznámky k prednáške o disciplíne „Databázy“ (Postupy a spúšťače)

PetrSU, Katedra aplikovanej matematiky a kybernetiky

Tabuľka tblRoom obsahuje informácie o univerzitných učebniach.

Tabuľka tblSchedule obsahuje informácie o rozvrhu skupín študentov.

Názov atribútu

Popis

Identifikátor

publikum

Deň v týždni

Celé meno učiteľa

PetrSU, Katedra aplikovanej matematiky a kybernetiky

2 Koncepcia postupu

Procedúra je program napísaný v internom jazyku DBMS, uložený v databáze ako nezávislý objekt. Takéto procedúry sa zvyčajne nazývajú uložené, pripojené procedúry. Procedúry môže vyvolať aplikačný program. Procedúry sa vykonávajú na databázovom serveri. Procedúry môžu obsahovať parametre a návratové hodnoty vrátane chybových hlásení.

Výhody použitia procedúr:

centralizované riadenie prístupu k údajom;

aplikačné programy môžu volať procedúru, čo skracuje čas na písanie programov, keď sa procedúra upraví, všetky programy, ktoré ju volajú, dostanú nový kód, optimalizácia kódu;

znižuje sieťovú prevádzku v systémoch„klient-server“ tým, že namiesto výmeny údajov odovzdá iba názov procedúry a jej parametre a procedúra sa vykoná na serveri;

skrýva mnoho funkcií pred používateľom konkrétne zariadenie databázy, čo zabezpečuje väčšiu nezávislosť údajov;

väčšiu bezpečnosť dát, môže mať užívateľ právo volať

procedúra, ale nemanipuluje s údajmi, ktoré sú volané touto procedúrou; Nevýhoda: nedostatok noriem pri implementácii postupov.

PetrSU, Katedra aplikovanej matematiky a kybernetiky

3 Príkazy pre prácu s procedúrami v MS SQL Server

Vytvorenie postupu

VYTVORIŤ POSTUP<имя процедуры>

[@<имя параметра> <тип данных> , ...]

ZAČAŤ

<операторы>

Názvy všetkých premenných v MS SQL Server musia začínať symbolom

Vyvolanie procedúry

VYKONAŤ<имя процедуры> [{@<имя переменной> | <значение параметра>}, ...]

Odstránenie postupu

PROCEDÚRA ODPADU<имя процедуры>

Procedúra spočíta počet študentov zapísaných na katedre, ktorej identifikátor je vstupným parametrom procedúry @id a vráti túto hodnotu v parametri @total_sum.

Vytvorenie procedúry prStudentsOfFaculty @id int, @total_sum int output AS

Nastavte @total_sum = 0

Nastaviť @total_sum = (Vyberte počet(*) z tblStudent, tblGroup Where (tblStudent.GroupId = tblGroup.GroupId) a (tblGroup.FacultyId = @id)) Koniec

PetrSU, Katedra aplikovanej matematiky a kybernetiky

4 Koncept spúšťača

Spúšťač (pravidlo) je pripojený k tabuľke a je automaticky vyvolaný systémom správy databázy, keď sa na tabuľke vykonajú operácie aktualizácie (pridanie, vymazanie, zmena záznamov tabuľky).

Vlastnosti implementácie spúšťačov v MS SQL Server

Na MS SQL Server:

spúšťač môže byť vyvolaný buď po vykonaní operácie, alebo namiesto vykonania operácie;

spúšťač sa volá raz pre všetky záznamy tabuľky, na ktorých sa musí operácia vykonať;

preto sú upravované záznamy uložené v dvoch tabuľkách, ktoré sa automaticky vytvoria pri volaní spúšťača:

o Vložená tabuľka – obsahuje zmenené alebo pridané záznamy tabuľky;

o Vymazaná tabuľka – obsahuje záznamy pred vykonaním zmien alebo vymazané záznamy tabuľky;

v tele spúšťača definovaného pre operáciu Vložiť je dostupná iba tabuľka

v tele spúšťača definovaného pre operáciu Delete je dostupná iba tabuľka

v tele spúšťača definovaného pre operáciu Update sú dostupné obe tabuľky

Vložené a vymazané;

Pre tú istú udalosť je možné vytvoriť ľubovoľný počet spúšťačov, ktoré sa volajú v náhodnom poradí (prípadne v poradí, v akom boli vytvorené).

PetrSU, Katedra aplikovanej matematiky a kybernetiky

5 Príkazy pre prácu so spúšťačmi

Tvorba

VYTVORIŤ SPÚŠŤAČ<имя триггера>ON<имя таблицы>

( PRE | PO | NAMIESTO )

[INSERT] [,] [AKTUALIZÁCIA] [,] [DELETE] AS

VYHLÁSIŤ @<имя переменной> <тип данных>, ...

ZAČAŤ<операторы>

Odstránenie

DROP SPÚŠŤ<имя триггера>

PetrSU, Katedra aplikovanej matematiky a kybernetiky

6 Príklady implementácií spúšťača

Obmedzenie oblasti:Štipendium študenta nemožno zvýšiť o viac ako 5 % predchádzajúceho štipendia.

CREATE TRIGGER tgrStudentGrantUpdate

NA tblStudent PO AKTUALIZÁCII

DECLARE @Grant_old float, @Grant_new float, @Id int;

Vyberte @Grant_old = Grant z Deleted

Vyberte @Grant_new = Grant, @Id = StudentId z Vložené

IF (@Grant_new - @Grant_old > 0,05 * @Grant_old)

UPDATE tblStudent SET Grant = 1,05 * @Grant_old

WHERE StudentId = @Id

Pre tabuľku tblStudent bol vytvorený spúšťač tgrStudentGrantUpdate. Spúšťač sa spustí po dokončení operácie zmeny údajov.

IN Spúšťač definuje tri lokálne premenné: @Grant_old (skutočný typ) na uloženie starého študentského štipendia, @Grant_new (skutočný typ) na uloženie nového študentského štipendia, @Id (celočíselný typ) na uloženie identifikátora študenta.

Keď sa zavolá spúšťač, DBMS vytvorí dve tabuľky: Deleted, ktorá obsahuje upravené záznamy pred ich úpravou, a Inserted, ktorá obsahuje upravené záznamy po ich úprave.

IN V tele spúšťača sa najskôr načíta hodnota štipendia študenta z tabuľky Vymazané pred vykonaním zmien, t. j. staré štipendium sa načíta z tabuľky Vložené za; vykonajú sa zmeny, t.j. nové štipendium. Spolu s načítaním nového štipendia z tabuľky Vložené sa načíta aj identifikátor študenta. ID študenta sa dá rovnako ľahko získať z tabuľky Odstránené.

Ďalej sa v tele spúšťača skontroluje podmienka o výške zmeny štipendia. Ak sa štipendium zmenilo o viac ako 5 %, spúšťač vykoná úpravu údajov – zvýši štipendium iba o 5 % v porovnaní s predchádzajúcou hodnotou štipendia študenta. Táto akcia sa vykoná volaním operácie Update v tabuľke tblStudent pre príslušného študenta.

Uvádza sa definícia spúšťača, rozsah jeho použitia, miesto a úloha spúšťača pri zabezpečovaní integrity údajov. Sú popísané typy spúšťačov. Zohľadňujú sa operátory na vytváranie, zmenu a odstraňovanie spúšťača. Programovanie spúšťačov je ilustrované príkladmi vytvárania spúšťačov na implementáciu obmedzení integrity a zber štatistických údajov.

Definícia spúšťača v štandarde jazyka SQL

Spúšťače sú typom uloženej procedúry. Vykonajú sa, keď sa na tabuľke spustí operátor jazyka manipulácie s údajmi (DML). Spúšťače sa používajú na kontrolu integrity údajov a tiež na vrátenie transakcií.

Spúšťač je skompilovaná SQL procedúra, ktorej vykonanie je podmienené výskytom určitých udalostí v rámci vzťahová základňaúdajov. Použitie spúšťačov je z veľkej časti veľmi pohodlné pre používateľov databázy. Ich použitie však často zahŕňa dodatočnú réžiu I/O. Keď je možné dosiahnuť rovnaké výsledky (s oveľa menšou réžiou) pomocou uložených procedúr alebo aplikačných programov, použitie spúšťačov nie je praktické.

Spúšťače sú špeciálny nástroj SQL servera, ktorý sa používa na udržanie integrity údajov v databáze. Obmedzenia integrity, pravidlá a predvolené hodnoty nemusia vždy dosiahnuť požadovanú úroveň funkčnosti. Často je potrebné implementovať komplexné algoritmy overovania údajov, aby sa zabezpečila ich spoľahlivosť a reálnosť. Okrem toho niekedy potrebujete sledovať zmeny v hodnotách tabuľky, aby bolo možné súvisiace údaje podľa potreby upraviť. Spúšťače si možno predstaviť ako druh filtrov, ktoré nadobudnú účinnosť po dokončení všetkých operácií v súlade s pravidlami, štandardnými hodnotami atď.

Spúšťač je špeciálny typ uloženej procedúry, ktorú automaticky spúšťa server pri pokuse o zmenu údajov v tabuľkách, ku ktorým sú priradené spúšťače. Každý spúšťač je spojený s konkrétnou tabuľkou. Všetky úpravy údajov, ktoré vykoná, sa považujú za jednu transakciu. Ak sa zistí chyba alebo porušenie integrity údajov, transakcia sa vráti späť. Zmeny sú preto zakázané. Všetky zmeny, ktoré už vykonal spúšťač, sa tiež vrátia späť.

Spúšťač môže vytvoriť iba vlastník databázy. Toto obmedzenie vám umožňuje vyhnúť sa náhodným zmenám štruktúry tabuliek, spôsobov pripojenia iných objektov k nim atď.

Spúšť je veľmi užitočný a zároveň nebezpečný nástroj. Ak je teda logika jeho fungovania nesprávna, môžete ľahko zničiť celú databázu, takže spúšťače musia byť ladené veľmi opatrne.

Na rozdiel od bežnej rutiny sa spúšťač vykoná implicitne vždy, keď sa vyskytne. spúšťacia udalosť okrem toho nema ziadne argumenty. Jeho aktivácia sa niekedy nazýva spustenie spúšte. Pomocou spúšťačov sa dosahujú tieto ciele:

  • Overenie správnosti zadaných údajov a presadzovanie komplexných obmedzení integrity údajov, ktoré je ťažké, ak nie nemožné, udržiavať pomocou obmedzení integrity nastavených v tabuľke;
  • vydávanie upozornení, ktoré vám pripomenie, aby ste vykonali určité akcie pri aktualizácii tabuľky implementovanej určitým spôsobom;
  • zhromažďovanie informácií o audite zaznamenávaním informácií o vykonaných zmenách a tých, ktorí ich vykonali;
  • podpora replikácie.

Základný formát príkazu CREATE TRIGGER je uvedený nižšie:

<Определение_триггера>::= VYTVORIŤ TRIGGER názov spúšťača PRED | PO<триггерное_событие>ON<имя_таблицы> <тело_триггера>

spúšťacie udalosti pozostávajú z vkladania, odstraňovania a aktualizácie riadkov v tabuľke. V druhom prípade pre spúšťacia udalosť Môžete zadať konkrétne názvy stĺpcov tabuľky. Čas spustenia sa určuje pomocou Kľúčové slová PRED (spúšťač sa spustí pred vykonaním udalostí s ním spojených) alebo AFTER (po ich vykonaní).

Akcie vykonávané spúšťačom sú špecifikované pre každý riadok (PRE KAŽDÝ RIADOK), na ktorý sa vzťahuje daná udalosť, alebo len raz pre každú udalosť (PRE KAŽDÝ VÝKAZ).

Označenie <список_старых_или_новых_псевдонимов> sa týka komponentov ako sú staré resp Nový riadok(STARÝ/NOVÝ) buď starý resp nový stôl(STARÁ TABUĽKA / NOVÁ TABUĽKA). Je jasné, že staré hodnoty sa nevzťahujú na udalosti vkladania a nové hodnoty sa nevzťahujú na udalosti odstraňovania.

Pri správnom použití môžu byť spúšťače veľmi silným mechanizmom. Ich hlavnou výhodou je, že štandardné funkcie sú uložené v databáze a sú dôsledne aktivované pri každej aktualizácii. To môže výrazne zjednodušiť aplikácie. Stojí však za zmienku o základných nevýhodách spúšťača:

  • zložitosť: keď sa niektoré funkcie presunú do databázy, úlohy jej návrhu, implementácie a správy sa stávajú zložitejšími;
  • Skrytá funkčnosť: Presun niektorých funkcií do databázy a ich uloženie ako jeden alebo viacero spúšťačov niekedy vedie k tomu, že niektoré funkcie sú pred používateľom skryté. Hoci to do určitej miery zjednodušuje jeho obsluhu, môže to, žiaľ, spôsobiť neželané, potenciálne nežiaduce a škodlivé vedľajšie účinky, pretože v tomto prípade používateľ nemôže kontrolovať všetky procesy prebiehajúce v databáze;
  • vplyv na výkon: pred vykonaním každého príkazu na zmenu stavu databázy musí DBMS skontrolovať podmienku spúšťača, aby určil, či sa má pre tento príkaz spustiť spúšťač. Vykonanie takýchto výpočtov ovplyvňuje celkový výkon DBMS a v čase špičkového zaťaženia môže byť jeho pokles obzvlášť viditeľný. Je zrejmé, že so zvyšujúcim sa počtom spúšťačov sa zvyšujú aj režijné náklady spojené s takýmito operáciami.

Nesprávne napísané spúšťače môžu viesť k vážnym problémom, ako sú mŕtve zámky. Spúšťače môžu blokovať veľa zdrojov na dlhé časové obdobia, takže osobitnú pozornosť je potrebné venovať minimalizácii konfliktov prístupu.

Implementácia spúšťačov v prostredí MS SQL Server

Implementácia MS SQL Server DBMS používa nasledujúci operátor vytvorenia alebo úpravy spúšťač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 PRE REPLIKÁCIU] AS ( AK AKTUALIZÁCIA(názov_stĺpca) [ (A | ALEBO) AKTUALIZÁCIA( názov_stĺpca)] [...n] |. IF (COLUMNS_UPDATES() (process_bit_operator) change_bit_mask) (comparison_bit_operator) bit_mask [...n]) sql_operator [...n] )

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

Pozrime sa na účel argumentov z CREATE | ALTER TRIGGER.

Názov spúšťača musí byť v rámci databázy jedinečný. Okrem toho 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 vlastných algoritmov spracovania údajov, ktoré sú intelektuálnym 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 dokončení príkazov, ktoré ho vyvolali. Ak príkazy nemožno z akéhokoľvek dôvodu ú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 je spúšťač vrátený 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 máte v tabuľke viacero spúšťačov AFTER, môžete použiť systémovú uloženú procedúru sp_settriggerorder na určenie, ktorý spúšťač sa spustí ako prvý a ktorý sa spustí ako posledný. V predvolenom nastavení sú v SQL Server všetky spúšťače AFTER spúšťačov.
  • NAMIESTO . Spúšťač sa volá namiesto vykonávania príkazov. Na rozdiel od spúšťača AFTER môže byť spúšťač INSTEAD OF definovaný pre tabuľku aj pre zobrazenie. Pre každú operáciu INSERT, UPDATE, DELETE je možné definovať iba jeden spúšťač INSTEAD OF.

Spúšťače sa rozlišujú podľa typu 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 – spúšťa sa pri pokuse o zmenu údajov pomocou príkazu UPDATE.
  • DELETE TRIGGER – spúšťa sa pri pokuse o vymazanie údajov pomocou príkazu DELETE.

Konštrukcie [ VYMAZAŤ] [,] [ VLOŽIŤ] [,] [ AKTUALIZOVAŤ] A PRE | PO | NAMIESTO ) ([,] určiť, na ktorý príkaz bude spúšť reagovať. Pri jeho vytváraní je potrebné zadať aspoň jeden príkaz. Povolený vytvorenie spúšťača, ktorý reaguje na dva alebo všetky tri príkazy.

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.

Upozorňujeme, ž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 je možné vykonať, pretože ich nemožno vrátiť späť, ak sa transakcia, v ktorej je spúšťač vykonaný, vráti späť. Tento zákaz pravdepodobne žiadnym spôsobom neovplyvní funkčnosť vytvorených spúšťačov. Je ťažké nájsť situáciu, kedy by ste napríklad po zmene riadku tabuľky potrebovali obnoviť zálohu 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é po dokončení transakcie. Štruktúra vložených a vymazaných tabuliek je totožná so štruktúrou tabuliek, pre ktoré 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 ani jeden 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 nebudú žiadne riadky;
  • Príkaz UPDATE - po vykonaní vymazaná tabuľka obsahuje staré hodnoty riadkov, ktoré budú vymazané po úspešnom dokončení spúšťača. Nové hodnoty riadkov sú obsiahnuté vo vloženej tabuľke. Tieto riadky sa pridajú do zdrojovej tabuľky po úspešnom vykonaní spúšťača.

Ak chcete získať informácie o počte riadkov, ktoré sa po úspešnom dokončení spúšťača upravia, môžete použiť funkciu @@ROWCOUNT; vráti počet riadkov spracovaných posledným príkazom. Je potrebné zdôrazniť, že spúšť sa nespustí pri pokuse o zmenu konkrétneho riadku, ale v okamihu vykonania príkazu na zmenu. Jeden takýto príkaz ovplyvňuje mnoho riadkov, takže spúšťač musí spracovať všetky tieto riadky.

Ak spúšťač zistí, že zo 100 riadkov, ktoré sa vkladajú, upravujú alebo vymazávajú, iba jeden nespĺňa určité podmienky, nebude vložený, upravený ani odstránený žiadny riadok. Toto správanie je spôsobené požiadavkami transakcie – buď musia byť vykonané všetky úpravy, alebo žiadne.

Spúšťač sa vykonáva ako implicitne definovaná transakcia, takže v rámci spúšťača možno použiť príkazy na riadenie transakcie. Konkrétne, keď sa zistí porušenie obmedzenia integrity, príkaz ROLLBACK TRANSACTION sa musí použiť na zrušenie spúšťača a vrátenie všetkých zmien, ktoré sa používateľ pokúsil vykonať.

Pomocou funkcie COLUMNS_UPDATED() môžete získať zoznam stĺpcov, ktoré boli zmenené príkazmi INSERT alebo UPDATE, ktoré spôsobili spustenie spúšťača. Vracia binárne číslo, ktorého každý bit počnúc najmenej významným bitom zodpovedá jednému stĺpcu tabuľky (v poradí stĺpcov, keď bola tabuľka vytvorená). Ak je bit nastavený na "1", zodpovedajúci stĺpec bol upravený. Okrem toho skutočnosť, že sa stĺpec zmenil, určuje funkcia UPDATE (názov_stĺpca).

Pre odstráňte spúšť použije sa príkaz

DROP TRIGGER (trigger_name) [,...n]

Tu sú príklady použitia spúšťačov.

Príklad 14.1. Pomocou spúšťača na uplatňovanie obmedzení hodnoty. V položke pridanej do tabuľky transakcií množstvo predaného produktu nesmie byť menšie ako jeho zostatok z tabuľky Sklad.

Príkaz na vloženie záznamu do tabuľky Deal môže byť napríklad takýto:

INSERT INTO Trade VALUES (3,1,-299,"01/08/2002")

Vytvorený spúšťač by mal reagovať na jeho vykonanie nasledovne: príkaz je potrebné zrušiť, ak v tabuľke Sklad je zostatok produktu menší ako predané množstvo produktu so zadaným kódom (v príklade kód produktu = 3 ). Vo vloženom zázname je množstvo produktu označené znamienkom „+“, ak je produkt dodaný, a znamienkom „-“, ak je predávaný. Prezentovaný spúšťač je nakonfigurovaný na spracovanie iba jedného pridaného záznamu.

CREATE TRIGGER Trigger_ins ON Transaction FOR INSERT AS IF @@ROWCOUNT=1 BEGIN IF NOT EXISTS(SELECT * FROM insert WHERE -inserted.quantity<=ALL(SELECT Склад.Остаток FROM Склад,Сделка WHERE Склад.КодТовара= Сделка.КодТовара)) BEGIN ROLLBACK TRAN PRINT "Отмена поставки: товара на складе нет" END END Príklad 14.1. Použitie spúšťača na implementáciu obmedzení na hodnotu.

Príklad 14.2. Použitie spúšťača na zber štatistických údajov.

Vytvorte spúšťač na spracovanie operácie vloženia záznamu do tabuľky Deal, napríklad nasledujúci príkaz:

INSERT INTO Trade VALUES (3,1,200,"01/08/2002")

Produkt s kódom 3 je dodávaný od zákazníka s kódom 1 v množstve 200 kusov.

Pri predaji alebo príjme položky je potrebné zodpovedajúcim spôsobom upraviť množstvo zásob. Ak produkt ešte nie je na sklade, je potrebné pridať zodpovedajúci záznam do tabuľky Sklad. Spúšťač spracuje iba jeden pridaný riadok.

ALTER TRIGGER Trigger_ins ON Transaction FOR INSERT AS DECLARE @x INT, @y INT IF @@ROWCOUNT=1 --do tabuľky Transakcia sa pridá záznam o dodaní tovaru BEGIN --predané množstvo tovaru nesmie byť -- menší ako jeho zostatok z tabuľky skladu AK NEEXISTUJE (VYBERTE * Z vložené WHERE -vložené.množstvo< =ALL(SELECT Склад.Остаток FROM Склад,Сделка WHERE Склад.КодТовара= Сделка.КодТовара)) BEGIN ROLLBACK TRAN PRINT "откат товара нет " END --если записи о поставленном товаре еще нет, --добавляется соответствующая запись --в таблицу Склад IF NOT EXISTS (SELECT * FROM Склад С, inserted i WHERE С.КодТовара=i.КодТовара) INSERT INTO Склад (КодТовара,Остаток) ELSE --если запись о товаре уже была в таблице --Склад, то определяется код и количество --товара издобавленной в таблицу Сделка записи BEGIN SELECT @y=i.КодТовара, @x=i.Количество FROM Сделка С, inserted i WHERE С.КодТовара=i.КодТовара --и производится изменения количества товара в --таблице Склад UPDATE Склад SET Остаток=остаток+@x WHERE КодТовара=@y END END Príklad 14.2. Použitie spúšťača na zber štatistických údajov.

Príklad 14.3. Vytvorte spúšťač na spracovanie operácie odstránenia záznamu z tabuľky Deal, napríklad nasledujúci príkaz:

Pri tovare, ktorého kód bol uvedený pri výmaze záznamu, je potrebné upraviť jeho stav zásob. Spúšťač spracováva iba jeden záznam, ktorý sa má odstrániť.

CREATE TRIGGER Trigger_del ON Transakcia PRE DELETE AS IF @@ROWCOUNT=1 -- jeden záznam je vymazaný ZAČAŤ DECLARE @y INT,@x INT --kód a množstvo produktu sa určí z --záznamu vymazaného z tabuľky Sklad SELECT @y=Kód produktu, @ x=Množstvo OD vymazané --v tabuľke Sklad je množstvo --položky upravené AKTUALIZÁCIA NASTAVENIA skladu Zostáva=Zostáva-@x KDE Kód produktu=@y KONIEC Príklad 14.3. Spúšťač spracovania operácie vymazania záznamu z tabuľky

Príklad 14.4. Vytvorte spúšťač na spracovanie operácie zmeny záznamu v tabuľke Deal, napríklad pomocou nasledujúceho príkazu:

vo všetkých transakciách s tovarom s kódom rovným 3 znížte množstvo tovaru o 10 jednotiek.

Zadaný príkaz môže viesť k zmenám vo viacerých záznamoch naraz v tabuľke Deal. Preto si ukážeme, ako vytvoriť spúšťač, ktorý spracuje viac ako jeden záznam. Pri každom zmenenom zápise je potrebné, aby starý (pred zmenou) kód produktu znížil zostatok produktu na sklade o hodnotu starého (pred zmenou) množstva produktu a pre nový (po zmene) zmena) kód produktu zvýšiť svoj zostatok na sklade o hodnotu novej (po zmene) hodnoty. Na spracovanie všetkých zmenených záznamov zavedieme kurzory, do ktorých uložíme všetky staré (z vymazanej tabuľky) a všetky nové hodnoty (z vloženej tabuľky).

CREATE TRIGGER Trigger_upd ON Transakcia PRE AKTUALIZÁCIU AKO DECLARE @x INT, @x_old INT, @y INT, @y_old INT -- kurzor s novými hodnotami ​​DECLARE CUR1 CURSOR FOR SELECT Kód produktu, vložené množstvo FROM -- kurzor so starými hodnotami ​​DECLARE CUR2 CURSOR FOR SELECT Product Code, Množstvo OD vymazaného OPEN CUR1 OPEN CUR2 -- pohyb paralelne cez oba kurzory FETCH NEXT Z CUR1 DO @x, @y FETCH NEXT Z CUR2 DO @x_old, @y_old WHILE @@FETCH_STATUS=0 ZAČIATOK -- pre starý kód produktu sa znižuje --množstvo na sklade AKTUALIZÁCIA SADA skladu Zostáva=Zostáva-@y_old KDE Kód produktu=@x_old --pre nový kód produktu, ak takýto produkt ešte nie je na sklade, zadá sa nový záznam AK NEEXISTUJE (VYBERTE * ZO skladu, KDE Kód produktu=@x) VLOŽTE DO skladu (Kód produktu, Zostávajúce) HODNOTY (@x,@y) ELSE --inak pre nový kód produktu sa zvyšuje -- jeho množstvo na sklade AKTUALIZÁCIA SÚPRAVY skladu Zostáva=Zostáva+@y KDE Kód produktu=@x NAČÍTAJTE ĎALEJ Z CUR1 DO @x, @y NAČÍTAJTE NASLEDUJÚCE Z CUR2 DO @x_old, @y_old KONIEC ZATVORIŤ CUR1 ZATVORIŤ CUR2 DEALOKOVAŤ CUR1 DEALOKOVAŤ CUR2 Príklad 14.4. spúšťač spracovania operácie na zmenu záznamu v tabuľke

V uvažovanom spúšťači nedochádza k porovnávaniu množstva tovaru pri zmene záznamu transakcie s jeho zostatkom na sklade.

Príklad 14.5. Napravme tento nedostatok. Na vygenerovanie chybového hlásenia používame príkaz MS SQL Server RAISERROR v tele spúšťača, ktorého argumenty sú text správy, úroveň závažnosti a chybový stav.

ALTER TRIGGER Trigger_upd ON Transakcia PRE AKTUALIZÁCIU AKO DECLARE @x INT, @x_old INT, @y INT, @y_old INT ,@o INT DECLARE CUR1 KURZOR PRE VÝBER kódu položky, množstvo OD vložené DECLARE CUR2 CURSOR FOR SELECT Kód položky odstránené, Množstvo OD OTVORIŤ CUR1 OTVORIŤ CUR2 NAČÍTAŤ ĎALEJ Z CUR1 DO @x, @y NAČÍTAŤ ĎALEJ Z CUR2 DO @x_old, @y_old KEĎ @@FETCH_STATUS=0 ZAČAŤ VYBRAŤ @o=zostávajúce ZO skladu KDE kód produktu=@x AK @o<-@y BEGIN RAISERROR("откат",16,10) CLOSE CUR1 CLOSE CUR2 DEALLOCATE CUR1 DEALLOCATE CUR22 ROLLBACK TRAN RETURN END UPDATE Склад SET Остаток=Остаток-@y_old WHERE КодТовара=@x_old IF NOT EXISTS (SELECT * FROM Склад WHERE КодТовара=@x) INSERT INTO Склад(КодТовара,Остаток) VALUES (@x,@y) ELSE UPDATE Склад SET Остаток=Остаток+@y WHERE КодТовара=@x FETCH NEXT FROM CUR1 INTO @x, @y FETCH NEXT FROM CUR2 INTO @x_old, @y_old END CLOSE CUR1 CLOSE CUR2 DEALLOCATE CUR1 DEALLOCATE CUR2 Príklad 14.5. Opravená verzia spúšťača pre spracovanie operácie zmeny záznamu v tabuľke

Príklad 14.6. V príklade sú všetky zmeny zrušené, ak nie je možné implementovať aspoň jednu z nich. Poďme vytvoriť spúšťač, ktorý vám umožní zrušiť zmeny iba niektorých záznamov a zmeniť zvyšok.

V tomto prípade sa spúšťač nevykoná po zmene záznamov, ale namiesto príkazu change.

ALTER TRIGGER Trigger_upd ON Transaction NAMIESTO AKTUALIZÁCIE AKO DECLARE @k INT, @k_old INT DECLARE @x INT, @x_old INT, @y INT DECLARE @y_old INT ,@o INT DECLARE CUR1 CURSOR FOR SELECT Transaction Code, Product Code, Množstvo FROM vložený DECLARE CUR2 CURSOR FOR SELECT Transakčný kód, kód produktu, množstvo OD odstránené OTVORIŤ CUR1 OTVORIŤ CUR2 NAČÍTAŤ NEXT Z CUR1 DO @k,@x, @y NAČÍTAŤ NEXT Z CUR2 DO @k_old,@x_old, @y_old WHILE @@=FETCH_STATUS 0 ZAČAŤ VÝBER @ o=zostávajúci zo skladu KDE Kód produktu=@x AK @o>=-@y ZAČIATOK RAISERROR("zmena",16,10) AKTUALIZÁCIA SADA transakcie množstvo=@y, Kód produktu=@x KDE Kód transakcie =@k AKTUALIZOVAŤ SÚPRAVU skladu Zostáva =Zostáva-@y_old KDE Kód položky=@x_old AK NEEXISTUJE (VYBERTE * ZO skladu, KDE Kód položky=@x) VLOŽTE DO skladu (Kód položky, Zostávajúce) HODNOTY (@x,@y) ELSE AKTUALIZÁCIA skladu Zostáva=Zostáva+@y KDE Kód položky=@x KONIEC ELSE RAISERROR("záznam sa nezmenil",16,10) NAČÍTAJ ĎALEJ Z CUR1 DO @k,@x, @y NAČÍTAJ ĎALEJ Z CUR2 DO @k_old, @x_old, @y_old KONIEC ZATVORIŤ CUR1 ZATVORIŤ CUR2 DEALOCATE CUR1 DEALLOCATE CUR2 Príklad 14.6. Spúšťač, ktorý vám umožňuje vrátiť späť zmeny iba v niektorých záznamoch a vykonať zmeny vo zvyšku.