khaled moazedi
khaled moazedi
خواندن ۴ دقیقه·۵ ماه پیش

تریگر ها در SQL


تریگر درواقع یه قابلیت قدرتمند از زبان sql هست که به ما اجازه میده یه سری خواسته هامون رو بصورت اتوماتیک در سطح دیتابیس مدیریت کنیم
تریگر نوعی از فانکشن هاست که وقتی یه اکشن خاصی در دیتابیس صورت میگیره بصورت خودکار اجرا میشه مث insert , update, delete و ... از تریگر میشه برای هندل کردن مشکلات مختلفی کمک گرفت مثلا business rules, data validate , ...

انواع تریگر ها :

1. نوع یک Before Triggers : این ترگرها یت میشن که قبل از مثلا اینزرت شدن یه row یه کاری رو انجام بدن
2. نوع دو After Triggers : ان تریگرها ست میشن تا عملی رو بعد از یه اکشنی روی دیتابیس صورت بدن مثلا بعد از دیلیت شدن هر رکوردی یه مقداری رو افزایش بدن بصورت خودکار
3. نوع سوم Instead of Triggers :

تریگر ایونت ها :
تریگر ها روی چند نوع استیتمنت اجرا میشن Insert , Update , Delete

ساخت تریگر :

CREATE TRIGGER trigger_name { BEFORE | AFTER | INSTEAD OF } { INSERT | UPDATE | DELETE } ON table_name FOR EACH ROW BEGIN -- trigger code here END;

جمله ی اول :‌ CREATE TRIGGER >> این بخش کلید واژه ی CREATE رو داره که برای ساختن هر عنصری استفاده میشه و تریگر هم یک عنصر در زبان SQL هست . TRIGGER هم کلید واژه ی تریگره و همونطور که مشخصه بعد از اون نام تریگر رو انتخاب کرده
بخش هایی که در کرلی بریس {} گذاشته شده هم متودهایی هست که میتونیم بعد از دستور ساختن و تریگر و نامش بنا به هدفی که از این تریگر دنبال میکنیم استفاده ببریم
فرض کن قراره یه تریگر بسازم که یه استاتوس رو روی یه تیبلی مثلا به اسم persons برای هر row جنریت کنه مثلا هر row جدیدی که اینزرت میشه استاتوس رو به pending تغییر بده . میگم :


  • CREATE TRIGGER trg_Persons_Insert
    BEFORE INSERT ON persons


ترجمه ش میشه : یه تریگر بساز به اسم trg_Persons_insert ( خود اسم شامل همه ی این توصیفات هست ) که قبل از اینزرت روی تیبل persons ...
چکار میکنه ؟
جمله ی دوم : FOR EACH ROW این یعنی روی هر رکورد جدیدی اینکارو بکن
جمله ی سوم : BEGIN : معلومه دیگه یعنی کاری که قراره بکنه از اینجا شروع میشه ! حالا در مثال خودم میشه

BEFOR INSERT ON persons FOR EACH ROW BEGIN : SET NEW.status = 'pending' ; END;

الان ترجمه ش میشه ؛ قبل از اینکه هر رکورد جدیدی بیاد برای هر ROW ایتاتوس رو به pending تغییر بده و تمام .
گاهی ممکنه بخوای تایم آپدیت شدن رو به عهده ی خود دیتابیس نذاری و با یه تریگر هندلش کنی (فرض کن آدم به دیتابیس اعتماد نداره مثلا D: ) اونوقت بعد از هر آپدیت میخوای مقدار updated_at رو به زمان حال تغییر بدی :
یه تریگر مینویسی

CREATE TRIGGER ON persons FOR EACH ROW BEGIN: SET NEW.updated_at=NOW(); //یا ممکنه یه ستون دیگه داشته باشی که اخرین بروزرسانی رو نگه میداره // SET NEW.last_update= NOW(); END;

یا حتی ولیدیشن که یکی از بیشترین کاربردهای تریگر میتونه باشه
مثلا برای اد کردن سن یه نفر نمیخوایم مقدار منفی بتونه وارد بشه و این رو در سطح دیتابیس با یه تریگر میخوایم هندل کنیم (البته خیلی از این ولیدیشنها رو برخی dbms ها خودشون هندل کردن و این صرفا یه مثاله برای تقریب به ذهن)

CREATE TRIGGER trg_persons_Insert BEFORE INSERT ON persons FOR EACH ROW BEGIN IF NEW.age <= 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Age must be greater than 0'; END IF; END;

اینجا گفته IF NEW.age <= 0 THEN اگر مقداری که برای age میاد کمتر از ۰ بود چکار کن ؟ یه ارروز کد با عدد 45000 ریز کن و یه پیغام رو برگردون که : age must be greater than 0 . نباید منفی باشه خلاصه !
و end if یعنی شرط تموم شد . بعدم که end یعنی کارم باهات تموم شد...
SIGNAL یه کی ورد یا کلمه ی کلیدیه برای INTERRUPT ایجاد کردن (مختل کردن) حالت نرمال اجرای یه کد sql بر گردوندن یه اررور . این کد هم 45000 یه استاتداردیه که توسط خود زبان sql در نطر گرفته شده برای نشون دادن خطای ورودی کاربر


اگر نکته ی دیگه ای هست یا اشتباهی رو در توضیحات دیدید ممنون میشیم که گوشزد کنید تا استفاده کنیم
take it easy man ... :D

sqldatabasedb
back end developer .. copy writter
شاید از این پست‌ها خوشتان بیاید