Trigeru piemēri ms sql serverī. Trigeris (datu bāze). DDL trigeri un to lietojumprogrammas

sprūda:

<Определение_триггера>::= (CREATE | ALTER) TRIGGER trigera_nosaukums IESLĒGTS (tabulas_nosaukums | skata_nosaukums) ( ( ( UZ | PĒC | PĒC | VIETĀ ) ( [ DZĒST] [,] [ IEVADĪT] [,] [ ATJAUNINĀJUMS] ) [ AR PIEVIENOT ] [ NOT FOR REPLIKĀCIJA ] KĀ sql_statement[...n] ) | ( (PAR | PĒC | PĒC | VIETĀ ) ( [,] ) [ AR PIEVIENOJUMU] [ NAV REPLIKĀCIJAI] AS ( JA ATJAUNINĀJUMS(kolonnas_nosaukums) [ (UN | VAI) UPDATE( kolonnas_nosaukums)] [...n] | IF (COLUMNS_UPDATES() (process_bit_operator) change_bit_mask) (comparison_bit_operator) bit_mask [...n]) sql_operator [...n] ) )

Trigeri var izveidot tikai pašreizējā datu bāzē, bet ir iespējams piekļūt citām datu bāzēm, kas atrodas trigera ietvaros, tostarp tām, kas atrodas attālajā serverī.

Apskatīsim CREATE | argumentu mērķi ALTER TRIGGER.

Trigera nosaukumam ir jābūt unikālam datu bāzē. Turklāt varat norādīt īpašnieka vārdu.

Kad norādāt argumentu AR ENCRYPTION, serveris šifrē sprūda kodu, lai neviens, tostarp administrators, nevarētu tam piekļūt vai lasīt. Šifrēšana bieži tiek izmantota, lai paslēptu patentētus datu apstrādes algoritmus, kas ir programmētāja intelektuālais īpašums vai komercnoslēpums.

Trigeru veidi

IN SQL serveris Ir divi parametri, kas nosaka trigeru darbību:

  • PĒC. Trigeris tiek izpildīts pēc tam, kad komandas, kas to izsauca, ir veiksmīgi izpildītas. Ja komandas kāda iemesla dēļ nevar veiksmīgi izpildīt, trigeris netiek izpildīts. Jāņem vērā, ka datu izmaiņas lietotāja pieprasījuma izpildes un trigera izpildes rezultātā tiek veiktas viena darījuma pamattekstā: ja trigeris tiek atsaukts, tad arī lietotāja izmaiņas tiks noraidītas. Katrai darbībai varat definēt vairākus AFTER trigerus (INSERT, UPDATE, DELETE). Ja tabulā ir vairāki aktivizētāji AFTER, varat izmantot sistēmā saglabāto procedūru sp_settriggerorder, lai norādītu, kurš aktivizētājs darbosies pirmais un kurš pēdējais. Pēc noklusējuma SQL Server visi trigeri ir PĒC trigeriem.
  • TĀ VIETĀ . Komandu izpildes vietā tiek izsaukts trigeris. Atšķirībā no trigera AFTER, trigeri INSTEAD OF var definēt gan tabulai, gan skatam. Katrai INSERT, UPDATE, DELETE darbībai var definēt tikai vienu INSTEAD OF trigeri.

Trigeri atšķiras pēc komandu veida, uz kurām tie reaģē.

Ir trīs veidu aktivizētāji:

  • INSERT TRIGGER — tiek aktivizēts, kad tiek mēģināts ievietot datus, izmantojot komandu INSERT.
  • UPDATE TRIGGER – tiek aktivizēts, kad tiek mēģināts mainīt datus, izmantojot komandu UPDATE.
  • DELETE TRIGGER – tiek aktivizēts, kad tiek mēģināts dzēst datus, izmantojot komandu DELETE.

