Ms sql serveridagi triggerlarga misollar. Trigger (ma'lumotlar bazasi). DDL triggerlari va ularning ilovalari

tetik:

<Определение_триггера>::= (CREATE | ALTER) TRIGGER trigger_name ON (jadval_nomi | view_name) ( ( ( UCHUN | KEYIN | OʻRNI ) ( [ OʻCHIRISH] [,] [ INSERT] [,] [ YANGILASH] ) [ BILAN QOʻSHIMCHA ] [ EMAS REPLIKATSIYA ] AS sql_statement[...n] ) | ( (UCHUN | KEYIN | OʻRNI ) ( [,] ) [ QOʻSHIMCHA BILAN] [ REPLIKATSIYA UCHUN EMAS] AS ( AGAR YANGILANISH (ustun_nomi) [ (VA | YOKI) YANGILANISH( ustun_nomi)] [...n] | AGAR (COLUMNS_UPDATES() (jarayon_bit_operator) o'zgartirish_bit_mask) (taqqoslash_bit_operator) bit_mask [...n]) sql_operator [...n] ) )

Trigger faqat joriy ma'lumotlar bazasida yaratilishi mumkin, ammo trigger ichidagi boshqa ma'lumotlar bazalariga, shu jumladan uzoq serverda joylashganlarga kirish mumkin.

Keling, CREATE | dan argumentlarning maqsadini ko'rib chiqaylik ALTER TRIGGER.

Trigger nomi ma'lumotlar bazasida yagona bo'lishi kerak. Bundan tashqari, siz egasining ismini belgilashingiz mumkin.

WITH ENCRYPTION argumentini belgilaganingizda, server trigger kodini shifrlaydi, shunda hech kim, jumladan, administrator unga kira olmaydi yoki o'qiy olmaydi. Shifrlash ko'pincha dasturchining intellektual mulki yoki tijorat siri bo'lgan xususiy ma'lumotlarni qayta ishlash algoritmlarini yashirish uchun ishlatiladi.

Trigger turlari

IN SQL Server Triggerlarning harakatini belgilaydigan ikkita parametr mavjud:

  • KEYIN. Trigger uni chaqirgan buyruqlar muvaffaqiyatli bajarilgandan so'ng bajariladi. Agar biron-bir sababga ko'ra buyruqlar muvaffaqiyatli bajarilmasa, trigger bajarilmaydi. Shuni ta'kidlash kerakki, foydalanuvchi so'rovini bajarish va triggerni bajarish natijasida ma'lumotlar o'zgarishi bitta tranzaktsiyaning tanasida amalga oshiriladi: agar trigger orqaga qaytarilsa, foydalanuvchi o'zgarishlari ham rad etiladi. Har bir operatsiya uchun bir nechta SOʻNG triggerlarini belgilashingiz mumkin (INSERT, UPDATE, DELETE). Agar jadvalda bir nechta AFTER triggerlari bo'lsa, sp_settriggerorder tizimining saqlangan protsedurasidan qaysi trigger birinchi va qaysi biri oxirgi ishga tushishini belgilashingiz mumkin. Odatiy bo'lib, SQL Serverda barcha triggerlar triggerlardan KEYIN bo'ladi.
  • O'RNIGA . Buyruqlarni bajarish o'rniga trigger chaqiriladi. AFTER triggeridan farqli o‘laroq, O‘RNINI trigger ham jadval, ham ko‘rinish uchun aniqlanishi mumkin. Har bir INSERT, UPDATE, DELETE amallari uchun faqat bitta O‘RNIGA trigger aniqlanishi mumkin.

Triggerlar javob beradigan buyruqlar turi bilan ajralib turadi.

Triggerlarning uch turi mavjud:

  • INSERT TRIGGER - INSERT buyrug'i yordamida ma'lumotlarni kiritishga urinilganda ishga tushiriladi.
  • UPDATE TRIGGER – UPDATE buyrug'i yordamida ma'lumotlarni o'zgartirishga urinilganda ishga tushiriladi.
  • DELETE TRIGGER – DELETE buyrug‘i yordamida ma’lumotlarni o‘chirishga urinilganda ishga tushadi.

Qurilishlar [ OʻCHIRISH] [,] [ INSERT] [,] [ YANGILASH] Va UCHUN | KEYIN | O'RNIGA ) ([,] trigger qaysi buyruqqa javob berishini aniqlang. Uni yaratishda kamida bitta buyruq ko'rsatilishi kerak. Ruxsat berilgan trigger yaratish, ikkita yoki uchta buyruqqa javob berish.

WITH APPEND har bir turdagi bir nechta triggerlarni yaratishga imkon beradi.

Da trigger yaratish REPLICATION UCHUN EMAS argumenti bilan jadvallar replikatsiya mexanizmlari bilan o'zgartirilayotganda uning ishlashi taqiqlanadi.

AS sql_operator[...n] konstruksiyasi trigger ishga tushirilganda bajariladigan SQL operatorlari va buyruqlar to‘plamini belgilaydi.

Esda tutingki, trigger ichida bir qator operatsiyalarga ruxsat berilmaydi, masalan:

  • ma'lumotlar bazasini yaratish, o'zgartirish va o'chirish;
  • tiklanish zaxira nusxasi ma'lumotlar bazasi yoki tranzaktsiyalar jurnali.

Ushbu buyruqlarni bajarishga ruxsat berilmaydi, chunki agar trigger bajarilgan tranzaksiya orqaga qaytarilsa, ularni qaytarib bo'lmaydi. Ushbu taqiq yaratilgan triggerlarning ishlashiga biron-bir tarzda ta'sir qilishi dargumon. Masalan, jadval qatorini o'zgartirgandan so'ng tranzaktsiyalar jurnalining zaxira nusxasini tiklashingiz kerak bo'lgan vaziyatni topish qiyin.

Trigger dasturlash

Yozuvlarni qo'shish, o'zgartirish va o'chirish buyruqlarini bajarishda server ikkita maxsus jadval yaratadi: kiritilgan Va o'chirildi. Ularda tranzaksiya tugagandan so'ng qo'shiladigan yoki o'chiriladigan qatorlar ro'yxati mavjud. Qo'shilgan va o'chirilgan jadvallarning tuzilishi trigger aniqlangan jadvallarning tuzilishi bilan bir xil. Har bir trigger o'zining kiritilgan va o'chirilgan jadvallar to'plamini yaratadi, shuning uchun boshqa hech qanday trigger ularga kira olmaydi. Triggerning bajarilishiga sabab bo'lgan operatsiya turiga qarab, kiritilgan va o'chirilgan jadvallarning mazmuni boshqacha bo'lishi mumkin:

  • INSERT buyrug'i - kiritilgan jadval foydalanuvchi jadvalga kiritmoqchi bo'lgan barcha qatorlarni o'z ichiga oladi; o'chirilgan jadvalda bitta qator bo'lmaydi; trigger tugallangandan so'ng, kiritilgan jadvalning barcha satrlari manba jadvaliga ko'chiriladi;
  • DELETE buyrug'i - o'chirilgan jadval foydalanuvchi o'chirmoqchi bo'lgan barcha qatorlarni o'z ichiga oladi; trigger har bir qatorni tekshirishi va uni o'chirishga ruxsat berilganligini aniqlashi mumkin; kiritilgan jadvalda qatorlar bo'lmaydi;
  • UPDATE buyrug'i - bajarilganda, o'chirilgan jadvalda muvaffaqiyatli tugallangandan so'ng o'chiradigan eski qator qiymatlari mavjud

Oxirgi yangilanish: 11/09/2017

Triggerlar - jadval yoki ko'rinishda ma'lum harakat bajarilganda, xususan, ma'lumotlarni qo'shish, o'zgartirish yoki o'chirishda, ya'ni INSERT, UPDATE, DELETE buyruqlarini bajarishda avtomatik ravishda chaqiriladigan saqlanadigan protseduralarning maxsus turi.

Triggerning rasmiy ta'rifi:

CREATE TRIGGER trigger_name ON (jadval_nomi | view_name) (KEYIN | OʻRNIGA) sql_expressions sifatida

Trigger yaratish uchun CREATE TRIGGER iborasidan keyin trigger nomidan foydalaning. Odatda, trigger nomi operatsiya turini va operatsiya bajariladigan jadval nomini aks ettiradi.

Har bir trigger ma'lum bir jadval yoki ko'rinish bilan bog'lanadi, ularning nomi ON so'zidan keyin ko'rsatiladi.

Keyin trigger turi o'rnatiladi. Biz ikkita turdan birini ishlatishimiz mumkin:

    KEYIN: Harakat tugallangandan keyin bajariladi. Faqat jadvallar uchun belgilangan.

    O‘RNIGA: harakat o‘rnida bajariladi (ya’ni, aslida harakat – qo‘shish, o‘zgartirish yoki o‘chirish – umuman bajarilmaydi). Jadvallar va ko'rinishlar uchun belgilangan

Trigger turidan keyin trigger aniqlangan operatsiya ko'rsatkichi keladi: INSERT, UPDATE yoki DELETE.

AFTER trigger uchun siz uni bir vaqtning o'zida bir nechta amallar uchun ishlatishingiz mumkin, masalan, UPDATE va INSERT. Bunday holda, operatsiyalar vergul bilan ajratilgan holda ko'rsatiladi. Trigger O'RNI uchun faqat bitta amalni belgilashingiz mumkin.

Va keyin AS so'zidan keyin SQL ifodalari to'plami keladi, ular aslida triggerning tanasini tashkil qiladi.

Keling, trigger yarataylik. Aytaylik, bizda quyidagi ta'rifga ega productsdb ma'lumotlar bazasi mavjud:

MA'LUMOTLAR BAZASINI YARATING productdb; GO USE productdb; CREATE TABLE Mahsulotlar (Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL);

Keling, ma'lumotlarni qo'shish va yangilashda ishga tushadigan triggerni aniqlaylik:

productdb dan foydalanish; QO'SHILGAN KEYIN TRIGGER Products_INSERT_UPDATE BO'LGAN mahsulotlarni YARATING, YANGILANGAN MAHSULOTLAR SET Narx = Narx + Narx * 0,38 QERDA Id = (tanlash identifikatori kiritilgan)

Aytaylik, "Mahsulotlar" jadvali mahsulotlar haqidagi ma'lumotlarni saqlaydi. Ammo mahsulot narxida ko'pincha qo'shilgan qiymat solig'i, qo'shilgan korruptsiya solig'i va boshqalar kabi turli xil qo'shimcha to'lovlar mavjud. Ma'lumotni qo'shayotgan shaxs soliq bazasi bilan barcha bu nozikliklarni bilmasligi mumkin va u aniq narxni belgilaydi. Trigger yordamida biz mahsulot narxini ma'lum miqdorda moslashtira olamiz.

Shunday qilib, trigger Mahsulotlar jadvalidagi har qanday INSERT yoki UPDATE amallarida ishga tushadi. Triggerning o'zi mahsulot narxini o'zgartiradi va qo'shilgan yoki o'zgartirilgan mahsulotni olish uchun biz ushbu mahsulotni Id bo'yicha topamiz. Ammo bunday mahsulotning identifikatori qanday qiymatga ega bo'lishi kerak? Gap shundaki, ma'lumotlarni qo'shganda yoki o'zgartirganda, u kiritilgan oraliq jadvalda saqlanadi. U avtomatik ravishda yaratiladi. Va undan biz qo'shilgan/o'zgartirilgan mahsulotlar haqida ma'lumot olishimiz mumkin.

Mahsulotlarni "Mahsulotlar" jadvaliga qo'shgandan so'ng, aslida mahsulot qo'shilganidan keyin bir oz yuqoriroq narxga ega bo'ladi:

Triggerni olib tashlash

Triggerni olib tashlash uchun DROP TRIGGER buyrug'ini ishlatishingiz kerak:

TROP TRIGGER mahsulotlarini_INSERT_UPDATE

Triggerni o'chirish

Biz tetikni pauza qilishni xohlaymiz, lekin uni butunlay olib tashlashni xohlamaymiz. Bunday holda, uni DISABLE TRIGGER buyrug'i yordamida vaqtincha o'chirib qo'yish mumkin:

TRIGGER Products_INSERT_UPDATE ON MAHSULOTLARNI O‘CHIRISh

Agar sizga trigger kerak bo'lsa, uni ENABLE TRIGGER buyrug'i yordamida yoqishingiz mumkin:

TRIGGER Products_INSERT_UPDATE ON MAHSULOTLARNI YOQISH

Trigger ma'lumotlar bazasi protsedurasiga o'xshash pastki dastur bo'lib, jadvaldagi yozuvni o'zgartirish, o'chirish yoki qo'shishda DBMS tomonidan avtomatik ravishda chaqiriladi. Triggerlarga dasturdan kirish, ularga parametrlarni uzatish yoki ulardan natijalarni olish mumkin emas. Ko'pincha triggerlar ma'lumotlar bazasida ma'lumotlarning yaxlitligini va kaskad operatsiyalarini saqlash uchun ishlatiladi. Kaskadli o'chirish va yangilash amallarini belgilaydigan va jadvallar e'lon qilinganda yaratiladigan mos yozuvlar spetsifikatsiyalari ham triggerlar orqali amalga oshiriladi, ammo bu triggerlarning matnini tahrirlash mumkin emas.

Triggerlarning maqsadi

O'zgarishlarni oldini olish (masalan, schyot-fakturalar yuborilganidan keyin o'zgarishini oldini olish).
. O'zgarishlar jurnali (masalan, eski ma'lumotlarning nusxalarini saqlang).
. O'zgarishlarni tekshirish (masalan, o'zgarishlarda ishtirok etgan foydalanuvchilar va rollar jurnalini yuriting).
. O'zgarishlarni yozib oling (masalan, barcha o'zgarishlar mijozning emas, balki server soatiga ko'ra sanalganligiga ishonch hosil qiling).
. Biznes qoidalarini amalga oshirish.
. Ma'lumotlarni replikatsiya qilish (masalan, keyingi versiyada boshqa ma'lumotlar bazasiga yuboriladigan barcha o'zgarishlar yozuvini saqlang).
. Hosildorlikning oshishi (masalan, so'rovlarni tezlashtirish uchun har bir tranzaksiya tafsilotlaridan keyin balansni yangilash).

Triggerlarni e'lon qilish

TRIGGER YARATISH {OLDIN|KEYIN} {O‘CHIRISH|QO‘SHISH|YANGILASH [OF ]} ON MA'LUMOT {ESKI {[QAT]|JADVAL [AS] } YANGI {QAT|JADVAL} [AS] }] [HAR BIRIGA {Bayonot|QAT [QACHON ]}]
[ATOMNI BOSHLASH]

[OXIRI]

Kalit so'zlar

. OLDIN|KEYIN– ishga tushirish vaqti – oldin | yangilash operatsiyasidan keyin.
. O‘CHIRISH|QO‘SHISH|YANGILASH= tetik hodisasi.
. HAR QAT UCHUN– har bir satr uchun (chiziq trigger, keyin WHEN).
. HAR BAYoT UCHUN- butun jamoa uchun (sukut bo'yicha amal qiladi).
. MA'LUMOT– eski va | ga 4 tagacha taxallus belgilash imkonini beradi yoki yangi qatorlar va | yoki triggerlar orqali kirish mumkin bo'lgan jadvallar.

Trigger cheklovlari

Trigger tanasi quyidagi bayonotlarni o'z ichiga olmaydi:
. Ma'lumotlar bazasi ob'ektlarini (jadvallar, domenlar va boshqalar) aniqlash, o'chirish va o'zgartirish.
. Tranzaksiyani qayta ishlash (COMMIT, ROLLBACK)
. Ma'lumotlar bazasiga ulanish va uzilishlar (CONNECT, DISCONNECT)

Qo'llash xususiyatlari
. Trigger barcha boshqa (deklarativ) yaxlitlik tekshiruvlari qo'llanilgandan so'ng amalga oshiriladi va test mezoni juda murakkab bo'lsa foydali bo'ladi. Agar deklarativ tekshiruvlar yangilanish jarayonini rad etsa, unda triggerlar bajarilmaydi. Trigger tranzaksiya kontekstida ishlaydi, lekin FK cheklovi bunday qilmaydi.
. Agar trigger o'zining asosiy jadvaliga qo'shimcha o'zgartirish kiritsa, ko'pincha bu uning rekursiv bajarilishiga olib kelmaydi, lekin buni aniqlashtirish kerak. SQL Server 2005 OPTION (MAXRECURSIV 3) kalit so'zidan foydalangan holda 255 darajagacha bo'lgan rekursiyani belgilash imkoniyatini beradi.
. Katta ikkilik ustunlarni (BLOB) qayta ishlashda triggerlar odatda bajarilmaydi.
. Shuni esda tutish kerakki, har safar ma'lumotlar yangilanganda, DBMS avtomatik ravishda trigger deb ataladigan narsani yaratadi virtual jadvallar, ular turli ma'lumotlar bazasida turli nomlarga ega. InterBase va Oracle-da - bular yangi va eski. SQL Serverda - kiritilgan va o'chirilgan. Bundan tashqari, ma'lumotlar o'zgarganda, ikkalasi ham yaratiladi. Ushbu jadvallar yangilanayotgan jadval bilan bir xil nomlar va domenlar bilan bir xil sonli ustunlarga ega. SQL Server 2005 DBMS jadvalni, shu jumladan vaqtinchalik jadvalni belgilash imkoniyatini beradi, unga OUTPUT Inserted.ID,... INTO @ kalit so'zi yordamida ma'lumotlar kiritilishi kerak.
. Bir qator DBMSlarda bir vaqtning o'zida bir nechta harakatlar uchun triggerlarni e'lon qilishga ruxsat beriladi. Har xil harakatlarga turli xil reaksiyalarni amalga oshirish uchun Oracle tegishli yangilanish turi uchun True qiymatini qaytaradigan O'chirish, Qo'shish, Yangilash predikatlarini taqdim etadi.
. Oracle DBMS-da siz yangilanish triggerlari uchun ustunlar ro'yxatini (yangilangandan keyin) belgilashingiz mumkin, bu trigger faqat ushbu ustunlarning qiymatlari o'zgarganda chaqirilishini ta'minlaydi.
. Har bir trigger hodisasi uchun bir nechta triggerlar e'lon qilinishi mumkin (Oracle har bir jadvalda 12 ta triggerga ega) va odatda ularni ishga tushirish tartibi ularning yaratilish tartibi bilan belgilanadi. InterBase kabi ba'zi DBMSlarda ishga tushirish tartibi qo'shimcha POSITION kalit so'zi yordamida belgilanadi. Umuman olganda, triggerlar avval har bir buyruq uchun, keyin esa har bir satr uchun bajarilishi kerak.
. Triggerlar bir-birining ichiga joylashtirilishi mumkin. Shunday qilib, SQL Server 32 joylashtirish darajasiga ruxsat beradi (joylashtirish darajasini aniqlash uchun @@NextLevel global o'zgaruvchisidan foydalanishingiz mumkin).

Triggerlarning kamchiliklari

Murakkablik. Ma'lumotlar bazasidagi ma'lumotlarga ba'zi harakatlarni joylashtirish uni loyihalash, amalga oshirish va boshqarishni murakkablashtiradi.
. Yashirinlik funksionallik foydalanuvchidan. Ba'zi xususiyatlar yashirin bo'lsa, ilovani modernizatsiya qilish qiyin.
. Ishlash samaradorligiga ta'siri. Kam sonli triggerlar bilan ma'lumotlarni qayta ishlash vaqti ortadi.

Triggerlarni tahrirlash va o'chirish

Triggerni olib tashlash uchun DROP TRIGGER iborasidan foydalaning
. Triggerni o'zgartirish uchun ALTER TRIGGER... iborasidan foydalaning.
. Triggerlarni o'chirish
Ba'zi hollarda, masalan, ommaviy yuklash paytida, triggerlarni o'chirib qo'yish kerak. Bir qator DBMS mos keladigan imkoniyatlarni ta'minlaydi. Oracle va SQL Serverda kalit so'zlar DISABLE|ENABLE, InterBase da INACTIVE|ACTIVE ALTER TRIGGER bayonotida.

Sanoat serverlarining xususiyatlari

1) InterBase/Firebird

TRIGGER YARATISH UCHUN {FAOL|Faol} {OLDIN|KEYIN} {INSERT|DELETE|YANGILASH} [POSITION ]
AS [VARIABLE E'lon qiling [()]]
BOSHLANISHI

OXIRI

Misol:

Mijoz UCHUN TRIGGER BF_Del_Cust YARATING
1-POZİSYONNI O'CHIRIShDAN OLDIN FAOL AS
BOSHLANISHI
Buyurtmalardan O'CHIRING. Orders.CNum=Customer.CNum;
OXIRI;

2) SQL Server

TRIGGER YARATISH ON [KRİPSIYA BILAN] {UCHUN|KEYIN|O'RNIGA} {INSERT|YANGILASH|O'CHIRISh}
AS

B1 dan foydalanish;
BOSH
INSERT, YANGILANGAN KEYIN mijozda InUpCust1 TRIGGERini YARATING
AS RAISEERROR('Mijoz jadvali o'zgartirildi');

Triggerlarning qo'shimcha turlari

Oracle va SQL Server yangilanmagan ko'rinishlar uchun triggerlarni yaratish (almashtirish) imkoniyatini beradi. Shu maqsadda kalit so'zlar O'RNISI berilgan:

QO'SHISH O'RNIDA TRIGGER YARATING …

Siz ko'rinishlar yordamida mijozning ma'lumotlarni yangilashga urinishlarini kuzatishingiz va har qanday harakatlarni bajarishingiz, yangilanmagan ko'rinishlarni boshqarishingiz va hokazo.
. SQL Server DBMS aslida barcha harakatlarni to'xtatuvchi va xabar chiqaradigan orqaga qaytarish tetikini taqdim etadi:

ORTAGA AYTARISH TRIGGER

“Ma’lumotlar bazalari” fanidan ma’ruza matnlari

Mavzu: Protseduralar va triggerlar

(misol sifatida MS SQL Serverdan foydalanish)

tuzuvchi: L. V. Shchegoleva

PetrDU, Amaliy matematika va kibernetika fakulteti

Kirish................................................................. ....... ................................................. ............. ......

Ma'lumotlar bazasi strukturasi tavsifi................................................. ............ ..............

Jarayon tushunchasi................................................. ...... ................................................

Protseduralar bilan ishlash buyruqlari...................................... ................................ .............

Trigger tushunchasi................................................. ......................................................

Triggerlar bilan ishlash buyruqlari...................................... ................................................................

Triggerni amalga oshirishga misollar................................................. ...... ...................

1-misol................................................. ... ...................................................

2-misol................................................. ... ...................................................

3-misol................................................. ... ...................................................

4-misol................................................. ... ...................................................

5-misol................................................. ... ...................................................

PetrDU, Amaliy matematika va kibernetika fakulteti

Kirish

IN Ushbu qo'llanmada protseduralar va triggerlarni yaratish uchun buyruqlar misollari keltirilgan

Bilan ularning ishlarining tavsifi.

Barcha buyruqlar MS SQL Server sintaksisida yozilgan.

Misollar tuzilishi tasvirlangan ma'lumotlar bazasi uchun berilgan

1-bo'lim.

PetrDU, Amaliy matematika va kibernetika fakulteti

1 Ma'lumotlar bazasi tuzilishining tavsifi

tblFaculty jadvalida universitet fakultetlari haqida ma'lumotlar mavjud.

Ism

Tavsif

xususiyat

Fakultet ID

Fakultet nomi

Dekanning to'liq ismi

Dekanlik raqami

Dekanat telefon raqami

Fakultet talabalari soni

TblStudent jadvali bir o'quv yilidagi universitet talabalari haqidagi ma'lumotlarni o'z ichiga oladi.

Atribut nomi

Tavsif

Talaba ID

talabaning ismi

stipendiya

tblGroup jadvalida bir o'quv yilidagi universitet talabalari guruhlari haqida ma'lumotlar mavjud.

Atribut nomi

Tavsif

Guruh identifikatori

Boshliq

Guruh raqami

Fakultet

tblSubject jadvalida fakultet talabalarining bir o‘quv yilida o‘rgangan fanlari to‘g‘risidagi ma’lumotlar keltirilgan.

Atribut nomi

Tavsif

Element identifikatori

Element nomi

Dars soatlari soni

Amaliyot soatlari soni

Fakultet

“Ma’lumotlar bazalari” fanidan ma’ruza matnlari (protseduralar va triggerlar)

PetrDU, Amaliy matematika va kibernetika fakulteti

tblRoom jadvali universitet sinflari haqidagi ma'lumotlarni o'z ichiga oladi.

TblSchedule jadvali talabalar guruhlari jadvali haqida ma'lumotni o'z ichiga oladi.

Atribut nomi

Tavsif

Identifikator

Tomoshabinlar

Hafta kuni

O'qituvchining to'liq ismi

PetrDU, Amaliy matematika va kibernetika fakulteti

2 Protsedura tushunchasi

Protsedura - ma'lumotlar bazasida mustaqil ob'ekt sifatida saqlanadigan ma'lumotlar bazasining ichki tilida yozilgan dastur. Bunday protseduralar odatda saqlangan, biriktirilgan protseduralar deb ataladi. Protseduralar amaliy dastur tomonidan chaqirilishi mumkin. Jarayonlar ma'lumotlar bazasi serverida amalga oshiriladi. Protseduralar parametrlar va qaytariladigan qiymatlarni, shu jumladan xato xabarlarini o'z ichiga olishi mumkin.

Jarayonlardan foydalanishning afzalliklari:

ma'lumotlarga kirishni markazlashtirilgan boshqarish;

amaliy dasturlar protsedurani chaqirishi mumkin, bu esa dasturlarni yozish vaqtini qisqartiradi, protsedura o'zgartirilganda, uni chaqiruvchi barcha dasturlar yangi kod oladi, kodni optimallashtirish;

tizimlardagi tarmoq trafigini kamaytiradi"mijoz-server" ma'lumotlar almashish o'rniga faqat protsedura nomini va uning parametrlarini uzatish orqali va serverda protsedura bajariladi;

foydalanuvchidan ko'p xususiyatlarni yashirish maxsus qurilma ma'lumotlarning ko'proq mustaqilligini ta'minlaydigan ma'lumotlar bazalari;

kattaroq ma'lumotlar xavfsizligi, foydalanuvchi qo'ng'iroq qilish huquqiga ega bo'lishi mumkin

protsedura, lekin ushbu protsedura tomonidan chaqirilgan ma'lumotlarni manipulyatsiya qilmaydi; Kamchilik: protseduralarni amalga oshirishda standartlarning yo'qligi.

PetrDU, Amaliy matematika va kibernetika fakulteti

3 MS SQL Serverda protseduralar bilan ishlash buyruqlari

Jarayon yaratish

TARTIBI YARATISH<имя процедуры>

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

BOSHLANISHI

<операторы>

MS SQL Serverdagi barcha o'zgaruvchilarning nomlari belgi bilan boshlanishi kerak

Jarayonni chaqirish

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

Jarayonni olib tashlash

TOSHLASH TARTIBI<имя процедуры>

Protsedura identifikatori @id protsedurasining kirish parametri bo'lgan kafedraga qabul qilingan talabalar sonini hisoblab chiqadi va bu qiymatni @total_sum parametrida qaytaradi.

Protsedura yaratish prStudentsOfFaculty @id int, @total_sum int output AS

@jami_sum = 0 ni belgilang

@total_sum = (sonni tanlang(*) tblStudent, tblGroup qaerda (tblStudent.GroupId = tblGroup.GroupId) va (tblGroup.FacultyId = @id)) End

PetrDU, Amaliy matematika va kibernetika fakulteti

4 Trigger haqida tushuncha

Trigger (qoida) jadvalga biriktiriladi va jadvalda yangilash operatsiyalari bajarilganda (jadval yozuvlarini qo'shish, o'chirish, o'zgartirish) avtomatik ravishda ma'lumotlar bazasini boshqarish tizimi tomonidan chaqiriladi.

MS SQL Serverda triggerlarni amalga oshirish xususiyatlari

MS SQL Serverda:

trigger operatsiya bajarilgandan keyin ham, bajarilayotgan operatsiya o‘rniga ham chaqirilishi mumkin;

operatsiya bajarilishi kerak bo'lgan barcha jadval yozuvlari uchun trigger bir marta chaqiriladi;

shuning uchun o'zgartirilayotgan yozuvlar trigger chaqirilganda avtomatik ravishda yaratiladigan ikkita jadvalda saqlanadi:

o Kiritilgan jadval – o'zgartirilgan yoki qo'shilgan jadval yozuvlarini o'z ichiga oladi;

o o'chirilgan jadval - o'zgartirishlar kiritilgunga qadar yoki o'chirilgan jadval yozuvlarini o'z ichiga oladi;

Insert amali uchun belgilangan trigger tanasida faqat jadval mavjud

O'chirish operatsiyasi uchun belgilangan trigger tanasida faqat jadval mavjud

Yangilash operatsiyasi uchun belgilangan trigger tanasida ikkala jadval ham mavjud

Kiritilgan va o'chirilgan;

Xuddi shu hodisa uchun har qanday miqdordagi triggerlar yaratilishi mumkin va ular tasodifiy tartibda chaqiriladi (ehtimol ular yaratilgan tartibda).

PetrDU, Amaliy matematika va kibernetika fakulteti

Triggerlar bilan ishlash uchun 5 ta buyruq

Yaratilish

TRIGGER YARATISH<имя триггера>ON<имя таблицы>

( UCHUN | KEYIN | OʻRNIGA )

[INSERT] [,] [YANGILASH] [,] [OʻCHIRISH] AS

E'lon qiling @<имя переменной> <тип данных>, ...

BOSHLANISHI<операторы>

Olib tashlash

TRIGGERNI TO'CHIRISH<имя триггера>

PetrDU, Amaliy matematika va kibernetika fakulteti

6 Triggerni amalga oshirishga misollar

Mavzu hududi chegarasi: Talabaning stipendiyasi oldingi stipendiyaning 5% dan ko'prog'iga ko'paytirilishi mumkin emas.

tgrStudentGrantUpdate TRIGGER YARATISH

YANGILANGAN KEYIN tblStudent ON

E'lon qiling @Grant_old float, @Grant_new float, @Id int;

@Grant_old = O'chirilgandan berishni tanlang

Inserted dan @Grant_new = Grant, @Id = StudentId-ni tanlang

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

YANGILANISH tblStudent SET Grant = 1.05 * @Grant_old

WHERE StudentId = @Id

tblStudent jadvali uchun tgrStudentGrantUpdate triggeri yaratilgan. Trigger ma'lumotlarni o'zgartirish operatsiyasi tugallangandan so'ng ishga tushadi.

IN Trigger uchta mahalliy o'zgaruvchini belgilaydi: eski talaba stipendiyasini saqlash uchun @Grant_old (haqiqiy turdagi), yangi talaba stipendiyasini saqlash uchun @Grant_new (haqiqiy turdagi), talaba identifikatorini saqlash uchun @Id (butun son turi).

Trigger chaqirilganda, DBMS ikkita jadval yaratadi: O'chirilgan, o'zgartirilishidan oldin o'zgartirilgan yozuvlarni o'z ichiga oladi va Inserted, ular o'zgartirilgandan keyin o'zgartirilgan yozuvlarni o'z ichiga oladi.

IN Triggerning tanasida, birinchi navbatda, talaba stipendiyasining qiymati o'zgartirishlar kiritilishidan oldin O'chirilgan jadvaldan olinadi, ya'ni eski stipendiya; so'ngra talabaning stipendiyasi qiymati Kiritilgan jadvaldan keyin olinadi. o'zgarishlar kiritiladi, ya'ni yangi stipendiya. Kiritilgan jadvaldan yangi stipendiya olish bilan bir qatorda talaba identifikatori ham olinadi. Talaba identifikatorini o'chirilgan jadvaldan osongina olish mumkin.

Keyinchalik, trigger tanasida stipendiyaning o'zgarishi miqdori haqidagi shart tekshiriladi. Agar stipendiya 5% dan ortiq o'zgargan bo'lsa, unda trigger ma'lumotlarga tuzatish kiritadi - bu talabaning oldingi stipendiya qiymatiga nisbatan stipendiyani atigi 5% ga oshiradi. Bu harakat tegishli talaba uchun tblStudent jadvalidagi Update operatsiyasini chaqirish orqali amalga oshiriladi.

Triggerning ta'rifi, uni qo'llash doirasi, ma'lumotlar yaxlitligini ta'minlashda triggerning o'rni va roli keltirilgan. Triggerlarning turlari tavsiflanadi. Triggerni yaratish, o'zgartirish va o'chirish uchun operatorlar ko'rib chiqiladi. Trigger dasturlash yaxlitlik cheklovlarini amalga oshirish va statistik ma'lumotlarni yig'ish uchun triggerlarni yaratish misollari bilan tasvirlangan.

SQL til standartidagi trigger ta'rifi

Triggerlar saqlanadigan protsedura turidir. Ular jadvalda ma'lumotlarni manipulyatsiya qilish tili (DML) operatori bajarilganda bajariladi. Triggerlar ma'lumotlar yaxlitligini tekshirish va tranzaktsiyalarni qaytarish uchun ishlatiladi.

Trigger - kompilyatsiya qilingan SQL protsedurasi bo'lib, uning bajarilishi relyatsion ma'lumotlar bazasida ma'lum hodisalarning ro'y berishi natijasida yuzaga keladi. Triggerlardan foydalanish, asosan, ma'lumotlar bazasi foydalanuvchilari uchun juda qulaydir. Shunga qaramay, ulardan foydalanish ko'pincha kiritish-chiqarish operatsiyalari uchun qo'shimcha resurs xarajatlarini o'z ichiga oladi. Saqlangan protseduralar yoki amaliy dasturlar yordamida bir xil natijalarga (kamroq xarajatlar bilan) erishish mumkin bo'lsa, triggerlardan foydalanish amaliy emas.

Triggerlar ma'lumotlar bazasidagi ma'lumotlarning yaxlitligini saqlash uchun ishlatiladigan maxsus SQL server vositasidir. Butunlik cheklovlari, qoidalar va standart sozlamalar har doim ham kerakli darajadagi funksionallikka erisha olmaydi. Ko'pincha ularning ishonchliligi va realligini ta'minlash uchun ma'lumotlarni tekshirishning murakkab algoritmlarini amalga oshirish kerak. Bundan tashqari, ba'zida jadval qiymatlaridagi o'zgarishlarni kuzatishingiz kerak bo'ladi, shunda bog'langan ma'lumotlar kerak bo'lganda o'zgartirilishi mumkin. Triggerlarni qoidalarga, standart qiymatlarga va hokazolarga muvofiq barcha operatsiyalar bajarilgandan so'ng kuchga kiradigan filtrlar turi deb hisoblash mumkin.

Trigger - bu triggerlar bog'langan jadvallardagi ma'lumotlarni o'zgartirishga urinilganda server tomonidan avtomatik ravishda ishga tushiriladigan saqlangan protseduraning maxsus turi. Har bir trigger ma'lum bir jadval bilan bog'langan. U amalga oshiradigan barcha ma'lumotlarni o'zgartirishlar bitta tranzaksiya sifatida qabul qilinadi. Agar xato yoki ma'lumotlar yaxlitligi buzilganligi aniqlansa, tranzaksiya orqaga qaytariladi. Shuning uchun o'zgartirishlar taqiqlanadi. Trigger tomonidan allaqachon kiritilgan har qanday o'zgarishlar ham bekor qilinadi.

Faqat ma'lumotlar bazasi egasi trigger yaratishi mumkin. Ushbu cheklash jadvallar tuzilishidagi tasodifiy o'zgarishlarni, ularga boshqa ob'ektlarni ulash usullarini va hokazolarni oldini olishga imkon beradi.

Trigger juda foydali va ayni paytda xavfli vositadir. Shunday qilib, agar uning ishlash mantig'i noto'g'ri bo'lsa, siz butun ma'lumotlar bazasini osongina yo'q qilishingiz mumkin, shuning uchun triggerlarni juda ehtiyotkorlik bilan tuzatish kerak.

Oddiy tartibdan farqli o'laroq, trigger har safar sodir bo'lganda bevosita bajariladi. tetik hodisasi, bundan tashqari, unda hech qanday dalil yo'q. Uni ishga tushirish ba'zan tetikni yoqish deb ataladi. Triggerlar yordamida quyidagi maqsadlarga erishiladi:

  • Kiritilgan ma'lumotlarning to'g'riligini tekshirish va jadvalda o'rnatilgan yaxlitlik cheklovlari yordamida saqlab qolish qiyin, hatto imkonsiz bo'lgan murakkab ma'lumotlar yaxlitligi cheklovlarini qo'llash;
  • ma'lum bir tarzda amalga oshirilgan jadvalni yangilashda muayyan harakatlarni bajarish kerakligini eslatuvchi ogohlantirishlar berish;
  • kiritilgan o'zgarishlar va ularni amalga oshirgan shaxslar to'g'risidagi ma'lumotlarni qayd etish orqali auditorlik ma'lumotlarini to'plash;
  • replikatsiyani qo'llab-quvvatlash.

CREATE TRIGGER buyrug'ining asosiy formati quyida ko'rsatilgan:

<Определение_триггера>::= TRIGGER trigger_name OLDINDAN YARATING | KEYIN<триггерное_событие>ON<имя_таблицы> <тело_триггера>

hodisalarni tetiklash jadvalga qatorlarni qo'shish, o'chirish va yangilashdan iborat. Oxirgi holatda uchun tetik hodisasi Siz ma'lum jadval ustunlari nomlarini belgilashingiz mumkin. Ishlash vaqti yordamida aniqlanadi kalit so'zlar OLDIN (u bilan bog'liq hodisalar bajarilishidan oldin trigger ishga tushiriladi) yoki KEYIN (ular bajarilgandan keyin).

Trigger tomonidan bajariladigan amallar berilgan hodisa bilan qamrab olingan har bir satr uchun (HAR QATIR UCHUN) yoki har bir hodisa uchun faqat bir marta (HAR BAYoT UCHUN) belgilanadi.

Belgilash <список_старых_или_новых_псевдонимов> eski yoki kabi komponentlarga ishora qiladi yangi qator(ESKI/YANGI) yoki eski yoki yangi stol(ESKIR TABLO / YANGI TABLO). Ko'rinib turibdiki, eski qiymatlar hodisalarni kiritish uchun qo'llanilmaydi va yangi qiymatlar hodisalarni o'chirish uchun qo'llanilmaydi.

To'g'ri ishlatilsa, tetiklar juda kuchli mexanizm bo'lishi mumkin. Ularning asosiy afzalligi shundaki, standart funktsiyalar ma'lumotlar bazasida saqlanadi va har safar yangilanganda doimiy ravishda faollashtiriladi. Bu ilovalarni sezilarli darajada soddalashtirishi mumkin. Biroq, triggerning o'ziga xos kamchiliklarini ta'kidlash kerak:

  • murakkablik: ba'zi funktsiyalar ma'lumotlar bazasiga ko'chirilganda, uni loyihalash, amalga oshirish va boshqarish vazifalari murakkablashadi;
  • Yashirin funksionallik: Baʼzi funksiyalarni maʼlumotlar bazasiga koʻchirish va uni bir yoki bir nechta trigger sifatida saqlash baʼzan baʼzi funksiyalarning foydalanuvchidan yashirilishiga olib keladi. Bu uning ishlashini ma'lum darajada soddalashtirgan bo'lsa-da, afsuski, bu ko'zda tutilmagan, potentsial istalmagan va zararli yon ta'sirlarni keltirib chiqarishi mumkin, chunki bu holda foydalanuvchi ma'lumotlar bazasida sodir bo'ladigan barcha jarayonlarni nazorat qila olmaydi;
  • ishlash ta'siri: ma'lumotlar bazasi holatini o'zgartirish bo'yicha har bir buyruqni bajarishdan oldin, ma'lumotlar bazasi tizimi ushbu buyruq uchun trigger ishga tushirilishi kerakligini aniqlash uchun trigger holatini tekshirishi kerak. Bunday hisob-kitoblarni amalga oshirish DBMSning umumiy ishlashiga ta'sir qiladi va eng yuqori yuklanish vaqtida uning pasayishi ayniqsa sezilarli bo'lishi mumkin. Shubhasiz, triggerlar soni ortishi bilan bunday operatsiyalar bilan bog'liq qo'shimcha xarajatlar ham ortadi.

Noto'g'ri yozilgan triggerlar jiddiy muammolarga olib kelishi mumkin, masalan, o'lik qulflar. Triggerlar ko'plab resurslarni uzoq vaqt davomida bloklashi mumkin, shuning uchun kirish mojarolarini minimallashtirishga alohida e'tibor berilishi kerak.

MS SQL Server muhitida triggerlarni amalga oshirish

MS SQL Server DBMS ilovasi quyidagi trigger yaratish yoki oʻzgartirish operatoridan foydalanadi:

<Определение_триггера>::= (CREATE | ALTER) TRIGGER trigger_name ON (jadval_nomi | view_name) ( ( ( UCHUN | KEYIN | OʻRNI ) ( [ OʻCHIRISH] [,] [ INSERT] [,] [ YANGILASH] ) [ BILAN QOʻSHIMCHA ] [ EMAS REPLIKATSIYA ] AS sql_statement[...n] ) | ( (UCHUN | KEYIN | OʻRNI ) ( [,] ) [ QOʻSHIMCHA BILAN] [ REPLIKATSIYA UCHUN EMAS] AS ( AGAR YANGILANISH (ustun_nomi) [ (VA | YOKI) YANGILANISH( ustun_nomi)] [...n] | AGAR (COLUMNS_UPDATES() (jarayon_bit_operator) o'zgartirish_bit_mask) (taqqoslash_bit_operator) bit_mask [...n]) sql_operator [...n] ) )

Trigger faqat joriy ma'lumotlar bazasida yaratilishi mumkin, ammo trigger ichidagi boshqa ma'lumotlar bazalariga, shu jumladan uzoq serverda joylashganlarga kirish mumkin.

Keling, CREATE | dan argumentlarning maqsadini ko'rib chiqaylik ALTER TRIGGER.

Trigger nomi ma'lumotlar bazasida yagona bo'lishi kerak. Bundan tashqari, siz egasining ismini belgilashingiz mumkin.

WITH ENCRYPTION argumentini belgilaganingizda, server trigger kodini shifrlaydi, shunda hech kim, jumladan, administrator unga kira olmaydi yoki o'qiy olmaydi. Shifrlash ko'pincha dasturchining intellektual mulki yoki tijorat siri bo'lgan xususiy ma'lumotlarni qayta ishlash algoritmlarini yashirish uchun ishlatiladi.

Trigger turlari

SQL Serverda triggerlarning harakatini aniqlaydigan ikkita variant mavjud:

  • KEYIN. Trigger uni chaqirgan buyruqlar muvaffaqiyatli bajarilgandan so'ng bajariladi. Agar biron-bir sababga ko'ra buyruqlar muvaffaqiyatli bajarilmasa, trigger bajarilmaydi. Shuni ta'kidlash kerakki, foydalanuvchi so'rovini bajarish va triggerni bajarish natijasida ma'lumotlar o'zgarishi bitta tranzaktsiyaning tanasida amalga oshiriladi: agar trigger orqaga qaytarilsa, foydalanuvchi o'zgarishlari ham rad etiladi. Har bir operatsiya uchun bir nechta SOʻNG triggerlarini belgilashingiz mumkin (INSERT, UPDATE, DELETE). Agar jadvalda bir nechta AFTER triggerlari bo'lsa, sp_settriggerorder tizimining saqlangan protsedurasidan qaysi trigger birinchi va qaysi biri oxirgi ishga tushishini belgilashingiz mumkin. Odatiy bo'lib, SQL Serverda barcha triggerlar triggerlardan KEYIN bo'ladi.
  • O'RNIGA . Buyruqlarni bajarish o'rniga trigger chaqiriladi. AFTER triggeridan farqli o‘laroq, O‘RNINI trigger ham jadval, ham ko‘rinish uchun aniqlanishi mumkin. Har bir INSERT, UPDATE, DELETE amallari uchun faqat bitta O‘RNIGA trigger aniqlanishi mumkin.

Triggerlar javob beradigan buyruqlar turi bilan ajralib turadi.

Triggerlarning uch turi mavjud:

  • INSERT TRIGGER - INSERT buyrug'i yordamida ma'lumotlarni kiritishga urinilganda ishga tushiriladi.
  • UPDATE TRIGGER – UPDATE buyrug'i yordamida ma'lumotlarni o'zgartirishga urinilganda ishga tushiriladi.
  • DELETE TRIGGER – DELETE buyrug‘i yordamida ma’lumotlarni o‘chirishga urinilganda ishga tushadi.

Qurilishlar [ OʻCHIRISH] [,] [ INSERT] [,] [ YANGILASH] Va UCHUN | KEYIN | O'RNIGA ) ([,] trigger qaysi buyruqqa javob berishini aniqlang. Uni yaratishda kamida bitta buyruq ko'rsatilishi kerak. Ruxsat berilgan trigger yaratish, ikkita yoki uchta buyruqqa javob berish.

WITH APPEND har bir turdagi bir nechta triggerlarni yaratishga imkon beradi.

Da trigger yaratish REPLICATION UCHUN EMAS argumenti bilan jadvallar replikatsiya mexanizmlari bilan o'zgartirilayotganda uning ishlashi taqiqlanadi.

AS sql_operator[...n] konstruksiyasi trigger ishga tushirilganda bajariladigan SQL operatorlari va buyruqlar to‘plamini belgilaydi.

Esda tutingki, trigger ichida bir qator operatsiyalarga ruxsat berilmaydi, masalan:

  • ma'lumotlar bazasini yaratish, o'zgartirish va o'chirish;
  • ma'lumotlar bazasi yoki tranzaktsiyalar jurnalining zaxira nusxasini tiklash.

Ushbu buyruqlarni bajarishga ruxsat berilmaydi, chunki agar trigger bajarilgan tranzaksiya orqaga qaytarilsa, ularni qaytarib bo'lmaydi. Ushbu taqiq yaratilgan triggerlarning ishlashiga biron-bir tarzda ta'sir qilishi dargumon. Masalan, jadval qatorini o'zgartirgandan so'ng tranzaktsiyalar jurnalining zaxira nusxasini tiklashingiz kerak bo'lgan vaziyatni topish qiyin.

Trigger dasturlash

Yozuvlarni qo'shish, o'zgartirish va o'chirish buyruqlarini bajarishda server ikkita maxsus jadval yaratadi: kiritilgan Va o'chirildi. Ularda tranzaksiya tugagandan so'ng qo'shiladigan yoki o'chiriladigan qatorlar ro'yxati mavjud. Qo'shilgan va o'chirilgan jadvallarning tuzilishi trigger aniqlangan jadvallarning tuzilishi bilan bir xil. Har bir trigger o'zining kiritilgan va o'chirilgan jadvallar to'plamini yaratadi, shuning uchun boshqa hech qanday trigger ularga kira olmaydi. Triggerning bajarilishiga sabab bo'lgan operatsiya turiga qarab, kiritilgan va o'chirilgan jadvallarning mazmuni boshqacha bo'lishi mumkin:

  • INSERT buyrug'i - kiritilgan jadval foydalanuvchi jadvalga kiritmoqchi bo'lgan barcha qatorlarni o'z ichiga oladi; o'chirilgan jadvalda bitta qator bo'lmaydi; trigger tugallangandan so'ng, kiritilgan jadvalning barcha satrlari manba jadvaliga ko'chiriladi;
  • DELETE buyrug'i - o'chirilgan jadval foydalanuvchi o'chirmoqchi bo'lgan barcha qatorlarni o'z ichiga oladi; trigger har bir qatorni tekshirishi va uni o'chirishga ruxsat berilganligini aniqlashi mumkin; kiritilgan jadvalda qatorlar bo'lmaydi;
  • UPDATE buyrug'i - bajarilganda, o'chirilgan jadvalda trigger muvaffaqiyatli tugallangandan so'ng o'chiradigan eski qator qiymatlari mavjud. Yangi qator qiymatlari kiritilgan jadvalda mavjud. Trigger muvaffaqiyatli bajarilgandan so'ng, bu qatorlar manba jadvaliga qo'shiladi.

Trigger muvaffaqiyatli tugallanganda o'zgartiriladigan qatorlar soni haqida ma'lumot olish uchun @@ROWCOUNT; funktsiyasidan foydalanishingiz mumkin. oxirgi buyruq bilan qayta ishlangan qatorlar sonini qaytaradi. Shuni ta'kidlash kerakki, trigger ma'lum bir qatorni o'zgartirishga urinilganda emas, balki o'zgartirish buyrug'i bajarilayotgan paytda ishga tushiriladi. Bunday buyruqlardan biri ko'p qatorlarga ta'sir qiladi, shuning uchun trigger ushbu satrlarning barchasini qayta ishlashi kerak.

Agar trigger qo'shilayotgan, o'zgartirilayotgan yoki o'chirilayotgan 100 qatordan faqat bittasi ma'lum shartlarga javob bermasligini aniqlasa, hech qanday qator qo'shilmaydi, o'zgartirilmaydi yoki o'chirilmaydi. Bunday xatti-harakatlar tranzaksiya talablari bilan bog'liq - yoki barcha o'zgartirishlar bajarilishi kerak yoki hech biri.

Trigger aniq belgilangan tranzaktsiya sifatida amalga oshiriladi, shuning uchun tranzaksiyani boshqarish buyruqlari trigger ichida ishlatilishi mumkin. Xususan, yaxlitlik cheklovi buzilishi aniqlanganda, ROLLBACK TRANSACTION buyrug'i ishga tushirishni to'xtatish va foydalanuvchi qilmoqchi bo'lgan har qanday o'zgarishlarni bekor qilish uchun ishlatilishi kerak.

Triggerning bajarilishiga sabab bo'lgan INSERT yoki UPDATE buyruqlari bilan o'zgartirilgan ustunlar ro'yxatini olish uchun COLUMNS_UPDATED() funksiyasidan foydalanishingiz mumkin. U ikkilik sonni qaytaradi, uning har bir biti eng kam ahamiyatli bitdan boshlab jadvalning bitta ustuniga mos keladi (jadval yaratilganda ustunlar tartibida). Agar bit "1" ga o'rnatilgan bo'lsa, unda tegishli ustun o'zgartirilgan. Bundan tashqari, ustunning o'zgarganligi UPDATE funktsiyasi (ustun_nomi) bilan aniqlanadi.

Uchun tetikni olib tashlang buyrug'i ishlatiladi

TRIGGERNI TO'CHIRISH (trigger_nomi) [,...n]

Bu erda triggerlardan foydalanish misollari keltirilgan.

14.1-misol. Triggerdan foydalanish qiymat bo'yicha cheklovlarni amalga oshirish. Bitim jadvaliga qo'shilgan yozuvda sotilgan mahsulot miqdori uning ombor jadvalidagi qoldig'idan kam bo'lmasligi kerak.

Bitimlar jadvaliga yozuv qo'shish buyrug'i, masalan, quyidagicha bo'lishi mumkin:

SAVDO QIYMATLARIGA QO'SHISH (3,1,-299,"01/08/2002")

Yaratilgan trigger uning bajarilishiga quyidagicha munosabatda bo'lishi kerak: agar "Ombor" jadvalida mahsulot qoldig'i kiritilgan kod bilan sotilgan mahsulot miqdoridan kam bo'lsa, buyruqni bekor qilish kerak (misolda, mahsulot kodi = 3). ). Kiritilgan yozuvda mahsulot miqdori, agar mahsulot yetkazib berilgan bo'lsa, "+" belgisi bilan, agar u sotilgan bo'lsa, "-" belgisi bilan ko'rsatiladi. Taqdim etilgan trigger faqat bitta qo'shilgan yozuvni qayta ishlash uchun tuzilgan.

TRIGGER TRIGGER_INS YOZING GO'YI @@ROWCOUNT=1 QO'SHISH UCHUN tranzaksiya YO'Q AGAR BO'LMAGAN BO'LSA BAŞLAYOR (TANLAB * FROM qo'yilgan WHERE -inserted.quantity<=ALL(SELECT Склад.Остаток FROM Склад,Сделка WHERE Склад.КодТовара= Сделка.КодТовара)) BEGIN ROLLBACK TRAN PRINT "Отмена поставки: товара на складе нет" END END 14.1-misol. Qiymatga cheklovlarni amalga oshirish uchun triggerdan foydalanish.

14.2-misol. Statistik ma'lumotlarni yig'ish uchun triggerdan foydalanish.

Bitimlar jadvaliga yozuv kiritish operatsiyasini qayta ishlash uchun trigger yarating, masalan, quyidagi buyruq:

SAVDO QIYMATLARIGA KIRISH (3,1,200,"01/08/2002")

3 kodli mahsulot 1 kodli mijozdan 200 dona miqdorida yetkazib beriladi.

Buyumni sotish yoki qabul qilishda inventar miqdori mos ravishda o'zgartirilishi kerak. Agar mahsulot hali stokda bo'lmasa, siz "Ombor" jadvaliga tegishli yozuvni qo'shishingiz kerak. Trigger faqat bitta qo'shilgan qatorni qayta ishlaydi.

ALTER TRIGGER Trigger_ins ON Transaction FOR INSERT AS DECLARE @x INT, @y INT IF @@ROWCOUNT=1 bo‘lsa --BEGIN tovarlarni yetkazib berish to‘g‘risidagi Bitim jadvaliga yozuv qo‘shiladi --sotilgan tovarlar miqdori bo‘lmasligi kerak -- Ombor jadvalidagi balansidan kamroq AGAR MAVJUD BO'LMAGAN< =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 14.2-misol. Statistik ma'lumotlarni yig'ish uchun triggerdan foydalanish.

14.3-misol. Bitim jadvalidan yozuvni o'chirish operatsiyasini qayta ishlash uchun trigger yarating, masalan, quyidagi buyruq:

Yozuv o'chirilganda kodi ko'rsatilgan mahsulot uchun uning zaxira balansini sozlash kerak. Trigger o'chirish uchun faqat bitta yozuvni qayta ishlaydi.

CREATE TRIGGER Trigger_del ON CREATE TRIGGER Trigger_del ON O‘CHIRISH UCHUN tranzaksiya, go‘yo @@ROWCOUNT=1 -- bitta yozuv o‘chiriladi BEGIN DECLARE @y INT,@x INT --mahsulotning kodi va miqdori Ombor jadvalidan o‘chirilgan --yozuvdan aniqlanadi. SELECT @y=Mahsulot kodi, @ x=Miqdor FROM oʻchirildi --ombor jadvalida --modda miqdori sozlangan. YANGILANISH Ombor toʻplami Qolgan=Qolgan-@x QAYERDA Mahsulot kodi=@y END 14.3-misol. Jadvaldan yozuvni o'chirish operatsiyasini qayta ishlash uchun trigger

14.4-misol. Bitim jadvalidagi yozuvni o'zgartirish operatsiyasini qayta ishlash uchun trigger yarating, masalan, quyidagi buyruq bilan:

3 ga teng kodli tovarlar bilan barcha operatsiyalarda tovarlar miqdorini 10 birlikka kamaytiring.

Belgilangan buyruq Bitimlar jadvalidagi bir vaqtning o'zida bir nechta yozuvlarni o'zgartirishga olib kelishi mumkin. Shuning uchun biz bir nechta yozuvlarni qayta ishlaydigan triggerni qanday yaratishni ko'rsatamiz. Har bir o'zgartirilgan yozuv uchun eski (o'zgarishdan oldin) mahsulot kodi uchun ombordagi mahsulot qoldig'ini eski (o'zgarishdan oldingi) mahsulot miqdori qiymatiga va yangi (o'zgarishdan keyin) kamaytirish kerak. o'zgartirish) mahsulot kodi, uning ombordagi qoldig'ini yangi (o'zgartirilgandan keyin) qiymatining qiymatiga oshirish uchun. Barcha o'zgartirilgan yozuvlarni qayta ishlash uchun biz barcha eski (o'chirilgan jadvaldan) va barcha yangi qiymatlarni (qo'shilgan jadvaldan) saqlaydigan kursorlarni kiritamiz.

TRIGGER CREATE Trigger_upd tranzaksiyani YANGILASH UCHUN DECLARE @x INT, @x_old INT, @y INT, @y_old INT -- kursor yangi qiymatlarga ega. CUR1 KURSORNI TANLASH Mahsulot kodini, Miqdor FROM kiritilgan - eski qiymatlar bilan kursor ​CUR2 KURSORNI MAHSULOT kodini TANLASH UCHUN E’LON EDING, Miqdori o‘chirilgan OPEN CUR1 OCHIQ CUR2 -- ikkala kursor orqali parallel ravishda harakatlantiring. BEGIN -- eski mahsulot kodi uchun u kamayadi --ombordagi miqdor YANGILANISH Ombor to'plami Qolgan=Qolgan-@y_old QAYoda Mahsulot kodi=@x_old --yangi mahsulot kodi uchun, agar bunday mahsulot hali stokda bo'lmasa, yangi yozuv kiritiladi AGAR MAVJUD BO'lmasa (Tanlash * Ombordan QAYERDA Mahsulot kodi=@x) Omborga INSERT INTO (Mahsulot kodi, qolgan) QIYMATLAR (@x,@y) BOSHQA --aks holda yangi mahsulot kodi uchun u ortadi -- uning zaxiradagi miqdori YANGILANISh Ombor TO'PLAM Qolgan=Qolgan+@y QAYERDA Mahsulot kodi=@x CUR1 dan KEYINGI @x GA OLISH, @y CUR2 dan KEYINGIDAN KELIB @x_old GA, @y_old TUG'IRISH CUR1 YOQISH CUR2 YOQISH CUR12 14.4-misol. jadvaldagi yozuvni o'zgartirish uchun operatsiyani qayta ishlash uchun trigger

Ko'rib chiqilayotgan triggerda, bitim yozuvi ombordagi qoldiq bilan o'zgartirilganda tovarlar miqdorini taqqoslash yo'q.

14.5-misol. Keling, bu kamchilikni tuzataylik. Xato xabarini yaratish uchun biz trigger tanasida MS SQL Server RAISERROR buyrug'idan foydalanamiz, uning argumentlari xabar matni, jiddiylik darajasi va xato holati.

TRIGGER ALTER Trigger_upd tranzaksiyani yangilash uchun @x INT, @x_old INT, @y_old INT, @y_old INT,@o INT E'lon qiling CUR1 KURSORNI TALANLASH element kodi, Miqdori FROM QO'SHILGAN QO'SHIMCHI CUROR 2 CURSOR kodini o'chirib tashlang CUR1 OCHIQ CUR2 KEYINGI CUR1 dan @x ga, @y CUR2 KEYINGIDAN @x_old, @y_old OLISH @@FETCH_STATUS=0 BOSHLASH @o=ombordan qolgan QAYERDA mahsulot kodi=@x AGAR @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 14.5-misol. Jadvaldagi yozuvni o'zgartirish operatsiyasini qayta ishlash uchun triggerning tuzatilgan versiyasi

14.6-misol. Misolda, agar ulardan kamida bittasini amalga oshirishning iloji bo'lmasa, barcha o'zgarishlar bekor qilinadi. Keling, faqat ba'zi yozuvlardagi o'zgarishlarni bekor qilish va qolganlarini o'zgartirish imkonini beruvchi trigger yarataylik.

Bunday holda, trigger yozuvlar o'zgartirilgandan keyin bajarilmaydi, lekin o'zgartirish buyrug'i o'rniga.

@k INT, @k_old INT DECLARE @x INT, @x_old INT, @y INT DECLARE @y_old INT,@o INT E'lon qilish kabi yangilanish o'rniga Trigger_upd tranzaksiyani TRIGGERNI O'ZGARTIRING. kiritildi TANLASH UCHUN CUR2 KURSORI E'lon qiling. Tranzaksiya kodi, mahsulot kodi, miqdori oʻchirildi OCHIQ CUR1 CUR1 KEYINGI OCHIQ CUR2 KEYINGI CUR1 dan @k,@x, @y OLISH CUR2 dan @k_old,@x_old, @y_old, @ATF=WETCH_ 0 BEGIN SELECT @ o=remaining FROM OF FROM WHERE Mahsulot kodi=@x AGAR @o>=-@y BEGIN RAISERROR("oʻzgartirish",16,10) YANGILANISh Tranzaksiya SET miqdori=@y, Mahsulot kodi=@x QAYERDA Tranzaksiya kodi =@k YANGILANISh Ombor to'plami Qolgan =Qolgan-@y_old QAYERDA Element kodi=@x_old AGAR MAVJUD BO'LSA (* O'ZBEKISTONDAN TANGLANING QERDA Element kodi=@x) Omborga kiriting (element kodi, qolgan) QIYMATLAR (@x,@y) BOSHQA YANGILANISH Ombor to‘plami Qolgan=Qolgan+@y QAYERDA Element kodi=@x TUGADI ELSE RAISERROR("yozuv o‘zgartirilmagan",16,10) CUR1DAN KEYINGI OLISH @k,@x, @y KEYINGI CUR2DAN @k_oldga olib keling, @x_old, @y_old TUG'IRISH CUR1 CUR1 YOQTIRISH CUR2 CUR1 CUR2 BO'LISHI 14.6-misol. Faqat ba'zi yozuvlardagi o'zgarishlarni bekor qilish va qolganlarini o'zgartirish imkonini beruvchi trigger.