Primeri sprožilcev v strežniku ms sql. Sprožilec (baza podatkov). Sprožilci DDL in njihove aplikacije

sprožilec:

<Определение_триггера>::= (USTVARI | SPREMENI) SPROŽILEC ime_sprožilca ON (ime_tabele | ime_pogleda) ( ( ( ZA | PO | NAMESTO ) ( [ IZBRIŠI] [,] [ VSTAVI] [,] [ POSODOBI] ) [ Z DODAJANJEM ] [ NI ZA REPLIKACIJA ] AS sql_statement[...n] ) | ( (ZA | ZA | NAMESTO ) ( [,] ) [ Z PRIPODANJEM] [ NI ZA PODVOJITEV] AS ( ČE POSODOBITE(ime_stolpca) [ (IN | ALI) POSODOBITE( ime_stolpca)] [...n] | IF (COLUMNS_UPDATES() (process_bit_operator) change_bit_mask) (primerjalni_bit_operator) bit_mask [...n]) sql_operator [...n] ) )

Sprožilec je mogoče ustvariti samo v trenutni bazi podatkov, vendar je mogoče dostopati do drugih baz podatkov znotraj sprožilca, vključno s tistimi, ki se nahajajo na oddaljenem strežniku.

Oglejmo si namen argumentov iz ukaza CREATE | SPREMENI SPROŽILEC.

Ime sprožilca mora biti enolično znotraj baze podatkov. Poleg tega lahko določite ime lastnika.

Ko podate argument WITH ENCRYPTION, strežnik šifrira sprožilno kodo, tako da nihče, vključno s skrbnikom, ne more dostopati do nje ali jo prebrati. Šifriranje se pogosto uporablja za skrivanje lastniških algoritmov za obdelavo podatkov, ki so programerjeva intelektualna lastnina ali poslovna skrivnost.

Vrste sprožilcev

IN SQL Server Obstajata dva parametra, ki določata obnašanje sprožilcev:

  • PO. Sprožilec se izvede, ko so ukazi, ki so ga poklicali, uspešno zaključeni. Če ukazov ni mogoče uspešno dokončati iz kakršnega koli razloga, se sprožilec ne izvede. Upoštevati je treba, da se spremembe podatkov zaradi izvajanja uporabniške zahteve in izvajanja sprožilca izvedejo v telesu ene transakcije: če se sprožilec vrne nazaj, bodo tudi uporabniške spremembe zavrnjene. Za vsako operacijo lahko definirate več sprožilcev AFTER (INSERT, UPDATE, DELETE). Če imate v tabeli več prožilcev AFTER, lahko s sistemsko shranjeno proceduro sp_settriggerorder podate, kateri prožilec se bo zagnal prvi in ​​kateri zadnji. Privzeto so v strežniku SQL vsi sprožilci sprožilci PO.
  • NAMESTO . Namesto izvajanja ukazov se kliče sprožilec. Za razliko od sprožilca AFTER lahko sprožilec INSTEAD OF definirate tako za tabelo kot za pogled. Za vsako operacijo INSERT, UPDATE, DELETE je mogoče definirati samo en prožilec INSTEAD OF.

Sprožilci se razlikujejo po vrsti ukazov, na katere se odzivajo.

Obstajajo tri vrste sprožilcev:

  • INSERT TRIGGER – Sproži se, ko se poskusi vstaviti podatke z ukazom INSERT.
  • UPDATE TRIGGER – sproži se ob poskusu spremembe podatkov z ukazom UPDATE.
  • DELETE TRIGGER – sproži se ob poskusu brisanja podatkov z ukazom DELETE.