Konstrukcijas [ DZĒST] [,] [ IEVIETOT] [,] [ ATJAUNINĀT] Un PAR | PĒC | TĀ VIETĀ ) ([,] noteikt, uz kuru komandu sprūda reaģēs. Veidojot to, ir jānorāda vismaz viena komanda. Atļauts radot sprūda, reaģējot uz divām vai visām trim komandām.

AR APPEND ļauj izveidot vairākus katra veida aktivizētājus.

Plkst radot sprūda ar argumentu NOT FOR REPLICATION, ir aizliegts palaist, kamēr tabulas tiek modificētas ar replikācijas mehānismiem.

AS sql_operator[...n] konstrukcija definē SQL priekšrakstu un komandu kopu, kas tiks izpildīta, palaižot trigeri.

Ņemiet vērā, ka trigerā nav atļautas vairākas darbības, piemēram:

  • datu bāzes izveide, modificēšana un dzēšana;
  • atveseļošanās rezerves kopija datu bāze vai darījumu žurnāls.

Šīs komandas nav atļauts izpildīt, jo tās nevar atsaukt, ja tiek atcelts darījums, kurā tiek izpildīts trigeris. Šis aizliegums, visticamāk, nekādā veidā neietekmēs izveidoto aktivizētāju funkcionalitāti. Ir grūti atrast situāciju, kad, piemēram, pēc tabulas rindas maiņas būtu jāatjauno darījumu žurnāla dublējums.

Sprūda programmēšana

Izpildot komandas, lai pievienotu, modificētu un dzēstu ierakstus, serveris izveido divas īpašas tabulas: ievietots Un dzēsts. Tajos ir rindu saraksti, kas tiks ievietoti vai dzēsti, kad darījums būs pabeigts. Ievietoto un dzēsto tabulu struktūra ir identiska to tabulu struktūrai, kurām ir definēts trigeris. Katrs aktivizētājs izveido savu ievietoto un dzēsto tabulu kopu, tāpēc neviens cits aktivizētājs nevar tām piekļūt. Atkarībā no darbības veida, kas izraisīja trigera izpildi, ievietoto un dzēsto tabulu saturs var atšķirties:

  • INSERT komanda – ievietotajā tabulā ir visas rindas, kuras lietotājs mēģina ievietot tabulā; dzēstajā tabulā nebūs nevienas rindas; pēc trigera pabeigšanas visas rindas no ievietotās tabulas tiks pārvietotas uz avota tabulu;
  • DELETE komanda – dzēstajā tabulā būs visas rindas, kuras lietotājs mēģina dzēst; trigeris var pārbaudīt katru rindu un noteikt, vai to ir atļauts dzēst; ievietotajā tabulā nebūs rindu;
  • UPDATE komanda - izpildot, dzēstā tabula satur vecās rindu vērtības, kuras tiks dzēstas pēc veiksmīgas pabeigšanas

Pēdējā atjaunināšana: 11/09/2017

Trigeri ir īpašs saglabāto procedūru veids, kas tiek izsaukts automātiski, kad tabulā vai skatā tiek veikta noteikta darbība, jo īpaši, pievienojot, mainot vai dzēšot datus, tas ir, izpildot komandas INSERT, UPDATE, DELETE.

Formāla trigera definīcija:

CREATE TRIGGER aktivizētāja_nosaukums IESLĒGTS (tabulas_nosaukums | skata_nosaukums) (PĒC | VIETĀ) KĀ sql_izteiksmes

Lai izveidotu aktivizētāju, izmantojiet priekšrakstu CREATE TRIGGER, kam seko trigera nosaukums. Parasti trigera nosaukums atspoguļo darbības veidu un tās tabulas nosaukumu, kurā tiek veikta darbība.

Katrs trigeris ir saistīts ar noteiktu tabulu vai skatu, kura nosaukums ir norādīts aiz vārda ON .

Pēc tam tiek iestatīts sprūda veids. Mēs varam izmantot vienu no diviem veidiem:

    PĒC: tiek izpildīts pēc darbības pabeigšanas. Definēts tikai tabulām.

    TĀ VIETĀ: tiek izpildīts darbības vietā (tas ir, faktiski darbība - pievienošana, mainīšana vai dzēšana - netiek veikta vispār). Definēts tabulām un skatiem

Pēc sprūda veida tiek parādīta darbība, kurai ir definēts trigeris: INSERT, UPDATE vai DELETE.

Aktivizatoram AFTER varat to izmantot vairākām darbībām vienlaikus, piemēram, UPDATE un INSERT. Šajā gadījumā darbības tiek norādītas atdalītas ar komatiem. Aktivizētājam INSTEAD OF varat definēt tikai vienu darbību.

Un tad pēc vārda AS nāk SQL izteiksmju kopa, kas faktiski veido trigera pamattekstu.

Izveidosim trigeri. Pieņemsim, ka mums ir datubāze productsdb ar šādu definīciju:

IZVEIDOT DATU BĀZI productdb; GO USE productdb; CREATE TABLE Produkti (ID INT IDENTITY PRIMARY KEY, Product Name NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL);

Definēsim aktivizētāju, kas tiks aktivizēts, pievienojot un atjauninot datus.

IZMANTOT productdb; PĀRIET IZVEIDOT AIZSARDZĪBU Produkti_INSERT_ATJAUNINĀJUMS PRODUKTI PĒC IEVIETOT, ATJAUNINĀT KĀ ATJAUNINĀJUMS Produkti SET Cena = cena + cena * 0,38 WHERE Id = (Ievietots ATLASĪT Id FROM)

Pieņemsim, ka tabulā Produkti tiek glabāti dati par produktiem. Taču preces cenā bieži vien ir ietvertas dažādas piemaksas, piemēram, pievienotās vērtības nodoklis, pievienotais korupcijas nodoklis utt. Persona, kas pievieno datus, var nezināt visus šos nodokļu bāzes smalkumus, un viņš nosaka neto cenu. Izmantojot trigeri, mēs varam pielāgot preces cenu par noteiktu summu.

Tādā veidā trigeris tiks aktivizēts jebkurai INSERT vai UPDATE darbībai tabulā Produkti. Sprūda pats mainīs produkta cenu, un, lai iegūtu pievienoto vai mainīto produktu, mēs atrodam šo produktu pēc Id. Bet kādai vērtībai vajadzētu būt šāda produkta ID? Fakts ir tāds, ka, pievienojot vai mainot datus, tie tiek saglabāti ievietotajā starptabulā. Tas tiek izveidots automātiski. Un no tā mēs varam iegūt datus par pievienotajiem/mainītajiem produktiem.

Un pēc produkta pievienošanas tabulai Produkti, patiesībā precei būs nedaudz augstāka cena nekā tā, kas tika noteikta pievienošanas laikā:

Sprūda noņemšana

Lai noņemtu trigeri, jums jāizmanto komanda DROP TRIGGER:

DROP TRIGGER Products_INSERT_UPDATE

Sprūda atspējošana

Gadās, ka mēs vēlamies apturēt aktivizētāju, bet nevēlamies to pilnībā noņemt. Šajā gadījumā to var īslaicīgi atspējot, izmantojot komandu DISABLE TRIGGER:

ATspējot TRIGGER Products_INSERT_UPDATE ON Products

Un, kad jums ir nepieciešams aktivizētājs, varat to iespējot, izmantojot komandu ENABLE TRIGGER:

IESPĒJOT TRIGGER Products_INSERT_UPDATE ON Products

Sprūda ir datu bāzes procedūrai līdzīga apakšprogramma, ko automātiski izsauc DBVS, mainot, dzēšot vai pievienojot ierakstu tabulā. Trigeriem nevar piekļūt no programmas, nevar nosūtīt tiem parametrus vai saņemt no tiem rezultātus. Visbiežāk trigerus izmanto, lai datu bāzē uzturētu atsauces integritāti un kaskādes darbības. Atsauces specifikācijas, kas nosaka kaskādes dzēšanas un atjaunināšanas darbības un tiek izveidotas, kad tiek deklarētas tabulas, arī tiek ieviestas, izmantojot trigerus, taču šo trigeru teksts nav rediģējams.

Trigeru mērķis

Novērst izmaiņas (piemēram, novērst rēķinu izmaiņu pēc to izsūtīšanas).
. Reģistrējiet izmaiņas (piemēram, saglabājiet veco datu kopijas).
. Auditējiet izmaiņas (piemēram, saglabājiet izmaiņās iesaistīto lietotāju un lomu žurnālu).
. Tvert izmaiņas (piemēram, pārliecinieties, ka visas izmaiņas ir datētas atbilstoši servera pulkstenim, nevis klienta pulkstenim).
. Uzņēmējdarbības noteikumu īstenošana.
. Datu replikācija (piemēram, saglabājiet ierakstu par visām izmaiņām, kas tiks nosūtītas uz citu datu bāzi vēlākā versijā).
. Paaugstināta produktivitāte (piemēram, bilances atjaunināšana pēc katras darījuma detaļas, lai paātrinātu vaicājumu izpildi).

Trigeru deklarēšana

IZVEIDOT IZVEIDOTĀJU {PIRMS|PĒC} {DZĒST|IEVIETOT|ATJAUNINĀT [OF ]} IESLĒGTS ATSAUCES {VECE {[RINDA]|TABULA [AS] } JAUNS {RINDA|TABULA} [AS] }] [KATRAM {PAZIŅOJUMS|RINDA [KAD ]}]
[SĀKT ATOMU]

[BEIGAS]

Atslēgvārdi

. PIRMS|PĒC– sprūda sākuma laiks – pirms | pēc atjaunināšanas operācijas.
. DZĒST|IEVIETOT|ATJAUNINĀT= aktivizēšanas notikums.
. KATRAI RINDAI– katrai rindai (rindas trigeris, pēc tam WHEN).
. PAR KATRU PAZIŅOJUMU– visai komandai (derīga pēc noklusējuma).
. ATSAUCES– ļauj piešķirt līdz 4 aizstājvārdiem vecajiem un | vai jaunas rindas un | vai tabulas, kurām var piekļūt ar trigeriem.

Iedarbināšanas ierobežojumi

