تڕیگەر (Trigger) چییە؟

تڕیگەر بریتییە لە کۆمەڵێک کۆدی SQL کە بەشێوەیەکی ئۆتۆماتیکی جێبەجێ دەبن کاتێک کردارێکی دیاریکراو (وەک INSERT, UPDATE, یان DELETE) لەسەر خشتەیەک ئەنجام دەدرێت. تڕیگەرەکان زۆر بەسوودن بۆ دڵنیابوون لەوەی کە داتاکان بە دروستی دەمێننەوە و بۆ تۆمارکردنی مێژووی گۆڕانکارییەکان.

تڕیگەرەکان وەک "پاسەوان" وان بۆ داتابەیسەکەت؛ ئەوان چاودێری هەموو گۆڕانکارییەک دەکەن و ڕێگە نادەن هیچ کردارێک بەبێ ئاگاداری تۆ ئەنجام بدرێت.

پێکهاتەی دروستکردنی تڕیگەر

بۆ دروستکردنی تڕیگەر، پێویستە بزانین کە ئایا دەمانەوێت کردارەکە "پێش" (BEFORE) یان "دوای" (AFTER) ئەو ڕووداوە بێت کە لە خشتەکەدا ڕوودەدات. ئەمەش نموونەیەکە بۆ دروستکردنی تڕیگەرێک کە نرخێک نوێ دەکاتەوە:

DELIMITER //
CREATE TRIGGER before_update_price
BEFORE UPDATE ON products
FOR EACH ROW
BEGIN
    IF NEW.price < 0 THEN
        SET NEW.price = 0;
    END IF;
END;//
DELIMITER ;

لە نموونەی سەرەوەدا، تڕیگەرەکە چاودێری خشتەی products دەکات. ئەگەر نرخێک بە هەڵە بە کەمتر لە سفر دابنرێت، تڕیگەرەکە بەشێوەی ئۆتۆماتیکی نرخەکە دەکات بە سفر.

هەڵەی باو

یەکێک لە هەڵە باوەکان ئەوەیە کە لەبیر دەچێت بڕگەی DELIMITER بەکاربهێنرێت. ئەم بڕگەیە زۆر گرنگە چونکە بە MySQL دەڵێت کە کۆتایی کۆدەکە لێرەیە، ئەگەر بەکاری نەهێنیت، سیمی کۆلۆنەکانی ناو تڕیگەرەکە دەبنە هۆی وەستانی پرۆسەکە.

تۆمارکردنی مێژووی گۆڕانکارییەکان (Audit Log)

یەکێک لە بەکارهێنانە سەرەکییەکانی تڕیگەر، تۆمارکردنی ئەو گۆڕانکارییانەیە کە بەکارهێنەران ئەنجامی دەدەن. با سەیری ئەم نموونەیە بکەین:

CREATE TRIGGER after_delete_user
AFTER DELETE ON users
FOR EACH ROW
INSERT INTO deleted_users_log (user_id, deleted_at)
VALUES (OLD.id, NOW());

لێرەدا، هەر کاتێک بەکارهێنەرێک بسڕدرێتەوە، تڕیگەرەکە ID-ی بەکارهێنەرەکە و کاتی سڕینەوەکەی لە خشتەی deleted_users_log تۆمار دەکات. بەکارهێنانی OLD ڕێگەت پێدەدات دەستت بەو داتایانە بگات کە پێش سڕینەوەکە هەبوون.

تێبینی: هەرگیز تڕیگەرێک دروست مەکە کە ببێتە هۆی "بازنەی داخراو" (Infinite Loop)، بۆ نموونە تڕیگەرێک لەسەر خشتەی A دروست بکەیت کە گۆڕانکاری لە خشتەی A بکات، چونکە ئەمە دەبێتە هۆی ئەوەی تڕیگەرەکە بەردەوام خۆی بانگ بکاتەوە.

بەکارهێنانی NEW و OLD

تێگەیشتن لەم دوو وشەیە زۆر گرنگە:

  • NEW: ئاماژەیە بۆ ئەو داتایەی کە تازە هاتووە (لە کاتی INSERT یان UPDATE).
  • OLD: ئاماژەیە بۆ ئەو داتایەی کە پێشتر هەبووە (لە کاتی UPDATE یان DELETE).

سڕینەوەی تڕیگەر

ئەگەر پێویستت بە تڕیگەرەکە نەما، دەتوانیت بە ئاسانی بیسڕیتەوە بە بەکارهێنانی فەرمانی DROP:

DROP TRIGGER IF EXISTS before_update_price;

ئەرکی پراکتیکی

تۆ ئێستا دەزانیت چۆن تڕیگەر دروست بکەیت. وەک مەشقێک، تڕیگەرێک دروست بکە کە هەر کاتێک نرخ (price) لە خشتەی products گۆڕدرا، کاتی گۆڕانکارییەکە لە خشتەیەکی دیکە بە ناوی price_logs تۆمار بکات.

ئەمانە ئەم فێرکارییەیان تەواوکردووە

1 فێرخواز تەواویان کردووە