ALTER TRIGGER. Trigger nomi ma'lumotlar bazasida yagona bo'lishi kerak. Majburiy emas, 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 muallifning 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 qaytsa, foydalanuvchi o'zgarishlari ham rad etiladi. Har bir operatsiya uchun bir nechta SOʻYINI triggerlarini belgilashingiz mumkin (INSERT , UPDATE , DELETE ). Agar jadvalda bir nechta AFTER triggerlari bo'lsa, qaysi biri birinchi va qaysi biri oxirgi bajarilishini belgilash uchun sp_settriggerorder tizimining saqlangan protsedurasidan foydalanishingiz mumkin. Odatiy bo'lib, SQL Serverdagi barcha triggerlar triggerlardan KEYIN bo'ladi.
O'RNIGA . Buyruqlarni bajarish o'rniga trigger chaqiriladi. AFTER triggeridan farqli o'laroq, trigger O'RNINI jadvalda ham, ko'rinishda ham aniqlash 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 tushiriladi.
Qurilishlar [DELETE][,][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, bu ikkita yoki uchta buyruqqa javob beradi.
WITH APPEND argumenti 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.
Bu buyruqlarga ruxsat berilmaydi, chunki triggerni ishga tushiruvchi tranzaksiya orqaga qaytarilsa, ularni bekor qilib bo'lmaydi. Ushbu taqiq yaratilgan triggerlarning funksionalligiga biron-bir tarzda ta'sir qilishi dargumon. Masalan, jadval qatorini o'zgartirgandan so'ng, tranzaktsiyalar jurnalining zaxira nusxasini tiklash kerak bo'lganda, bunday vaziyatni topish qiyin.
Trigger dasturlash
Yozuvlarni qo'shish, o'zgartirish va o'chirish buyruqlarini bajarishda server ikkita maxsus jadval yaratadi: kiritilgan va o'chirildi. Ular tranzaktsiya oxirida qo'shiladigan yoki olib tashlanadigan qatorlar ro'yxatini o'z ichiga oladi. 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 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 qator bo'lmaydi;
UPDATE buyrug'i - bajarilganda, o'chirilgan jadvalda muvaffaqiyatli tugallangandan so'ng o'chiradigan eski qator qiymatlari mavjud
Oxirgi yangilanish: 09.11.2017
Triggerlar - jadval yoki ko'rinishda ma'lum amal bajarilganda, xususan, ma'lumotlarni qo'shish, o'zgartirish yoki o'chirishda, ya'ni INSERT, UPDATE, DELETE buyruqlarini bajarishda avtomatik ravishda chaqiriladigan maxsus turdagi saqlanadigan protseduralar.
Triggerning rasmiy ta'rifi:
CREATE TRIGGER trigger_name ON (jadval_nomi | view_name) (KEYIN | OʻRNIGA) sql_expressions sifatida
Trigger CREATE TRIGGER iborasidan keyin trigger nomi bilan yaratiladi. Qoida tariqasida, trigger nomi operatsiyalar turini va operatsiya bajariladigan jadval nomini aks ettiradi.
Har bir trigger ON so'zidan keyin nomi ko'rsatilgan ma'lum bir jadval yoki ko'rinish bilan bog'langan.
Keyin trigger turi o'rnatiladi. Biz ikkita turdan birini ishlatishimiz mumkin:
KEYIN : harakat tugallangandan keyin bajariladi. Faqat jadvallar uchun belgilangan.
O‘RNI : 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 aniqlanayotgan operatsiya keladi: INSERT , UPDATE yoki DELETE .
Trigger uchun AFTER bir vaqtning o'zida bir nechta amallarga qo'llanilishi mumkin, masalan, UPDATE va INSERT. Bunday holda, operatsiyalar vergul bilan ajratilgan holda belgilanadi. Trigger O'RNI uchun faqat bitta amalni belgilash mumkin.
Va keyin AS so'zidan keyin aslida trigger tanasini tashkil etuvchi SQL iboralari to'plami keladi.
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. Lekin mahsulot narxi ko'pincha qo'shilgan qiymat solig'i, qo'shilgan korruptsiyaga soliq va boshqalar kabi turli xil qo'shimcha to'lovlarni o'z ichiga oladi. 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 sozlashimiz mumkin.
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, qo'shish yoki o'zgartirish paytida ma'lumotlar kiritilgan oraliq jadvalda saqlanadi. U avtomatik ravishda yaratiladi. Va undan biz qo'shilgan/o'zgartirilgan mahsulotlar haqida ma'lumot olishimiz mumkin.
Mahsulotlar jadvaliga mahsulotni qo'shgandan so'ng, aslida mahsulot qo'shish paytida aniqlanganidan bir oz yuqoriroq narxga ega bo'ladi:
Trigger o'chirilmoqda
Triggerni olib tashlash uchun DROP TRIGGER buyrug'idan foydalaning:
TRIGGER mahsulotlari_INSERT_UPDATE
Triggerni o'chirish
Shunday bo'ladiki, biz triggerning harakatini to'xtatmoqchimiz, 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
Trigger kerak bo'lganda, uni ENABLE TRIGGER buyrug'i yordamida yoqish mumkin:
TRIGGER Products_INSERT_UPDATE ON MAHSULOTLARNI YOQISH
Trigger jadvaldagi yozuvni o'zgartirish, o'chirish yoki qo'shishda ma'lumotlar bazasi protsedurasiga o'xshash pastki dasturdir. Dasturdan triggerlarga kirish, ularga parametrlarni uzatish yoki ulardan natija 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 jadvallarni e'lon qilishda yaratiladigan mos yozuvlar spetsifikatsiyalari triggerlar orqali ham amalga oshiriladi, ammo bu triggerlarning matnini tahrirlash mumkin emas.