Aktivizētāja pamattekstā nedrīkst būt šādi paziņojumi:
. Datu bāzes objektu (tabulu, domēnu utt.) definēšana, dzēšana un mainīšana
. Darījumu apstrāde (PIEMĒROT, ATGRIEZT)
. Savienojumi un atvienojumi ar datu bāzi (CONNECT, DISCONNECT)

Pielietojuma iezīmes
. Trigeris tiek izpildīts pēc tam, kad ir veiktas visas pārējās (deklatīvās) integritātes pārbaudes, un tas ir noderīgs, ja testa kritērijs ir diezgan sarežģīts. Ja deklaratīvās pārbaudes noraida atjaunināšanas darbību, trigeri netiek izpildīti. Aktivizētājs darbojas darījuma kontekstā, bet FK ierobežojums nedarbojas.
. Ja trigeris rada papildu izmaiņas tā bāzes tabulā, tad visbiežāk tas neizraisīs tā rekursīvu izpildi, taču tas ir jāprecizē. SQL Server 2005 nodrošina iespēju norādīt rekursiju līdz 255 līmeņiem, izmantojot OPTION (MAXRECURSIV 3) atslēgvārdu.
. Trigeri parasti netiek izpildīti, apstrādājot lielas binārās kolonnas (BLOB).
. Jāatceras, ka ikreiz, kad dati tiek atjaunināti, DBVS automātiski izveido tā saukto trigeri virtuālās tabulas, kuriem dažādās DBVS ir dažādi nosaukumi. InterBase un Oracle — tie ir jauni un veci. SQL serverī — ievietots un izdzēsts. Turklāt, mainoties datiem, tiek izveidoti abi. Šajās tabulās ir vienāds kolonnu skaits ar tādiem pašiem nosaukumiem un domēniem kā atjauninātajai tabulai. SQL Server 2005 DBVS nodrošina iespēju norādīt tabulu, tostarp pagaidu tabulu, kurā jāievieto dati, izmantojot atslēgvārdu OUTPUT Inserted.ID,... INTO @.
. Vairākās DBVS ir atļauts vienlaikus deklarēt trigerus vairākām darbībām. Lai īstenotu dažādas reakcijas uz dažādām darbībām, Oracle nodrošina predikātus Dzēšana, ievietošana, atjaunināšana, kas atgriež True attiecīgajam atjauninājuma veidam.
. Oracle DBVS varat norādīt atjaunināšanas aktivizētāju kolonnu sarakstu (Pēc atjaunināšanas), kas nodrošinās, ka trigeris tiek izsaukts tikai tad, ja mainās tikai šo kolonnu vērtības.
. Katram trigera notikumam var deklarēt vairākus aktivizētājus (Oracle ir 12 trigeri katrā tabulā), un parasti secību, kādā tie tiek aktivizēti, nosaka to izveides secība. Dažās DBVS, piemēram, InterBase, startēšanas secība tiek norādīta, izmantojot papildu atslēgvārdu POSITION. Parasti trigeri vispirms jāizpilda katrai komandai un pēc tam katrai rindai.
. Trigerus var iegult viens otrā. Tādējādi SQL Server pieļauj 32 ligzdošanas līmeņus (lai noteiktu ligzdošanas līmeni, varat izmantot @@NextLevel globālo mainīgo).

Trigeru trūkumi

Sarežģītība. Dažu darbību ievietošana ar datiem datubāzē sarežģī tās izstrādi, ieviešanu un administrēšanu.
. Maskēšanās funkcionalitāte no lietotāja. Lietojumprogrammu ir grūti modernizēt, ja dažas funkcijas ir paslēptas.
. Ietekme uz veiktspēju. Ar nelielu skaitu trigeru datu apstrādes laiks palielinās.

Trigeru rediģēšana un dzēšana

Lai noņemtu aktivizētāju, izmantojiet priekšrakstu DROP TRIGGER
. Lai mainītu trigeri, izmantojiet priekšrakstu ALTER TRIGGER....
. Trigeru atspējošana
Dažos gadījumos, piemēram, partijas ielādes laikā, aktivizētāji ir jāatspējo. Vairākas DBVS nodrošina atbilstošas ​​iespējas. Oracle un SQL Server atslēgvārdi ir DISABLE|ENABLE, InterBase INACTIVE|ACTIVE priekšrakstā ALTER TRIGGER.

Rūpniecisko serveru īpašības

1) InterBase/Firebird

IZVEIDOT IZVEIDOTĀJU PRIEKŠ {AKTĪVS|NEAKTĪVS} {PIRMS|PĒC} {INSERT|DELETE|ATJAUNINĀT} [POZĪCIJA ]
AS [DEKLARĒT MAINĪGO [()]]
SĀKT

BEIGAS

Piemērs:

CREATE TRIGGER BF_Del_Cust FOR Customer
AKTĪVS PIRMS 1. POZĪCIJAS DZĒŠANAS AS
SĀKT
DELETE NO Orders WHERE Orders.CNum=Customer.CNum;
BEIGAS;

2) SQL serveris

IZVEIDOT IZVEIDOTĀJU IESLĒGTS [AR Šifrēšanu] {PAR|PĒC|VIETĀ} {INSERT|ATJAUNINĀT|DZĒST}
AS

LIETOT B1;
AIZIET
PĒC IEVADĪŠANAS, ATJAUNINĀŠANAS IZVEIDOT TRIGGERU InUpCust1 klientam
AS RAISEERROR('Klientu tabula mainīta');

Papildu trigeru veidi

Oracle un SQL Server nodrošina iespēju izveidot (aizstāšanas) aktivizētājus skatiem, kas netiek atjaunināti. Šim nolūkam tiek piedāvāti atslēgvārdu VIETĀ:

IZVEIDOT SPRIEDUŠANU, NEVIS IEVIETOT KĀ…

Varat pārraudzīt klientu mēģinājumus atjaunināt datus, izmantojot skatus, un veikt jebkādas darbības, apstrādāt skatus, kas nav atjaunināti utt.
. SQL Server DBVS nodrošina atcelšanas aktivizētāju, kas faktiski aptur visas darbības un izdod ziņojumu:

ATGRIEŠANAS SPRIEDUMS

Lekciju konspekti disciplīnā “Datu bāzes”

Tēma: Procedūras un trigeri

(kā piemēru izmantojot MS SQL Server)

sastādītājs: L. V. Shchegoleva

PetrSU, Lietišķās matemātikas un kibernētikas katedra

Ievads.................................................. ...................................................... .............. ......

Datu bāzes struktūras apraksts................................................. ..........................

Procedūras koncepcija................................................ ......................................................

Komandas darbam ar procedūrām................................................ ......................................

Sprūda jēdziens.................................................. ......................................................

Komandas darbam ar trigeriem................................................ ..............................................

Trigeru ieviešanas piemēri.................................................. ......................

1. piemērs................................................. ...................................................

2. piemērs................................................ ...................................................

3. piemērs................................................. ...................................................

4. piemērs................................................ ...................................................

5. piemērs................................................ ...................................................

PetrSU, Lietišķās matemātikas un kibernētikas katedra

Ievads

IN Šajā rokasgrāmatā ir sniegti komandu piemēri procedūru un trigeru izveidei