Konstrukcije [ IZBRIŠI] [,] [ VSTAVI] [,] [ POSODOBI] in ZA | PO | NAMESTO ) ([,] določite, na kateri ukaz se bo sprožilec odzval. Pri ustvarjanju mora biti določen vsaj en ukaz. Dovoljeno ustvarjanje sprožilca, odziv na dva ali vse tri ukaze.

WITH APPEND vam omogoča ustvarjanje več sprožilcev vsake vrste.

pri ustvarjanje sprožilca z argumentom NOT FOR REPLICATION je prepovedano izvajati, medtem ko se tabele spreminjajo z mehanizmi podvajanja.

Konstrukcija AS sql_operator[...n] definira nabor stavkov SQL in ukazov, ki bodo izvedeni ob zagonu sprožilca.

Upoštevajte, da številne operacije niso dovoljene znotraj sprožilca, kot so:

  • ustvarjanje, spreminjanje in brisanje baze podatkov;
  • obnovitev varnostno kopijo baze podatkov ali dnevnika transakcij.

Teh ukazov ni dovoljeno izvajati, ker jih ni mogoče povrniti, če se transakcija, v kateri je bil izveden sprožilec, povrne nazaj. Ta prepoved verjetno ne bo kakor koli vplivala na funkcionalnost ustvarjenih sprožilcev. Težko je najti situacijo, ko bi na primer po spremembi vrstice tabele morali obnoviti varnostno kopijo dnevnika transakcij.

Programiranje sprožilcev

Pri izvajanju ukazov za dodajanje, spreminjanje in brisanje zapisov strežnik ustvari dve posebni tabeli: vstavljeno in izbrisano. Vsebujejo sezname vrstic, ki bodo vstavljene ali izbrisane, ko bo transakcija končana. Struktura vstavljenih in izbrisanih tabel je enaka strukturi tabel, za katere je definiran sprožilec. Vsak sprožilec ustvari svoj niz vstavljenih in izbrisanih tabel, tako da noben drug prožilec ne more dostopati do njih. Odvisno od vrste operacije, ki je povzročila izvedbo sprožilca, je lahko vsebina vstavljenih in izbrisanih tabel drugačna:

  • Ukaz INSERT – vstavljena tabela vsebuje vse vrstice, ki jih uporabnik poskuša vstaviti v tabelo; v izbrisani tabeli ne bo niti ene vrstice; ko se sprožilec zaključi, bodo vse vrstice iz vstavljene tabele premaknjene v izvorno tabelo;
  • Ukaz DELETE – izbrisana tabela bo vsebovala vse vrstice, ki jih uporabnik želi izbrisati; sprožilec lahko preveri vsako vrstico in ugotovi, ali jo je dovoljeno izbrisati; v vstavljeni tabeli ne bo vrstic;
  • Ukaz UPDATE - ko se izvede, izbrisana tabela vsebuje stare vrednosti vrstic, ki bodo izbrisane po uspešnem zaključku

Zadnja posodobitev: 09.11.2017

Sprožilci so posebna vrsta shranjene procedure, ki se samodejno pokliče, ko se na tabeli ali pogledu izvede določeno dejanje, zlasti pri dodajanju, spreminjanju ali brisanju podatkov, torej pri izvajanju ukazov INSERT, UPDATE, DELETE.

Formalna definicija sprožilca:

CREATE TRIGGER ime_sprožilca ON (ime_tabele | ime_pogleda) (ZA | NAMESTO) AS sql_expressions

Če želite ustvariti sprožilec, uporabite stavek CREATE TRIGGER, ki mu sledi ime prožilca. Običajno ime sprožilca odraža vrsto operacije in ime tabele, v kateri se operacija izvaja.

Vsak sprožilec je povezan z določeno tabelo ali pogledom, katerega ime je navedeno za besedo ON.

Nato se nastavi vrsta sprožilca. Uporabimo lahko eno od dveh vrst:

    PO: Izvede se po zaključku dejanja. Določeno samo za tabele.

    NAMESTO: izvede se namesto dejanja (to pomeni, da dejanje - dodajanje, spreminjanje ali brisanje - sploh ni izvedeno). Določeno za tabele in poglede

Za tipom sprožilca sledi navedba operacije, za katero je sprožilec definiran: INSERT, UPDATE ali DELETE.

Za sprožilec AFTER ga lahko uporabite za več dejanj hkrati, na primer za UPDATE in INSERT. V tem primeru so operacije označene ločene z vejicami. Za sprožilec NAMESTO lahko definirate samo eno dejanje.

In potem za besedo AS pride niz izrazov SQL, ki dejansko sestavljajo telo sprožilca.

Ustvarimo sprožilec. Recimo, da imamo bazo podatkov productsdb z naslednjo definicijo:

USTVARI BAZO PODATKOV productdb; POJDI UPORABITI productdb; CREATE TABLE Products (Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL);

Določimo sprožilec, ki se bo sprožil pri dodajanju in posodabljanju podatkov:

UPORABA productdb; GO CREATE TRIGGER Products_INSERT_UPDATE ON Products AFTER INSERT, UPDATE AS UPDATE Products SET Cena = Cena + Cena * 0,38 WHERE Id = (IZBERITE Id FROM vstavljen)

Recimo, da so v tabeli Izdelki shranjeni podatki o izdelkih. Toda cena izdelka pogosto vsebuje različne dodatke, kot so davek na dodano vrednost, davek na korupcijo itd. Tisti, ki dodaja podatke, morda ne pozna vseh teh tankosti z davčno osnovo in določi neto ceno. S pomočjo sprožilca lahko prilagodimo ceno izdelka za določen znesek.

Na ta način se bo sprožilec sprožil pri kateri koli operaciji INSERT ali UPDATE v tabeli izdelkov. Sprožilec bo sam spremenil ceno izdelka in da dobimo izdelek, ki je bil dodan ali spremenjen, najdemo ta izdelek po Id. Toda kakšno vrednost bi moral imeti ID takega izdelka? Dejstvo je, da se ob dodajanju ali spreminjanju podatkov le-ti shranijo v vstavljeno vmesno tabelo. Ustvari se samodejno. In iz njega lahko dobimo podatke o dodanih/spremenjenih izdelkih.

In po dodajanju izdelka v tabelo Izdelki bo v resnici izdelek imel nekoliko višjo ceno od tiste, ki je bila določena ob dodajanju:

Odstranjevanje sprožilca

Če želite odstraniti sprožilec, morate uporabiti ukaz DROP TRIGGER:

DROP TRIGGER Products_INSERT_UPDATE

Onemogočanje sprožilca

Zgodi se, da želimo začasno ustaviti sprožilec, vendar ga ne želimo popolnoma odstraniti. V tem primeru ga lahko začasno onemogočite z ukazom DISABLE TRIGGER:

DISABLE TRIGGER Products_INSERT_UPDATE ON Products

In ko potrebujete sprožilec, ga lahko omogočite z ukazom ENABLE TRIGGER:

ENABLE TRIGGER Products_INSERT_UPDATE ON Products

Sprožilec je podprogram, podoben postopku baze podatkov, ki ga DBMS samodejno pokliče, ko spremeni, izbriše ali doda zapis v tabeli. Do sprožilcev ni mogoče dostopati iz programa, jim posredovati parametrov ali od njih prejeti rezultatov. Najpogosteje se sprožilci uporabljajo za vzdrževanje referenčne celovitosti in kaskadnih operacij v bazi podatkov. Referenčne specifikacije, ki definirajo kaskadna dejanja brisanja in posodabljanja in so ustvarjene, ko so deklarirane tabele, so prav tako implementirane prek prožilcev, vendar besedila teh prožilcev ni mogoče urejati.

Namen sprožilcev

Preprečite spremembe (na primer preprečite spreminjanje računov po tem, ko so bili poslani).
. Zabeležite spremembe (na primer ohranite kopije starih podatkov).
. Nadzorujte spremembe (na primer vodite dnevnik uporabnikov in vlog, vključenih v spremembe).
. Zajemite spremembe (na primer zagotovite, da so vse spremembe datirane glede na uro strežnika, ne odjemalca).
. Implementacija poslovnih pravil.
. Replikacija podatkov (na primer shranjevanje zapisa vseh sprememb, ki bodo v kasnejši različici poslane v drugo zbirko podatkov).
. Povečana produktivnost (na primer posodabljanje stanja po vsaki podrobnosti transakcije za pospešitev poizvedb).

Deklariranje sprožilcev

USTVARI SPROŽILEC {PREJ|POTEM} {IZBRIŠI|VSTAVI|POSODOBI [OF ]} VKLOP REFERENCA {STAR {[VRSTA]|TABELA [AS] } NOVO {VRSTICA|TABELA} [AS] }] [ZA VSAKOGAR {IZJAVA|VRSTICA [KDAJ ]}]
[ZAČNI ATOMSKO]

[KONEC]

Ključne besede

. PREJ|POTEM– začetni čas sprožitve – pred | po operaciji posodobitve.
. IZBRIŠI|VSTAVI|POSODOBI= sproži dogodek.
. ZA VSAKO VRSTICO– za vsako vrstico (sprožilec vrstice, nato WHEN).
. ZA VSAKO IZJAVO– za celotno ekipo (velja privzeto).
. REFERENCA– omogoča dodelitev do 4 vzdevkov starim in | ali nove vrstice in | ali tabel, do katerih je mogoče dostopati s sprožilci.

Omejitve sprožilcev

