← Back to MySQL Course | Chapter 16: Triggers | Lesson 2 of 3

BEFORE और AFTER Triggers

BEFORE triggers एक checker जैसे हैं जो आपके काम को submit करते ही fix कर देता है, जबकि AFTER triggers तब act करते हैं जब काम पहले से saved हो चुका हो।
Syntax
sql
CREATE TRIGGER trigger_name
BEFORE | AFTER  INSERT | UPDATE | DELETE
ON table_name
FOR EACH ROW
BEGIN
  -- NEW.column_name, OLD.column_name
END

BEFORE बनाम AFTER Triggers

BEFORE triggers MySQL के actually disk पर एक row लिखने से पहले execute होते हैं, उन्हें पहले data inspect या बदलने का मौका देते हुए, जबकि AFTER triggers सिर्फ तभी चलते हैं जब change पहले से permanently save हो चुका हो।

उदाहरण: BEFORE vs AFTER Triggers

sql
DELIMITER //
CREATE TRIGGER before_insert_user BEFORE INSERT ON users
FOR EACH ROW
BEGIN
  SET NEW.email = LOWER(NEW.email);
END //
CREATE TRIGGER after_insert_user AFTER INSERT ON users
FOR EACH ROW
BEGIN
  INSERT INTO user_audit (user_id, action) VALUES (NEW.id, 'created');
END //
DELIMITER ;

⚠️ This is MySQL-specific syntax. It cannot run in the browser editor. Practice this on your local MySQL installation.

Data साफ करने के लिए BEFORE Triggers इस्तेमाल करना

क्योंकि एक BEFORE trigger write से पहले चलता है, यह incoming data validate या reformat करने की सही जगह है — NEW keyword इस्तेमाल करके, आप store होने से पहले एक value adjust कर सकते हैं।

उदाहरण: Using BEFORE Triggers to Clean Data

sql
DELIMITER //
CREATE TRIGGER trim_name BEFORE INSERT ON users
FOR EACH ROW
BEGIN
  SET NEW.name = TRIM(NEW.name);
END //
DELIMITER ;

⚠️ This is MySQL-specific syntax. It cannot run in the browser editor. Practice this on your local MySQL installation.

UPDATE Triggers में OLD Values Access करना

UPDATE triggers को एक साथ OLD और NEW दोनों तक access है, आपको directly compare करने देते हुए कि change से पहले एक row कैसी दिखती थी बनाम बाद में यह कैसी दिखती है, जो audit logs बनाने के लिए ज़रूरी है।

उदाहरण: Accessing OLD Values in UPDATE Triggers

sql
DELIMITER //
CREATE TRIGGER log_email_change BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
  IF OLD.email <> NEW.email THEN
    INSERT INTO user_audit (user_id, action) VALUES (OLD.id, CONCAT('email changed from ', OLD.email, ' to ', NEW.email));
  END IF;
END //
DELIMITER ;

⚠️ This is MySQL-specific syntax. It cannot run in the browser editor. Practice this on your local MySQL installation.

BEFORE DELETE Triggers

एक BEFORE DELETE trigger एक row गायब होने से ठीक पहले चलता है, और क्योंकि उस moment पर row अभी भी exist करता है, OLD keyword आपको इसके details हमेशा के लिए गायब होने से पहले capture और log करने देता है।

उदाहरण: BEFORE DELETE Triggers

sql
DELIMITER //
CREATE TRIGGER log_deleted_user BEFORE DELETE ON users
FOR EACH ROW
BEGIN
  INSERT INTO user_audit (user_id, action) VALUES (OLD.id, 'deleted');
END //
DELIMITER ;

⚠️ This is MySQL-specific syntax. It cannot run in the browser editor. Practice this on your local MySQL installation.

Audit Logs Verify करना

BEFORE और AFTER triggers द्वारा populated एक audit table query करना आपको यह review करने देता है कि किसने क्या और कब बदला इसका पूरा history, बिना application को खुद कभी वह logging code लिखना पड़े।

उदाहरण: Verifying Audit Logs

sql
CREATE TABLE user_audit (user_id INT, action TEXT);
INSERT INTO user_audit VALUES (1, 'created'), (1, 'deleted');
SELECT * FROM user_audit WHERE user_id = 1;

⚠️ This is MySQL-specific syntax. It cannot run in the browser editor. Practice this on your local MySQL installation.

Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. save करने से पहले बदले जाने वाले data के validation या cleaning के लिए AFTER चुनना, जबकि BEFORE चाहिए।
  2. एक BEFORE DELETE trigger में NEW इस्तेमाल करना, जिसकी कोई नई values नहीं होतीं।
  3. एक trigger लिखना जो उसी table को update करता है जिस पर यह fire होता है, जिसकी अनुमति नहीं और एक error देता है।
🔒

Chapter Quiz — Complete all 3 topics to unlock

0/3 topics done

Complete these topics first:

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.