Ar viņu darba apraksts.

Visas komandas ir rakstītas MS SQL Server sintaksē.

Piemēri ir doti datu bāzei, kuras struktūra ir aprakstīta

1. sadaļa.

PetrSU, Lietišķās matemātikas un kibernētikas katedra

1 Datu bāzes struktūras apraksts

tblFakultāšu tabulā ir informācija par augstskolas fakultātēm.

Vārds

Apraksts

atribūts

Fakultātes ID

Fakultātes nosaukums

Dekāna pilns vārds

Dekanāta numurs

Dekanāta tālruņa numurs

Fakultātes studentu skaits

tblStudentu tabulā ir informācija par augstskolas studentiem vienā akadēmiskajā gadā.

Atribūta nosaukums

Apraksts

Studenta ID

Studenta vārds

Stipendija

Tabulā tblGroup ir informācija par augstskolu studentu grupām vienā akadēmiskajā gadā.

Atribūta nosaukums

Apraksts

Grupas ID

Priekšnieks

Grupas numurs

Fakultāte

tblPriekšmeta tabulā ir informācija par fakultātes studentu vienā akadēmiskajā gadā apgūtajām disciplīnām.

Atribūta nosaukums

Apraksts

Preces ID

Priekšmeta nosaukums

Lekciju stundu skaits

Prakses stundu skaits

Fakultāte

Lekciju piezīmes par disciplīnu “Datu bāzes” (Procedūras un trigeri)

PetrSU, Lietišķās matemātikas un kibernētikas katedra

Tabulā tblRoom ir informācija par universitātes klasēm.

Tabulā tblSchedule ir informācija par skolēnu grupu grafiku.

Atribūta nosaukums

Apraksts

Identifikators

Auditorija

Nedēļas diena

Skolotāja pilns vārds

PetrSU, Lietišķās matemātikas un kibernētikas katedra

2 Procedūras koncepcija

Procedūra ir programma, kas rakstīta DBVS iekšējā valodā un tiek glabāta datu bāzē kā neatkarīgs objekts. Šādas procedūras parasti sauc par saglabātajām, pievienotajām procedūrām. Procedūras var izsaukt lietojumprogrammā. Procedūras tiek izpildītas datu bāzes serverī. Procedūras var ietvert parametrus un atgriešanas vērtības, tostarp kļūdu ziņojumus.

Procedūru izmantošanas priekšrocības:

centralizēta datu piekļuves kontrole;

lietojumprogrammas var izsaukt procedūru, kas samazina programmu rakstīšanas laiku, ja procedūra tiek modificēta, visas programmas, kas to izsauc, saņems jaunu kodu, koda optimizāciju;

samazina tīkla trafiku sistēmās“klients-serveris”, datu apmaiņas vietā nododot tikai procedūras nosaukumu un tās parametrus, un procedūra tiek izpildīta serverī;

slēpjot daudzas funkcijas no lietotāja konkrēta ierīce datu bāzes, kas nodrošina lielāku datu neatkarību;

lielāku datu drošību, lietotājam var būt tiesības zvanīt

procedūru, bet nemanipulē ar datiem, kas tiek izsaukti ar šo procedūru; Trūkums: standartu trūkums procedūru ieviešanā.

PetrSU, Lietišķās matemātikas un kibernētikas katedra

3 komandas darbam ar procedūrām MS SQL Server

Procedūras izveide

IZVEIDOT PROCEDŪRU<имя процедуры>

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

SĀKT

<операторы>

Visu MS SQL Server mainīgo nosaukumiem jāsākas ar simbolu

Procedūras izsaukšana

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

Procedūras noņemšana

NOTEIKT PROCEDŪRA<имя процедуры>

Procedūra saskaita to studentu skaitu, kas uzņemti nodaļā, kuru identifikators ir @id procedūras ievades parametrs, un atgriež šo vērtību parametrā @total_sum.

Izveidot procedūru prStudentsOfFaculty @id int, @total_sum int output AS

Iestatiet @total_sum = 0

Iestatīt @total_sum = (Atlasīt skaitu(*) no tblStudent, tblGroup Kur (tblStudent.GroupId = tblGroup.GroupId) un (tblGroup.FacultyId = @id)) Beigas

PetrSU, Lietišķās matemātikas un kibernētikas katedra

4 Sprūda jēdziens

Tabulai tiek pievienots trigeris (noteikums), un datu bāzes pārvaldības sistēma to automātiski izsauc, kad tabulā tiek veiktas atjaunināšanas darbības (tabulas ierakstu pievienošana, dzēšana, mainīšana).

Trigeru ieviešanas iezīmes MS SQL Server

MS SQL Server:

trigeri var izsaukt vai nu pēc operācijas veikšanas, vai tās vietā, kas tiek veikta;

trigeris tiek izsaukts vienreiz visiem tabulas ierakstiem, ar kuriem jāveic darbība;

tādēļ modificējamie ieraksti tiek glabāti divās tabulās, kas tiek automātiski izveidotas, kad tiek izsaukts trigeris:

o Ievietota tabula – satur mainītos vai pievienotos tabulas ierakstus;

o Dzēsta tabula – satur ierakstus pirms izmaiņu veikšanas vai dzēstiem tabulas ierakstiem;

Insert darbībai definētā trigera pamattekstā ir pieejama tikai tabula

dzēšanas darbībai definētā trigera pamattekstā ir pieejama tikai tabula

atjaunināšanas darbībai definētā trigera pamattekstā ir pieejamas abas tabulas

Ievietots un dzēsts;

Vienam un tam pašam notikumam var izveidot jebkuru trigeru skaitu, un tie tiek izsaukti nejaušā secībā (iespējams, tādā secībā, kādā tie tika izveidoti).

PetrSU, Lietišķās matemātikas un kibernētikas katedra

5 komandas darbam ar trigeriem

Radīšana

IZVEIDOT IZVEIDOTĀJU<имя триггера>IESLĒGTS<имя таблицы>

( UZ | PĒC | VIETĀ )

[IEVIETOT] [,] [ATJAUNINĀT] [,] [DZĒST] AS

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

SĀKT<операторы>

Noņemšana

NOMET SPRIEDUŠANU<имя триггера>

PetrSU, Lietišķās matemātikas un kibernētikas katedra

6 Trigeru ieviešanas piemēri

Tēmas jomas ierobežojums: Studenta stipendija nevar tikt palielināta vairāk kā par 5% no iepriekšējās stipendijas.

IZVEIDOT TRIGGERU tgrStudentGrantUpdate

ON tblStudent PĒC ATJAUNINĀŠANAS

DEKLARĒT @Grant_old float, @Grant_new float, @Id int;

Atlasiet @Grant_old = Dotācija no dzēsta

No Ievietotā atlasiet @Grant_new = Grant, @Id = StudentId

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

ATJAUNINĀT tblStudent SET Grant = 1,05 * @Grant_old

KUR StudentId = @Id

Tabulai tblStudent ir izveidots trigeris tgrStudentGrantUpdate. Aktivizētājs tiks aktivizēts pēc datu maiņas darbības pabeigšanas.