Telo sprožilca ne sme vsebovati naslednjih stavkov:
. Definiranje, brisanje in spreminjanje objektov baze podatkov (tabel, domen itd.)
. Obdelava transakcij (OBVEZI, POVRAT)
. Povezave in prekinitve povezave z bazo (CONNECT, DISCONNECT)

Značilnosti uporabe
. Sprožilec se izvede po izvedbi vseh drugih (deklarativnih) preverjanj celovitosti in je uporaben, kadar je testni kriterij precej zapleten. Če deklarativna preverjanja zavrnejo operacijo posodobitve, se sprožilci ne izvedejo. Sprožilec deluje v kontekstu transakcije, omejitev FK pa ne.
. Če sprožilec povzroči dodatno spremembo svoje osnovne tabele, potem to najpogosteje ne bo vodilo do njegove rekurzivne izvedbe, vendar je to treba pojasniti. SQL Server 2005 nudi možnost podajanja rekurzije do 255 ravni z uporabo ključne besede OPTION (MAXRECURSIV 3).
. Sprožilci se običajno ne izvajajo pri obdelavi velikih binarnih stolpcev (BLOB).
. Ne smemo pozabiti, da vsakič, ko se podatki posodobijo, DBMS samodejno ustvari tako imenovani sprožilec virtualne mize, ki imajo v različnih DBMS različna imena. V InterBase in Oracle – to sta novo in staro. V SQL Server – vstavljeno in izbrisano. Poleg tega se ob spremembi podatkov ustvarita oba. Te tabele imajo enako število stolpcev z enakimi imeni in domenami kot tabela, ki se posodablja. SQL Server 2005 DBMS omogoča določanje tabele, vključno z začasno tabelo, v katero je treba vstaviti podatke z uporabo ključne besede OUTPUT Inserted.ID,... INTO @.
. V številnih DBMS-jih je dovoljeno deklarirati sprožilce za več dejanj hkrati. Za izvajanje različnih reakcij na različna dejanja Oracle zagotavlja predikate Deleting, Inserting, Updating, ki vrnejo True za ustrezno vrsto posodobitve.
. V Oracle DBMS lahko podate seznam stolpcev (After Update Of) za sprožilce posodobitve, ki bodo zagotovili, da se sprožilec kliče le, ko se spremenijo vrednosti samo teh stolpcev.
. Za vsak sprožilni dogodek je mogoče deklarirati več sprožilcev (Oracle ima 12 sprožilcev na tabelo) in običajno je vrstni red, v katerem so sproženi, določen z vrstnim redom, v katerem so ustvarjeni. V nekaterih DBMS-jih, kot je InterBase, je vrstni red zagona določen z dodatno ključno besedo POSITION. Na splošno je treba sprožilce najprej izvesti za vsak ukaz in nato za vsako vrstico.
. Sprožilci so lahko vdelani drug v drugega. Tako SQL Server omogoča 32 ravni gnezdenja (za določitev ravni gnezdenja lahko uporabite globalno spremenljivko @@NextLevel).

Slabosti sprožilcev

Kompleksnost. Določanje nekaterih dejanj na podatke v zbirki podatkov zaplete njeno zasnovo, izvedbo in upravljanje.
. Stealth funkcionalnost od uporabnika. Težko je posodobiti aplikacijo, če so nekatere funkcije skrite.
. Vpliv na uspešnost. Z majhnim številom sprožilcev se čas obdelave podatkov poveča.

Urejanje in brisanje sprožilcev

Če želite odstraniti sprožilec, uporabite stavek DROP TRIGGER
. Če želite spremeniti sprožilec, uporabite stavek ALTER TRIGGER...
. Onemogočanje sprožilcev
V nekaterih primerih, na primer med paketnim nalaganjem, je treba sprožilce onemogočiti. Številni DBMS-ji nudijo ustrezne zmogljivosti. V Oracle in SQL Server so ključne besede DISABLE|ENABLE, v InterBase INACTIVE|ACTIVE v stavku ALTER TRIGGER.

Lastnosti industrijskih strežnikov

1) InterBase/Firebird

USTVARI SPROŽILEC ZA {AKTIVNO|NEAKTIVNO} {PREJ|POTEM} {VSTAVI|IZBRIŠI|POSODOBI} [POLOŽAJ ]
AS [DEKLARACIJO SPREMENLJIVKO [()]]
ZAČETI

KONEC

primer:

USTVARI SPROŽILEC BF_Del_Cust ZA stranko
AKTIVNO PRED IZBRISOM POLOŽAJA 1 KOT
ZAČETI
DELETE FROM Orders WHERE Orders.CNum=Customer.CNum;
KONEC;

2) SQL Server

USTVARI SPROŽILEC VKLOP [S ŠIFRIRANJO] {ZA|PO|NAMESTO} {VSTAVI|POSODOBI|IZBRIŠI}
AS

UPORABA B1;
POJDI
USTVARITE SPROŽILEC InUpCust1 ON Customer PO VSTAVLJANJU POSODOBITEV
AS RAISEERROR('Tabela strank spremenjena');

Dodatne vrste sprožilcev

Oracle in SQL Server nudita možnost ustvarjanja (nadomestnih) sprožilcev za poglede, ki niso posodobljeni. V ta namen so na voljo ključne besede INSTEAD OF:

USTVARI SPROŽILEC NA NAMESTO VSTAVITI KOT ...

Spremljate lahko poskuse odjemalcev, da posodobijo podatke z uporabo pogledov in izvedete poljubna dejanja, obravnavate poglede, ki niso posodobljeni itd.
. SQL Server DBMS ponuja sprožilec za povrnitev, ki dejansko ustavi vsa dejanja in izda sporočilo:

SPROŽILEC NAZAJ

Zapiski predavanj pri disciplini “Baze podatkov”

Tema: Postopki in sprožilci

(na primeru MS SQL Server)

sestavljalec: L. V. Shchegoleva

PetrSU, Oddelek za uporabno matematiko in kibernetiko

Uvod................................................. ......................................................... ............. ......

Opis strukture baze podatkov................................................. ............ ..............

Pojem postopka..................................................... .... ...................................

Ukazi za delo s procedurami............................................. ...................... .............

Koncept sprožilca ............................................. ...... ............................................

Ukazi za delo s sprožilci ............................................. .................... ....................

Primeri implementacij sprožilcev ............................................. ..... ...............

Primer 1................................................ ... ................................................

Primer 2................................................ ... ................................................

Primer 3................................................ ... ................................................

Primer 4................................................ ... ................................................