IN Trigeris definē trīs vietējos mainīgos: @Grant_old (reālais tips), lai saglabātu veco studenta stipendiju, @Grant_new (reālais tips), lai saglabātu jauno studenta stipendiju, @Id (vesels skaitļa veids), lai saglabātu studenta identifikatoru.

Kad tiek izsaukts trigeris, DBVS izveido divas tabulas: Deleted, kurā ir modificētie ieraksti pirms to modificēšanas, un Inserted, kurā ir modificētie ieraksti pēc to modificēšanas.

IN Trigera pamattekstā, pirmkārt, studenta stipendijas vērtība tiek izgūta no tabulas Dzēsts pirms izmaiņu veikšanas, t.i., vecā stipendija, pēc tam studenta stipendijas vērtība tiek izgūta no tabulas Ievietots pēc tiek veiktas izmaiņas, t.i., jaunā stipendija. Līdz ar jaunas stipendijas izgūšanu no tabulas Ievietotais tiek izgūts arī studenta identifikators. Studenta ID var tikpat viegli izgūt no tabulas Dzēsts.

Tālāk sprūda pamattekstā tiek pārbaudīts nosacījums par stipendijas izmaiņu apjomu. Ja stipendija ir mainījusies par vairāk nekā 5%, tad trigeris veic datu korekciju - tas palielina stipendiju tikai par 5%, salīdzinot ar studenta iepriekšējo stipendijas vērtību. Šī darbība tiek veikta, atbilstošajam skolēnam tabulā tblStudent izsaucot operāciju Update.

Ir dota trigera definīcija, tā izmantošanas joma, trigera vieta un loma datu integritātes nodrošināšanā. Ir aprakstīti trigeru veidi. Tiek ņemti vērā operatori trigera izveidei, mainīšanai un dzēšanai. Trigeru programmēšana ir ilustrēta ar piemēriem, kā izveidot trigerus, lai ieviestu integritātes ierobežojumus un apkopotu statistikas datus.

Trigera definīcija SQL valodas standartā

Trigeri ir saglabātas procedūras veids. Tie tiek izpildīti, kad tabulā tiek izpildīts datu manipulācijas valodas (DML) operators. Trigeri tiek izmantoti, lai pārbaudītu datu integritāti un arī atsauktu darījumus.

Trigeris ir kompilēta SQL procedūra, kuras izpildi izraisa noteiktu notikumu rašanās relāciju datu bāzē. Trigeru izmantošana lielākoties ir ļoti ērta datu bāzes lietotājiem. Tomēr to izmantošana bieži vien ir saistīta ar papildu resursu izmaksām I/O operācijām. Ja tādus pašus rezultātus (ar daudz mazākām izmaksām) var sasniegt, izmantojot saglabātās procedūras vai lietojumprogrammas, trigeru izmantošana nav praktiska.

Trigeri ir īpašs SQL servera rīks, ko izmanto, lai saglabātu datu integritāti datu bāzē. Integritātes ierobežojumi, noteikumi un noklusējuma iestatījumi ne vienmēr var sasniegt vēlamo funkcionalitātes līmeni. Bieži vien ir nepieciešams ieviest sarežģītus datu pārbaudes algoritmus, lai nodrošinātu to uzticamību un realitāti. Turklāt dažreiz jums ir jāuzrauga tabulas vērtību izmaiņas, lai saistītos datus varētu mainīt pēc vajadzības. Trigerus var uzskatīt par sava veida filtriem, kas stājas spēkā pēc tam, kad visas darbības ir pabeigtas saskaņā ar noteikumiem, standarta vērtībām utt.

Trigeris ir īpaša veida saglabāta procedūra, ko serveris palaiž automātiski, kad tiek mēģināts mainīt datus tabulās, ar kurām ir saistīti trigeri. Katrs trigeris ir saistīts ar noteiktu tabulu. Visas tā veiktās datu modifikācijas tiek uzskatītas par vienu darījumu. Ja tiek atklāta kļūda vai datu integritātes pārkāpums, darījums tiek atcelts. Tāpēc izmaiņas ir aizliegtas. Tiek atsauktas arī visas trigera veiktās izmaiņas.

Tikai datu bāzes īpašnieks var izveidot trigeri. Šis ierobežojums ļauj izvairīties no nejaušām izmaiņām tabulu struktūrā, citu objektu savienošanas veidiem ar tām utt.

Sprūda ir ļoti noderīgs un tajā pašā laikā bīstams instruments. Tātad, ja tās darbības loģika ir nepareiza, jūs varat viegli iznīcināt visu datu bāzi, tāpēc trigeri ir ļoti rūpīgi jāatkļūdo.

Atšķirībā no parastās rutīnas, trigeris tiek izpildīts netieši katru reizi, kad tas notiek. sprūda notikums, turklāt tam nav argumentu. Tā iedarbināšanu dažreiz sauc par sprūda iedarbināšanu. Izmantojot trigerus, tiek sasniegti šādi mērķi:

  • Ievadīto datu pareizības apstiprināšana un sarežģītu datu integritātes ierobežojumu ieviešana, kurus ir grūti vai pat neiespējami uzturēt, izmantojot tabulā iestatītos integritātes ierobežojumus;
  • izdodot brīdinājumus, kas atgādina veikt noteiktas darbības, atjauninot noteiktā veidā ieviestu tabulu;
  • audita informācijas uzkrāšana, fiksējot informāciju par veiktajām izmaiņām un personām, kuras tās veikušas;
  • replikācijas atbalsts.

Komandas CREATE TRIGGER pamata formāts ir parādīts zemāk:

<Определение_триггера>::= IZVEIDOT TRIGGERI trigera_nosaukums PIRMS | PĒC<триггерное_событие>IESLĒGTS<имя_таблицы> <тело_триггера>

izraisīt notikumus sastāv no rindu ievietošanas, dzēšanas un atjaunināšanas tabulā. Pēdējā gadījumā par sprūda notikums Varat norādīt konkrētus tabulas kolonnu nosaukumus. Sprūda laiks tiek noteikts, izmantojot atslēgvārdi PIRMS (trigeris tiek aktivizēts, pirms tiek izpildīti ar to saistītie notikumi) vai PĒC (pēc to izpildes).

Aktivizētāja veiktās darbības ir norādītas katrai rindai (KATRAI RINDAI), ko aptver konkrētais notikums, vai tikai vienu reizi katram notikumam (KATRA PAZIŅOJUMAM).

Apzīmējums <список_старых_или_новых_псевдонимов> attiecas uz tādiem komponentiem kā vecs vai jauna līnija(VEC/JAUNS) vai nu vecs, vai jauns galds(VECĀ TABLE / JAUNA TABLE). Ir skaidrs, ka vecās vērtības neattiecas uz notikumu ievietošanu, un jaunās vērtības neattiecas uz notikumu dzēšanu.