Primer 5................................................ ... ................................................

PetrSU, Oddelek za uporabno matematiko in kibernetiko

Uvod

IN V tem priročniku so primeri ukazov za ustvarjanje postopkov in sprožilcev

z opis njihovega dela.

Vsi ukazi so napisani v sintaksi MS SQL Server.

Primeri so podani za bazo podatkov, katere struktura je opisana v

razdelek 1.

PetrSU, Oddelek za uporabno matematiko in kibernetiko

1 Opis strukture baze podatkov

Tabela tblFaculty vsebuje podatke o fakultetah univerze.

Ime

Opis

atribut

ID fakultete

Ime fakultete

Polno ime dekana

Številka dekana

Telefonska številka dekanata

Število študentov fakultete

Tabela tblStudent vsebuje podatke o študentih v enem študijskem letu.

Ime atributa

Opis

Študentska izkaznica

Ime študenta

Štipendija

Tabela tblGroup vsebuje podatke o študentskih skupinah univerze v enem študijskem letu.

Ime atributa

Opis

ID skupine

Ravnatelj

Številka skupine

fakulteta

Tabela tblSubject vsebuje podatke o disciplinah, ki jih študirajo študenti fakultete v enem študijskem letu.

Ime atributa

Opis

ID artikla

Ime izdelka

Število ur predavanj

Število ur vadbe

fakulteta

Zapiski predavanj pri disciplini “Baze podatkov” (Postopki in sprožilci)

PetrSU, Oddelek za uporabno matematiko in kibernetiko

Tabela tblRoom vsebuje informacije o univerzitetnih učilnicah.

Tabela tblSchedule vsebuje podatke o razporedu študentskih skupin.

Ime atributa

Opis

Identifikator

Občinstvo

Dan v tednu

Polno ime učitelja

PetrSU, Oddelek za uporabno matematiko in kibernetiko

2 Pojem postopka

Procedura je program, napisan v internem jeziku DBMS, shranjen v bazi podatkov kot neodvisen objekt. Takšni postopki se običajno imenujejo shranjene, priložene procedure. Postopke lahko kliče aplikacijski program. Postopki se izvajajo na strežniku baze podatkov. Postopki lahko vsebujejo parametre in vrnjene vrednosti, vključno s sporočili o napakah.

Prednosti uporabe postopkov:

centraliziran nadzor dostopa do podatkov;

aplikacijski programi lahko kličejo proceduro, kar skrajša čas pisanja programov, ob spremembi procedure bodo vsi programi, ki jo kličejo, prejeli novo kodo, optimizacija kode;

zmanjša omrežni promet v sistemih“odjemalec-strežnik” tako, da namesto izmenjave podatkov posreduje samo ime procedure in njene parametre, procedura pa se izvede na strežniku;

skrivanje številnih funkcij pred uporabnikom določeno napravo baze podatkov, kar zagotavlja večjo neodvisnost podatkov;

večja varnost podatkov, lahko uporabnik pravico klicati

postopek, vendar ne manipulira s podatki, ki jih kliče ta postopek; Slabost: pomanjkanje standardov pri izvajanju postopkov.

PetrSU, Oddelek za uporabno matematiko in kibernetiko

3 Ukazi za delo s procedurami v MS SQL Server

Ustvarjanje postopka

USTVARITE POSTOPEK<имя процедуры>

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

ZAČETI

<операторы>

Imena vseh spremenljivk v strežniku MS SQL Server se morajo začeti s simbolom

Klicanje postopka

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

Odstranjevanje postopka

POSTOPEK ODPUŠČANJA<имя процедуры>

Postopek prešteje število študentov, vpisanih v oddelek, katerega identifikator je vhodni parameter procedure @id, in vrne to vrednost v parametru @total_sum.

Ustvarite postopek prStudentsOfFaculty @id int, @total_sum int izhod AS

Nastavite @total_sum = 0

Set @total_sum = (Izberite count(*) From tblStudent, tblGroup Where (tblStudent.GroupId = tblGroup.GroupId) in (tblGroup.FacultyId = @id)) End

PetrSU, Oddelek za uporabno matematiko in kibernetiko

4 Koncept sprožilca

Sprožilec (pravilo) je pritrjen na tabelo in ga samodejno pokliče sistem za upravljanje baz podatkov, ko se v tabeli izvajajo operacije posodabljanja (dodajanje, brisanje, spreminjanje zapisov tabele).

Značilnosti implementacije sprožilcev v MS SQL Server

V MS SQL Server:

sprožilec se lahko pokliče po izvedbi operacije ali namesto operacije, ki se izvaja;

sprožilec se pokliče enkrat za vse zapise tabele, na katerih je treba izvesti operacijo;

zato so zapisi, ki se spreminjajo, shranjeni v dveh tabelah, ki se samodejno ustvarita ob klicu sprožilca:

o Vstavljena tabela – vsebuje spremenjene ali dodane zapise tabele;

o Izbrisana tabela – vsebuje zapise pred spremembami ali izbrisane zapise tabele;

v telesu sprožilca, definiranega za operacijo vstavljanja, je na voljo samo tabela

v telesu sprožilca, definiranega za operacijo Izbriši, je na voljo samo tabela

v telesu sprožilca, definiranega za operacijo Posodobi, sta na voljo obe tabeli

Vstavljeno in izbrisano;

Za isti dogodek je mogoče ustvariti poljubno število sprožilcev, klicani pa so v naključnem vrstnem redu (po možnosti v vrstnem redu, v katerem so bili ustvarjeni).

PetrSU, Oddelek za uporabno matematiko in kibernetiko

5 Ukazi za delo s sprožilci

Ustvarjanje

USTVARI SPROŽILEC<имя триггера>VKLOP<имя таблицы>

(ZA | ZA | NAMESTO )

[VSTAVI] [,] [POSODOBI] [,] [IZBRIŠI] AS

PRIJAVITE @<имя переменной> <тип данных>, ...

ZAČETI<операторы>

Odstranitev

SPUSTI SPROŽILEC<имя триггера>

PetrSU, Oddelek za uporabno matematiko in kibernetiko

6 Primeri implementacij sprožilcev

Omejitev predmetnega področja:Študentska štipendija se ne more zvišati za več kot 5 % prejšnje štipendije.

USTVARI SPROŽILEC tgrStudentGrantUpdate

NA tblStudent PO POSODOBITVI

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

Izberite @Grant_old = Dodeli iz izbrisanih

Izberite @Grant_new = Grant, @Id = StudentId iz Vstavljeno

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

POSODOBITE tblStudent SET Grant = 1,05 * @Grant_old

WHERE StudentId = @Id

Sprožilec tgrStudentGrantUpdate je bil ustvarjen za tabelo tblStudent. Sprožilec se bo sprožil, ko bo operacija spremembe podatkov končana.

IN Sprožilec definira tri lokalne spremenljivke: @Grant_old (resnični tip) za shranjevanje stare študentske štipendije, @Grant_new (pravi tip) za shranjevanje nove študentske štipendije, @Id (celoštevilski tip) za shranjevanje identifikatorja študenta.

Ko je sprožilec poklican, DBMS ustvari dve tabeli: Izbrisano, ki vsebuje spremenjene zapise, preden so spremenjeni, in Vstavljeno, ki vsebuje spremenjene zapise, potem ko so spremenjeni.

IN V telesu sprožilca se najprej pridobi vrednost študentske štipendije iz tabele Izbrisano, preden se izvedejo spremembe, torej stare štipendije, nato se vrednost študentske štipendije pridobi iz tabele Vstavljeno po spremembe, tj. nova štipendija. Skupaj s pridobivanjem nove štipendije iz tabele Vstavljeno se pridobi tudi identifikator študenta. ID študenta bi lahko prav tako preprosto pridobili iz tabele Izbrisano.

Nato se v telesu sprožilca preveri pogoj o višini spremembe štipendije. Če se je štipendija spremenila za več kot 5%, potem sprožilec podatke prilagodi - zviša štipendijo le za 5% glede na študentovo prejšnjo vrednost štipendije. To dejanje se izvede s klicem operacije Posodobi v tabeli tblStudent za ustreznega študenta.

Podana je definicija sprožilca, obseg njegove uporabe, mesto in vloga sprožilca pri zagotavljanju celovitosti podatkov. Opisane so vrste sprožilcev. Upoštevani so operatorji za ustvarjanje, spreminjanje in brisanje sprožilca. Programiranje sprožilcev je ponazorjeno s primeri ustvarjanja sprožilcev za izvajanje omejitev integritete in zbiranje statističnih podatkov.

Definicija sprožilca v jezikovnem standardu SQL

Sprožilci so vrsta shranjene procedure. Izvedejo se, ko se na tabeli izvede operator jezika za obdelavo podatkov (DML). Sprožilci se uporabljajo za preverjanje celovitosti podatkov in tudi za povrnitev transakcij.

Sprožilec je prevedena procedura SQL, katere izvedba je povzročena z nastopom določenih dogodkov v relacijski bazi podatkov. Uporaba sprožilcev je večinoma zelo priročna za uporabnike baze podatkov. Kljub temu njihova uporaba pogosto vključuje dodatne stroške virov za V/I operacije. Ko je enake rezultate (z veliko manj stroškov) mogoče doseči z uporabo shranjenih procedur ali aplikacijskih programov, uporaba sprožilcev ni praktična.

Sprožilci so posebno orodje strežnika SQL, ki se uporablja za vzdrževanje celovitosti podatkov v bazi podatkov. Omejitve celovitosti, pravila in privzete vrednosti morda ne bodo vedno dosegle želene ravni funkcionalnosti. Pogosto je treba implementirati zapletene algoritme za preverjanje podatkov, da se zagotovi njihova zanesljivost in resničnost. Poleg tega morate včasih spremljati spremembe v vrednostih tabele, tako da je mogoče povezane podatke po potrebi spremeniti. Sprožilce si lahko predstavljamo kot nekakšne filtre, ki začnejo veljati, ko so vse operacije zaključene v skladu s pravili, standardnimi vrednostmi itd.

Sprožilec je posebna vrsta shranjene procedure, ki jo samodejno zažene strežnik, ko se poskusi spremeniti podatke v tabelah, s katerimi so sprožilci povezani. Vsak sprožilec je povezan z določeno tabelo. Vse spremembe podatkov, ki jih naredi, se obravnavajo kot ena transakcija. Če je zaznana napaka ali kršitev celovitosti podatkov, se transakcija povrne nazaj. Spremembe so torej prepovedane. Razveljavijo se tudi vse spremembe, ki jih je že izvedel sprožilec.

Samo lastnik baze podatkov lahko ustvari sprožilec. Ta omejitev vam omogoča, da se izognete nenamernim spremembam strukture tabel, načinov povezovanja drugih predmetov z njimi itd.

Sprožilec je zelo uporabno in hkrati nevarno orodje. Torej, če je logika njegovega delovanja napačna, lahko zlahka uničite celotno bazo podatkov, zato je treba sprožilce zelo previdno odpraviti.

Za razliko od običajne rutine se sprožilec implicitno izvede vsakič, ko se pojavi. sprožilni dogodek, poleg tega pa nima argumentov. Aktiviranje se včasih imenuje sprožitev sprožilca. Z uporabo sprožilcev se dosežejo naslednji cilji:

  • Preverjanje pravilnosti vnesenih podatkov in uveljavljanje zapletenih omejitev celovitosti podatkov, ki jih je težko, če ne nemogoče, vzdrževati z uporabo omejitev celovitosti, nastavljenih na tabeli;
  • izdajanje opozoril, ki vas opominjajo, da izvedete določena dejanja pri posodabljanju tabele, implementirane na določen način;
  • zbiranje revizijskih informacij z beleženjem informacij o opravljenih spremembah in osebah, ki so jih izvedle;
  • podpora replikacije.

Osnovna oblika ukaza CREATE TRIGGER je prikazana spodaj:

<Определение_триггера>::= CREATE TRIGGER trigger_name BEFORE | PO<триггерное_событие>VKLOP<имя_таблицы> <тело_триггера>

sproži dogodke sestavljajo vstavljanje, brisanje in posodabljanje vrstic v tabeli. V slednjem primeru za sprožilni dogodek Določite lahko posebna imena stolpcev tabele. Čas sprožitve se določi z uporabo ključne besede PRED (sprožilec se sproži, preden se izvedejo z njim povezani dogodki) ali PO (potem ko se izvedejo).

Dejanja, ki jih izvaja sprožilec, so določena za vsako vrstico (ZA VSAKO VRSTICO), ki jo pokriva dani dogodek, ali samo enkrat za vsak dogodek (ZA VSAK STAVEK).

Imenovanje <список_старых_или_новых_псевдонимов> nanaša na komponente, kot so stare oz nova vrstica(STARO/NOVO) ali staro oz nova tabela(STARA MIZA / NOVA MIZA). Jasno je, da stare vrednosti ne veljajo za vstavljanje dogodkov, nove vrednosti pa ne veljajo za brisanje dogodkov.