Pareizi lietojot, trigeri var būt ļoti spēcīgs mehānisms. To galvenā priekšrocība ir tā, ka standarta funkcijas tiek saglabātas datu bāzē un tiek konsekventi aktivizētas katru reizi, kad tā tiek atjaunināta. Tas var ievērojami vienkāršot lietojumprogrammas. Tomēr ir vērts pieminēt sprūda raksturīgos trūkumus:

  • sarežģītība: kad dažas funkcijas tiek pārvietotas uz datu bāzi, tās izstrādes, ieviešanas un administrēšanas uzdevumi kļūst sarežģītāki;
  • Slēpta funkcionalitāte: dažas funkcionalitātes pārvietošana uz datu bāzi un saglabāšana kā viens vai vairāki aktivizētāji dažkārt noved pie tā, ka kāda funkcionalitāte tiek paslēpta no lietotāja. Lai gan tas zināmā mērā vienkāršo tā darbību, diemžēl tas var izraisīt neparedzētas, potenciāli nevēlamas un kaitīgas blakusparādības, jo šādā gadījumā lietotājs nevar kontrolēt visus datubāzē notiekošos procesus;
  • Ietekme uz veiktspēju: pirms katras komandas izpildes, lai mainītu datu bāzes stāvokli, DBVS ir jāpārbauda sprūda nosacījums, lai noteiktu, vai šai komandai ir jāaktivizē trigeris. Šādu aprēķinu veikšana ietekmē kopējo DBVS veiktspēju, un maksimālās slodzes laikā tās samazināšanās var kļūt īpaši pamanāma. Acīmredzot, palielinoties trigeru skaitam, palielinās arī ar šādām darbībām saistītās pieskaitāmās izmaksas.

Nepareizi uzrakstīti trigeri var radīt nopietnas problēmas, piemēram, bloķētas slēdzenes. Trigeri var bloķēt daudzus resursus uz ilgu laiku, tāpēc īpaša uzmanība jāpievērš piekļuves konfliktu samazināšanai.

Trigeru ieviešana MS SQL Server vidē

MS SQL Server DBVS ieviešana izmanto šādu trigeru izveides vai modifikācijas operatoru:

<Определение_триггера>::= (CREATE | ALTER) TRIGGER trigera_nosaukums IESLĒGTS (tabulas_nosaukums | skata_nosaukums) ( ( ( UZ | PĒC | PĒC | VIETĀ ) ( [ DZĒST] [,] [ IEVADĪT] [,] [ ATJAUNINĀJUMS] ) [ AR PIEVIENOT ] [ NOT FOR REPLIKĀCIJA ] KĀ sql_statement[...n] ) | ( (PAR | PĒC | PĒC | VIETĀ ) ( [,] ) [ AR PIEVIENOJUMU] [ NAV REPLIKĀCIJAI] AS ( JA ATJAUNINĀJUMS(kolonnas_nosaukums) [ (UN | VAI) UPDATE( kolonnas_nosaukums)] [...n] | IF (COLUMNS_UPDATES() (process_bit_operator) change_bit_mask) (comparison_bit_operator) bit_mask [...n]) sql_operator [...n] ) )

Trigeri var izveidot tikai pašreizējā datu bāzē, bet ir iespējams piekļūt citām datu bāzēm, kas atrodas trigera ietvaros, tostarp tām, kas atrodas attālajā serverī.

Apskatīsim CREATE | argumentu mērķi ALTER TRIGGER.

Trigera nosaukumam ir jābūt unikālam datu bāzē. Turklāt varat norādīt īpašnieka vārdu.

Kad norādāt argumentu AR ENCRYPTION, serveris šifrē sprūda kodu, lai neviens, tostarp administrators, nevarētu tam piekļūt vai lasīt. Šifrēšana bieži tiek izmantota, lai paslēptu patentētus datu apstrādes algoritmus, kas ir programmētāja intelektuālais īpašums vai komercnoslēpums.

Trigeru veidi

SQL Server ir divas opcijas, kas nosaka trigeru darbību:

  • PĒC. Trigeris tiek izpildīts pēc tam, kad komandas, kas to izsauca, ir veiksmīgi izpildītas. Ja komandas kāda iemesla dēļ nevar veiksmīgi izpildīt, trigeris netiek izpildīts. Jāņem vērā, ka datu izmaiņas lietotāja pieprasījuma izpildes un trigera izpildes rezultātā tiek veiktas viena darījuma pamattekstā: ja trigeris tiek atsaukts, tad arī lietotāja izmaiņas tiks noraidītas. Katrai darbībai varat definēt vairākus AFTER trigerus (INSERT, UPDATE, DELETE). Ja tabulā ir vairāki aktivizētāji AFTER, varat izmantot sistēmā saglabāto procedūru sp_settriggerorder, lai norādītu, kurš aktivizētājs darbosies pirmais un kurš pēdējais. Pēc noklusējuma SQL Server visi trigeri ir PĒC trigeriem.
  • TĀ VIETĀ . Komandu izpildes vietā tiek izsaukts trigeris. Atšķirībā no trigera AFTER, trigeri INSTEAD OF var definēt gan tabulai, gan skatam. Katrai INSERT, UPDATE, DELETE darbībai var definēt tikai vienu INSTEAD OF trigeri.

Trigeri atšķiras pēc komandu veida, uz kurām tie reaģē.

Ir trīs veidu aktivizētāji:

  • INSERT TRIGGER — tiek aktivizēts, kad tiek mēģināts ievietot datus, izmantojot komandu INSERT.
  • UPDATE TRIGGER – tiek aktivizēts, kad tiek mēģināts mainīt datus, izmantojot komandu UPDATE.
  • DELETE TRIGGER – tiek aktivizēts, kad tiek mēģināts dzēst datus, izmantojot komandu DELETE.