Ob pravilni uporabi so sprožilci lahko zelo močan mehanizem. Njihova glavna prednost je, da so standardne funkcije shranjene v bazi podatkov in se dosledno aktivirajo ob vsaki posodobitvi. To lahko zelo poenostavi aplikacije. Vendar je vredno omeniti slabosti sprožilca:

  • kompleksnost: ko se nekatere funkcije premaknejo v bazo podatkov, postanejo naloge njenega oblikovanja, implementacije in administracije bolj kompleksne;
  • Skrita funkcionalnost: Premik nekaterih funkcij v zbirko podatkov in njihovo shranjevanje kot enega ali več sprožilcev včasih povzroči, da so nekatere funkcije skrite pred uporabnikom. Čeprav to do neke mere poenostavi njeno delovanje, lahko na žalost povzroči nenamerne, potencialno neželene in škodljive stranske učinke, saj v tem primeru uporabnik ne more nadzorovati vseh procesov, ki se dogajajo v bazi podatkov;
  • vpliv na zmogljivost: pred izvedbo vsakega ukaza za spremembo stanja baze podatkov mora DBMS preveriti pogoj sprožilca, da ugotovi, ali naj se za ta ukaz sproži sprožilec. Izvajanje takšnih izračunov vpliva na celotno zmogljivost DBMS, v času največje obremenitve pa lahko postane njeno zmanjšanje še posebej opazno. Očitno se z večanjem števila sprožilcev povečujejo tudi režijski stroški, povezani s takimi operacijami.

Nepravilno napisani sprožilci lahko povzročijo resne težave, kot so mrtve ključavnice. Sprožilci lahko dolgoročno blokirajo številne vire, zato je treba posebno pozornost nameniti zmanjšanju konfliktov pri dostopu.

Implementacija sprožilcev v okolju MS SQL Server

Izvedba DBMS strežnika MS SQL Server uporablja naslednji operater ustvarjanja ali spreminjanja sprožilca:

<Определение_триггера>::= (USTVARI | SPREMENI) SPROŽILEC ime_sprožilca ON (ime_tabele | ime_pogleda) ( ( ( ZA | PO | NAMESTO ) ( [ IZBRIŠI] [,] [ VSTAVI] [,] [ POSODOBI] ) [ Z DODAJANJEM ] [ NI ZA REPLIKACIJA ] AS sql_statement[...n] ) | ( (ZA | ZA | NAMESTO ) ( [,] ) [ Z PRIPODANJEM] [ NI ZA PODVOJITEV] AS ( ČE POSODOBITE(ime_stolpca) [ (IN | ALI) POSODOBITE( ime_stolpca)] [...n] | IF (COLUMNS_UPDATES() (process_bit_operator) change_bit_mask) (primerjalni_bit_operator) bit_mask [...n]) sql_operator [...n] ) )

Sprožilec je mogoče ustvariti samo v trenutni bazi podatkov, vendar je mogoče dostopati do drugih baz podatkov znotraj sprožilca, vključno s tistimi, ki se nahajajo na oddaljenem strežniku.

Oglejmo si namen argumentov iz ukaza CREATE | SPREMENI SPROŽILEC.

Ime sprožilca mora biti enolično znotraj baze podatkov. Poleg tega lahko določite ime lastnika.

Ko podate argument WITH ENCRYPTION, strežnik šifrira sprožilno kodo, tako da nihče, vključno s skrbnikom, ne more dostopati do nje ali jo prebrati. Šifriranje se pogosto uporablja za skrivanje lastniških algoritmov za obdelavo podatkov, ki so programerjeva intelektualna lastnina ali poslovna skrivnost.

Vrste sprožilcev

V strežniku SQL Server obstajata dve možnosti, ki določata obnašanje sprožilcev:

  • PO. Sprožilec se izvede, ko so ukazi, ki so ga poklicali, uspešno zaključeni. Če ukazov ni mogoče uspešno dokončati iz kakršnega koli razloga, se sprožilec ne izvede. Upoštevati je treba, da se spremembe podatkov zaradi izvajanja uporabniške zahteve in izvajanja sprožilca izvedejo v telesu ene transakcije: če se sprožilec vrne nazaj, bodo tudi uporabniške spremembe zavrnjene. Za vsako operacijo lahko definirate več sprožilcev AFTER (INSERT, UPDATE, DELETE). Če imate v tabeli več prožilcev AFTER, lahko s sistemsko shranjeno proceduro sp_settriggerorder podate, kateri prožilec se bo zagnal prvi in ​​kateri zadnji. Privzeto so v strežniku SQL vsi sprožilci sprožilci PO.
  • NAMESTO . Namesto izvajanja ukazov se kliče sprožilec. Za razliko od sprožilca AFTER lahko sprožilec INSTEAD OF definirate tako za tabelo kot za pogled. Za vsako operacijo INSERT, UPDATE, DELETE je mogoče definirati samo en prožilec INSTEAD OF.

Sprožilci se razlikujejo po vrsti ukazov, na katere se odzivajo.

Obstajajo tri vrste sprožilcev:

  • INSERT TRIGGER – Sproži se, ko se poskusi vstaviti podatke z ukazom INSERT.
  • UPDATE TRIGGER – sproži se ob poskusu spremembe podatkov z ukazom UPDATE.
  • DELETE TRIGGER – sproži se ob poskusu brisanja podatkov z ukazom DELETE.