Konstrukcijas [ DZĒST] [,] [ IEVIETOT] [,] [ ATJAUNINĀT] Un PAR | PĒC | TĀ VIETĀ ) ([,] noteikt, uz kuru komandu sprūda reaģēs. Veidojot to, ir jānorāda vismaz viena komanda. Atļauts radot sprūda, reaģējot uz divām vai visām trim komandām.

AR APPEND ļauj izveidot vairākus katra veida aktivizētājus.

Plkst radot sprūda ar argumentu NOT FOR REPLICATION, ir aizliegts palaist, kamēr tabulas tiek modificētas ar replikācijas mehānismiem.

AS sql_operator[...n] konstrukcija definē SQL priekšrakstu un komandu kopu, kas tiks izpildīta, palaižot trigeri.

Ņemiet vērā, ka trigerā nav atļautas vairākas darbības, piemēram:

  • datu bāzes izveide, modificēšana un dzēšana;
  • datu bāzes vai darījumu žurnāla dublējuma atjaunošana.

Šīs komandas nav atļauts izpildīt, jo tās nevar atsaukt, ja tiek atcelts darījums, kurā tiek izpildīts trigeris. Šis aizliegums, visticamāk, nekādā veidā neietekmēs izveidoto aktivizētāju funkcionalitāti. Ir grūti atrast situāciju, kad, piemēram, pēc tabulas rindas maiņas būtu jāatjauno darījumu žurnāla dublējums.

Sprūda programmēšana

Izpildot komandas, lai pievienotu, modificētu un dzēstu ierakstus, serveris izveido divas īpašas tabulas: ievietots Un dzēsts. Tajos ir rindu saraksti, kas tiks ievietoti vai dzēsti, kad darījums būs pabeigts. Ievietoto un dzēsto tabulu struktūra ir identiska to tabulu struktūrai, kurām ir definēts trigeris. Katrs aktivizētājs izveido savu ievietoto un dzēsto tabulu kopu, tāpēc neviens cits aktivizētājs nevar tām piekļūt. Atkarībā no darbības veida, kas izraisīja trigera izpildi, ievietoto un dzēsto tabulu saturs var atšķirties:

  • INSERT komanda – ievietotajā tabulā ir visas rindas, kuras lietotājs mēģina ievietot tabulā; dzēstajā tabulā nebūs nevienas rindas; pēc trigera pabeigšanas visas rindas no ievietotās tabulas tiks pārvietotas uz avota tabulu;
  • DELETE komanda – dzēstajā tabulā būs visas rindas, kuras lietotājs mēģina dzēst; trigeris var pārbaudīt katru rindu un noteikt, vai to ir atļauts dzēst; ievietotajā tabulā nebūs rindu;
  • Komanda UPDATE - izpildot, dzēstā tabula satur vecās rindu vērtības, kas tiks dzēstas pēc veiksmīgas trigera pabeigšanas. Jaunās rindu vērtības ir ietvertas ievietotajā tabulā. Šīs rindas tiks pievienotas avota tabulai pēc tam, kad aktivizētājs būs veiksmīgi izpildīts.

Lai iegūtu informāciju par rindu skaitu, kas tiks modificētas, kad trigeris tiks veiksmīgi pabeigts, varat izmantot funkciju @@ROWCOUNT;. tas atgriež pēdējās komandas apstrādāto rindu skaitu. Jāuzsver, ka trigeris tiek palaists nevis tad, kad tiek mēģināts mainīt konkrētu rindiņu, bet gan tajā brīdī, kad tiek izpildīta maiņas komanda. Viena šāda komanda ietekmē daudzas rindas, tāpēc aktivizētājam ir jāapstrādā visas šīs rindas.

Ja aktivizētājs konstatē, ka no 100 rindām, kas tiek ievietotas, pārveidotas vai dzēstas, tikai viena neatbilst noteiktiem nosacījumiem, neviena rinda netiks ievietota, pārveidota vai dzēsta. Šāda rīcība ir saistīta ar darījuma prasībām – vai nu ir jāveic visas modifikācijas, vai arī nekādas.

Trigeris tiek izpildīts kā netieši definēts darījums, tāpēc trigerā var izmantot transakciju vadības komandas. Konkrēti, ja tiek atklāts integritātes ierobežojuma pārkāpums, ir jāizmanto komanda ROLLBACK TRANSACTION, lai pārtrauktu aktivizētāju un atsauktu visas lietotāja veiktās izmaiņas.

Varat izmantot funkciju COLUMNS_UPDATED(), lai iegūtu sarakstu ar kolonnām, kuras ir modificētas ar komandām INSERT vai UPDATE, kas izraisīja trigera izpildi. Tas atgriež bināru skaitli, kura katrs bits, sākot ar vismazāko bitu, atbilst vienai tabulas kolonnai (kolonnu secībā, kad tabula tika izveidota). Ja bits ir iestatīts uz "1", tad atbilstošā kolonna ir mainīta. Turklāt to, ka kolonna ir mainījusies, nosaka funkcija UPDATE (column_name).

Priekš noņemt sprūda komanda tiek izmantota

NOMET TRIGGERI (trigera_nosaukums) [,...n]

Šeit ir trigeru izmantošanas piemēri.

Piemērs 14.1. Izmantojot sprūda, lai vērtības ierobežojumu īstenošana. Tabulai Darījumu pievienotajā ierakstā pārdotās preces daudzums nedrīkst būt mazāks par tās atlikumu no tabulas Noliktavas.

Komanda ieraksta ievietošanai darījumu tabulā varētu būt, piemēram, šāda:

INSERT INTO Tirdzniecības VĒRTĪBAS (3,1,-299,"01/08/2002")

Izveidotajam trigerim uz tā izpildi jāreaģē šādi: komanda ir jāatceļ, ja tabulā Noliktavas preču atlikums ir mazāks par pārdoto preces daudzumu ar ievadīto kodu (piemērā preces kods = 3 ). Ievietotajā ierakstā preces daudzums tiek norādīts ar “+” zīmi, ja prece tiek piegādāta, un ar “-” zīmi, ja tā tiek pārdota. Parādītais trigeris ir konfigurēts, lai apstrādātu tikai vienu pievienoto ierakstu.

CREATE TRIGGER Trigger_ins ON Transaction FOR INSERT IT IF @@ROWCOUNT=1 BEGIN JA NAV (SELECT * FROM ievietots WHERE -inserted.quantity<=ALL(SELECT Склад.Остаток FROM Склад,Сделка WHERE Склад.КодТовара= Сделка.КодТовара)) BEGIN ROLLBACK TRAN PRINT "Отмена поставки: товара на складе нет" END END Piemērs 14.1. Trigera izmantošana, lai ieviestu vērtības ierobežojumus.

Piemērs 14.2. Trigera izmantošana statistikas datu vākšanai.

Izveidojiet trigeri, lai apstrādātu ieraksta ievietošanas darījumu tabulā, piemēram, šādu komandu:

INSERT INTO Tirdzniecības VĒRTĪBAS (3,1,200,"01/08/2002")

Prece ar kodu 3 tiek piegādāta no pircēja ar kodu 1 200 vienību apjomā.

Pārdodot vai saņemot preci, attiecīgi jāpielāgo inventāra daudzums. Ja prece vēl nav noliktavā, tabulai Noliktava jāpievieno atbilstošs ieraksts. Trigeris apstrādā tikai vienu pievienoto rindu.

ALTER TRIGGER Trigger_ins ON Transaction FOR INSERT AS DEKLARĒT @x INT, @y INT, JA @@ROWCOUNT=1 --Transakciju tabulai tiek pievienots ieraksts par preču piegādi BEGIN --pārdoto preču daudzums nedrīkst būt -- mazāks par tās atlikumu no tabulas Noliktavas IF NOT EXISTS(SELECT * FROM ievietots 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 Piemērs 14.2. Trigera izmantošana statistikas datu vākšanai.

Piemērs 14.3. Izveidojiet trigeri, lai apstrādātu ieraksta dzēšanas darbību no Darījuma tabulas, piemēram, šādu komandu:

Precei, kuras kods tika norādīts ieraksta dzēšanas brīdī, ir nepieciešams koriģēt tā krājumu atlikumu. Trigeris apstrādā tikai vienu ierakstu, kas jādzēš.

CREATE TRIGGER Trigger_del ON Transaction FOR DELETE IT, JA @@ROWCOUNT=1 -- tiek dzēsts viens ieraksts BEGIN DECLARE @y INT,@x INT --produkta kods un daudzums tiek noteikts no --ieraka, kas izdzēsts no tabulas Noliktava SELECT @y=Produkta kods, @ x=Daudzums FROM dzēsts --noliktavas tabulā tiek koriģēts --preces daudzums UPDATE Warehouse SET Remaining=Remaining-@x WHERE Product Code=@y END Piemērs 14.3. Trigeris ieraksta dzēšanas no tabulas darbības apstrādei

Piemērs 14.4. Izveidojiet trigeri, lai apstrādātu ieraksta maiņas darbību tabulā Deal, piemēram, ar šādu komandu:

visos darījumos ar precēm, kuru kods ir vienāds ar 3, samazināt preču daudzumu par 10 vienībām.

Norādītā komanda darījumu tabulā var izraisīt izmaiņas vairākos ierakstos vienlaikus. Tāpēc mēs parādīsim, kā izveidot trigeri, kas apstrādā vairāk nekā vienu ierakstu. Katram izmainītajam ierakstam nepieciešams vecajam (pirms maiņas) preces kodam samazināt preces atlikumu noliktavā par preces vecā (pirms maiņas) daudzuma vērtību un jaunajam (pēc mainīt) preces kodu, lai palielinātu tās atlikumu noliktavā par jaunās (pēc izmaiņām) vērtības vērtību. Lai apstrādātu visus mainītos ierakstus, mēs ieviesīsim kursorus, kuros saglabāsim visas vecās (no dzēstās tabulas) un visas jaunās vērtības (no ievietotās tabulas).

IZVEIDOT TRIGGERU Trigger_upd ON transakciju ATJAUNINĀŠANAI, KĀ DEKLARĒT @x INT, @x_old INT, @y INT, @y_old INT — kursors ar jaunām vērtībām DECLARE CUR1 CURSOR FOR SELECT Produkta kods, Daudzums FROM ievietots — kursors ar vecām vērtībām​ ​DEKLARĀTIET CUR2 KURSORU, LAI IZVĒLĒTIES Produkta kods, Daudzums NO dzēsts OPEN CUR1 OPEN CUR2 — pārvietojieties paralēli pa abiem kursoriem ATNES TĀLĀK NO CUR1 UZ @x, @y ATNES TĀLĀK NO CUR2 UZ @x_old, @y_old WHILE @ FETCH_STATUS=@FETCH_STATUS=@0 BEGIN -- vecajam preces kodam samazinās -- daudzums noliktavā UPDATE Warehouse SET Remaining=Remaining-@y_old WHERE Product Code=@x_old --jaunam preces kodam, ja šāda prece vēl nav noliktavā, tiek ievadīts jauns ieraksts, JA NAV PASTĀV (SELECT * FROM Warehouse WHERE Produkta kods=@x) INSERT INTO Noliktava(Produkta kods, Atlikušais) VĒRTĪBAS (@x,@y) ELSE --pretējā gadījumā jauna produkta kodam tas palielinās -- tā daudzums noliktavā ATJAUNINĀT Noliktavu SET Atlikušais=Atlikušais+@y KUR Produkta kods=@x IEŅEMT TĀLĀK NO CUR1 UZ @x, @y IEŅEMT TĀLĀK NO CUR2 UZ @x_old, @y_old END CLOSE CUR1 AIZVĒRT CUR2 ATTIECĪT CUR1 ATDALĪT CUR2 Piemērs 14.4. sprūda darbības apstrādei, lai mainītu ierakstu tabulā

Aplūkotajā trigerā preču daudzums netiek salīdzināts, ja tiek mainīts darījuma ieraksts ar tā atlikumu noliktavā.

Piemērs 14.5. Izlabosim šo trūkumu. Lai ģenerētu kļūdas ziņojumu, trigera pamattekstā izmantojam komandu MS SQL Server RAISERROR, kuras argumenti ir ziņojuma teksts, smaguma pakāpe un kļūdas statuss.

ALTER TRIGGER Trigger_upd ON Transakcija ATJAUNINĀŠANAI KĀ DEKLARĒT @x INT, @x_old INT, @y INT, @y_old INT ,@o INT DEKLARĒT CUR1 CURSOR FOR SELECT Preces kods, daudzums no ievietots DEKLARĒT CUR2 CURSOR kodu, Quant Selectity OPEN CUR1 OPEN CUR2 IEŅEMT TĀLĀK NO CUR1 UZ @x, @y IEŅEMT TĀLĀK NO CUR2 UZ @x_old, @y_old WHILE @@FETCH_STATUS=0 SĀKT IZVĒLĒTIES @o=atlicis no noliktavas WHERE produkta kods=@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 Piemērs 14.5. Labotā trigera versija, lai apstrādātu ieraksta maiņas darbību tabulā

Piemērs 14.6. Piemērā visas izmaiņas tiek atceltas, ja nav iespējams ieviest vismaz vienu no tām. Izveidosim trigeri, kas ļauj atcelt izmaiņas tikai dažos ierakstos un mainīt pārējos.

Šajā gadījumā trigeris tiek izpildīts nevis pēc ierakstu maiņas, bet gan maiņas komandas vietā.

ALTER TRIGGER ON DARĪJUMS Trigger_upd, NEVIS ATJAUNINĀT, KĀ DEKLARĒT @k INT, @k_old INT DEKLARĒT @x INT, @x_old INT, @y INT DEKLARĒT @y_old INT ,@o INT DEKLARĒT CUR1 KURSORU, IZVĒLĒTIES darījuma kodam, F produkta kods. ievietots DECLARE CUR2 CURSOR FOR SELECT Darījuma kods, produkta kods, daudzums no FROM dzēsts OPEN CUR1 OPEN CUR2 FETCH NEXT FROM CUR1 UZ @k,@x, @y FETCH TĀLĀK NO CUR2 UZ @k_old,@x_old, @y_old, WHILE @=ETCHSTATUS@ 0 BEGIN SELECT @ o=atlicis FROM Warehouse WHERE Produkta kods=@x IF @o>=-@y BEGIN RAISERROR("mainīt",16,10) UPDATE Transaction SET daudzums=@y, Produkta kods=@x WHERE Darījuma kods =@k ATJAUNINĀT Noliktavas SET Atlikušais =Atlicis-@y_vecs WHERE Preces kods=@x_vecs, JA NAV PASTĀV (SELECT * FROM Warehouse WHERE Preces kods=@x) INSERT INTO Noliktavā(preces kods, atlikušās) VĒRTĪBAS (@x,@y) ELSE UPDATE Warehouse SET Remaining=Atlikušais+@y WHERE Preces kods=@x END ELSE RAISERROR("ieraksts nav mainīts",16,10) IEŅEMT TĀLĀK NO CUR1 UZ @k,@x, @y IEŅEMT TĀLĀK NO CUR2 UZ @k_old, @x_old, @y_old END CLOSE CUR1 CLOSE CUR2 ATDALĪT CUR1 ATDALĪT CUR2 Piemērs 14.6. Trigeris, kas ļauj atsaukt izmaiņas tikai dažos ierakstos un veikt izmaiņas pārējos.