Konstrukcije [ IZBRIŠI] [,] [ VSTAVI] [,] [ POSODOBI] in ZA | PO | NAMESTO ) ([,] določite, na kateri ukaz se bo sprožilec odzval. Pri ustvarjanju mora biti določen vsaj en ukaz. Dovoljeno ustvarjanje sprožilca, odziv na dva ali vse tri ukaze.

WITH APPEND vam omogoča ustvarjanje več sprožilcev vsake vrste.

pri ustvarjanje sprožilca z argumentom NOT FOR REPLICATION je prepovedano izvajati, medtem ko se tabele spreminjajo z mehanizmi podvajanja.

Konstrukcija AS sql_operator[...n] definira nabor stavkov SQL in ukazov, ki bodo izvedeni ob zagonu sprožilca.

Upoštevajte, da številne operacije niso dovoljene znotraj sprožilca, kot so:

  • ustvarjanje, spreminjanje in brisanje baze podatkov;
  • obnovitev baze podatkov ali varnostne kopije dnevnika transakcij.

Teh ukazov ni dovoljeno izvajati, ker jih ni mogoče povrniti, če se transakcija, v kateri je bil izveden sprožilec, povrne nazaj. Ta prepoved verjetno ne bo kakor koli vplivala na funkcionalnost ustvarjenih sprožilcev. Težko je najti situacijo, ko bi na primer po spremembi vrstice tabele morali obnoviti varnostno kopijo dnevnika transakcij.

Programiranje sprožilcev

Pri izvajanju ukazov za dodajanje, spreminjanje in brisanje zapisov strežnik ustvari dve posebni tabeli: vstavljeno in izbrisano. Vsebujejo sezname vrstic, ki bodo vstavljene ali izbrisane, ko bo transakcija končana. Struktura vstavljenih in izbrisanih tabel je enaka strukturi tabel, za katere je definiran sprožilec. Vsak sprožilec ustvari svoj niz vstavljenih in izbrisanih tabel, tako da noben drug prožilec ne more dostopati do njih. Odvisno od vrste operacije, ki je povzročila izvedbo sprožilca, je lahko vsebina vstavljenih in izbrisanih tabel drugačna:

  • Ukaz INSERT – vstavljena tabela vsebuje vse vrstice, ki jih uporabnik poskuša vstaviti v tabelo; v izbrisani tabeli ne bo niti ene vrstice; ko se sprožilec zaključi, bodo vse vrstice iz vstavljene tabele premaknjene v izvorno tabelo;
  • Ukaz DELETE – izbrisana tabela bo vsebovala vse vrstice, ki jih uporabnik želi izbrisati; sprožilec lahko preveri vsako vrstico in ugotovi, ali jo je dovoljeno izbrisati; v vstavljeni tabeli ne bo vrstic;
  • Ukaz UPDATE - ko se izvede, izbrisana tabela vsebuje stare vrednosti vrstic, ki bodo izbrisane po uspešnem zaključku sprožilca. Vrednosti nove vrstice so vsebovane v vstavljeni tabeli. Te vrstice bodo dodane v izvorno tabelo, ko bo sprožilec uspešno izveden.

Če želite pridobiti informacije o številu vrstic, ki bodo spremenjene, ko se sprožilec uspešno zaključi, lahko uporabite funkcijo @@ROWCOUNT;. vrne število vrstic, ki jih je obdelal zadnji ukaz. Poudariti je treba, da se sprožilec ne sproži, ko se poskuša spremeniti določena vrstica, ampak v trenutku, ko se izvede ukaz za spremembo. En tak ukaz vpliva na številne vrstice, zato mora sprožilec obdelati vse te vrstice.

Če sprožilec zazna, da od 100 vrstic, ki jih vstavljate, spreminjate ali brišete, samo ena ne izpolnjuje določenih pogojev, potem nobena vrstica ne bo vstavljena, spremenjena ali izbrisana. To vedenje je posledica zahtev transakcije - ali morajo biti izvedene vse spremembe ali nobene.

Sprožilec se izvede kot implicitno definirana transakcija, tako da je mogoče znotraj sprožilca uporabiti ukaze za nadzor transakcije. Natančneje, ko je zaznana kršitev omejitve celovitosti, je treba uporabiti ukaz ROLLBACK TRANSACTION za prekinitev sprožilca in razveljavitev vseh sprememb, ki jih je uporabnik poskušal izvesti.

S funkcijo COLUMNS_UPDATED() lahko pridobite seznam stolpcev, ki so bili spremenjeni z ukazoma INSERT ali UPDATE, ki sta povzročila izvedbo sprožilca. Vrne binarno število, katerega vsak bit, začenši z najmanj pomembnim bitom, ustreza enemu stolpcu tabele (v vrstnem redu stolpcev, ko je bila tabela ustvarjena). Če je bit nastavljen na "1", je bil ustrezni stolpec spremenjen. Poleg tega dejstvo, da se je stolpec spremenil, določi funkcija UPDATE (ime_stolpca).

Za odstranite sprožilec ukaz se uporablja

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

Tukaj so primeri uporabe sprožilcev.

Primer 14.1. Uporaba sprožilca za izvajanje omejitev vrednosti. V vnosu, dodanem v tabelo Transakcije, količina prodanega izdelka ne sme biti manjša od njegovega stanja iz tabele Skladišče.

Ukaz za vstavljanje zapisa v tabelo Deal je lahko na primer tak:

VSTAVITE V VREDNOSTI trgovanja (3,1,-299,"01/08/2002")

Ustvarjeni sprožilec naj se na njegovo izvedbo odzove na naslednji način: ukaz je potrebno preklicati, če je v tabeli Skladišče stanje manjše od prodane količine izdelka z vneseno kodo (v primeru šifra proizvoda = 3 ). V vnesenem zapisu je količina izdelka označena z znakom »+«, če je izdelek dobavljen, in z znakom »-«, če je prodan. Predstavljeni sprožilec je konfiguriran za obdelavo samo enega dodanega zapisa.

CREATE TRIGGER Trigger_ins ON Transaction FOR INSERT AS IF @@ROWCOUNT=1 BEGIN IF NOT EXISTS(SELECT * FROM inserted WHERE -inserted.quantity<=ALL(SELECT Склад.Остаток FROM Склад,Сделка WHERE Склад.КодТовара= Сделка.КодТовара)) BEGIN ROLLBACK TRAN PRINT "Отмена поставки: товара на складе нет" END END Primer 14.1. Uporaba sprožilca za izvajanje omejitev vrednosti.

Primer 14.2. Uporaba sprožilca za zbiranje statističnih podatkov.

Ustvarite sprožilec za obdelavo operacije vstavljanja zapisa v tabelo Deal, na primer naslednji ukaz:

VSTAVITE V VREDNOSTI trgovanja (3,1,200,"01/08/2002")

Izdelek s šifro 3 je dobavljen od naročnika s šifro 1 v količini 200 enot.

Pri prodaji ali prejemu artikla je potrebno ustrezno prilagoditi količino zalog. Če izdelek še ni na zalogi, morate dodati ustrezen vnos v tabelo Skladišče. Sprožilec obdela samo eno dodano vrstico.

ALTER TRIGGER Trigger_ins ON Transaction FOR INSERT AS DECLARE @x INT, @y INT IF @@ROWCOUNT=1 --v tabelo Transaction se doda zapis o dostavi blaga BEGIN --količina prodanega blaga ne sme biti -- manj kot njegovo stanje iz tabele skladišča IF NOT EXISTS(SELECT * FROM inserted WHERE -inserted.quantity< =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 Primer 14.2. Uporaba sprožilca za zbiranje statističnih podatkov.

Primer 14.3. Ustvarite sprožilec za obdelavo operacije brisanja zapisa iz tabele Deal, na primer naslednji ukaz:

Za izdelek, katerega šifra je bila podana ob brisanju zapisa, je potrebno prilagoditi stanje na zalogi. Sprožilec obdela samo en zapis, ki ga je treba izbrisati.

CREATE TRIGGER Trigger_del ON Transaction FOR DELETE AS IF @@ROWCOUNT=1 -- en zapis je izbrisan BEGIN DECLARE @y INT,@x INT --koda in količina izdelka se določita iz --zapisa, izbrisanega iz tabele Warehouse SELECT @y=Koda izdelka, @ x=Količina FROM izbrisano --v tabeli Warehouse je količina --item prilagojena UPDATE Warehouse SET Remaining=Remaining-@x WHERE Product Code=@y END Primer 14.3. Sprožilec za obdelavo operacije brisanja zapisa iz tabele

Primer 14.4. Ustvarite sprožilec za obdelavo operacije spreminjanja zapisa v tabeli Deal, na primer z naslednjim ukazom:

pri vseh transakcijah z blagom s šifro 3 zmanjšajte količino blaga za 10 enot.

Podan ukaz lahko povzroči spremembe v več zapisih hkrati v tabeli Deal. Zato bomo pokazali, kako ustvariti sprožilec, ki obdeluje več kot en zapis. Za vsako spremenjeno vknjižbo je potrebno za staro (pred spremembo) šifro artikla zmanjšati stanje artikla v skladišču za vrednost stare (pred spremembo) količine proizvoda in za novo (po spremembi). sprememba) šifre izdelka za povečanje njegovega stanja v skladišču za vrednost nove (po spremembi) vrednosti. Za obdelavo vseh spremenjenih zapisov bomo uvedli kazalce, v katere bomo shranili vse stare (iz izbrisane tabele) in vse nove vrednosti (iz vstavljene tabele).

CREATE TRIGGER Trigger_upd ON Transaction FOR UPDATE AS DECLARE @x INT, @x_old INT, @y INT, @y_old INT -- kazalec z novimi vrednostmi ​​DECLARE CUR1 CURSOR FOR SELECT Koda izdelka, količina FROM vstavljena -- kazalec s starimi vrednostmi​ ​DECLARE CUR2 CURSOR FOR SELECT Koda izdelka, količina FROM izbrisano OPEN CUR1 OPEN CUR2 -- premikanje vzporedno skozi oba kazalca FETCH NEXT FROM CUR1 INTO @x, @y FETCH NEXT FROM CUR2 INTO @x_old, @y_old WHILE @@FETCH_STATUS=0 BEGIN -- za staro šifro izdelka se zmanjša --količina v skladišču UPDATE Warehouse SET Remaining=Remaining-@y_old WHERE Product Code=@x_old --za novo šifro izdelka, če takega izdelka še ni na zalogi, vnese se nov zapis ČE NE OBSTAJA (SELECT * FROM Warehouse WHERE Product Code=@x) INSERT INTO Warehouse(Product Code, Remaining) VALUES (@x,@y) ALSE --sicer se za novo kodo izdelka poveča -- njegova količina na zalogi UPDATE Warehouse SET Remaining=Remaining+@y WHERE Product Code=@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 Primer 14.4. sprožilec za obdelavo operacije za spremembo zapisa v tabeli

V obravnavanem sprožilcu ni primerjave količine blaga ob spremembi transakcijskega zapisa z njegovim stanjem v skladišču.

Primer 14.5. Popravimo to pomanjkljivost. Za generiranje sporočila o napaki uporabimo ukaz MS SQL Server RAISERROR v telesu sprožilca, katerega argumenti so besedilo sporočila, stopnja resnosti in status napake.

ALTER TRIGGER Trigger_upd ON Transakcija FOR UPDATE AS DECLARE @x INT, @x_old INT, @y INT, @y_old INT ,@o INT DECLARE CUR1 CURSOR FOR SELECT Koda artikla, količina FROM vstavljena DECLARE CUR2 CURSOR FOR SELECT Koda artikla, količina FROM izbrisana OPEN CUR1 OPEN CUR2 FETCH NEXT FROM CUR1 INTO @x, @y FETCH NEXT FROM CUR2 INTO @x_old, @y_old WHILE @@FETCH_STATUS=0 BEGIN SELECT @o=remaining FROM Warehouse WHERE product code=@x IF @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 Primer 14.5. Popravljena različica sprožilca za obdelavo operacije spreminjanja zapisa v tabeli

Primer 14.6. V primeru so vse spremembe preklicane, če vsaj ene od njih ni mogoče izvesti. Ustvarimo sprožilec, ki vam omogoča, da prekličete spremembe le nekaterih zapisov in spremenite ostale.

V tem primeru se sprožilec ne izvede po spremembi zapisov, temveč namesto ukaza za spremembo.

ALTER TRIGGER Trigger_upd ON Transaction NAMESTO UPDATE AS 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 koda transakcije, koda izdelka, količina FROM vstavljen DECLARE CUR2 CURSOR FOR SELECT Koda transakcije, koda izdelka, količina FROM izbrisano OPEN CUR1 OPEN CUR2 FETCH NEXT FROM CUR1 INTO @k,@x, @y FETCH NEXT FROM CUR2 INTO @k_old,@x_old, @y_old WHILE @@FETCH_STATUS= 0 BEGIN SELECT @ o=remaining FROM Warehouse WHERE Product Code=@x IF @o>=-@y BEGIN RAISERROR("change",16,10) UPDATE Transaction SET quantity=@y, Product Code=@x WHERE Transaction Code =@k UPDATE Warehouse SET Remaining =Remaining-@y_old WHERE Koda artikla=@x_old IF NOT EXISTS (SELECT * FROM Warehouse WHERE Item Code=@x) INSERT INTO Warehouse(Item Code, Remaining) VALUES (@x,@y) ELSE UPDATE Warehouse SET Remaining=Preostalo+@y WHERE Item Code=@x END ELSE RAISERROR("zapis ni spremenjen",16,10) FETCH NEXT FROM CUR1 INTO @k,@x, @y FETCH NEXT FROM CUR2 INTO @k_old, @x_old, @y_old KONEC ZAPRI CUR1 ZAPRI CUR2 DAZLOČI CUR1 DODELJI CUR2 Primer 14.6. Sprožilec, ki vam omogoča, da razveljavite spremembe le nekaterih zapisov in spremenite preostale.