MySQL ට්‍රිගර්ස් පැහැදිලි කිරීම: ඒවා කෙසේ ක්‍රියා කරයි, උදාහරණ, හොඳ පුරුදු, සහ දෝෂ නිරාකරණය

目次

1. හැඳින්වීම

MySQL Trigger එකක් කියන්නේ කුමක්ද?

MySQL trigger එකක් යනු ස්වයංක්‍රීයව ක්‍රියා කරන ක්‍රියාවලියකි, විශේෂිත දත්ත මෙහෙයුමක් (INSERT, UPDATE, DELETE) සිදුවන විට.
සාමාන්‍යයෙන්, SQL විමසුම් අතින් ක්‍රියාත්මක කළ යුතුය, නමුත් ඔබ trigger එකක් සකස් කළ පසු, දත්ත ගබඩාව ස්වයංක්‍රීයව ඔබ වෙනුවෙන් විශේෂ ක්‍රියාමාර්ග සිදු කරයි.

උදාහරණයක් ලෙස, trigger එකක් භාවිතා කර ගනුදෙනුකරුවන්ගේ තොරතුරු යාවත්කාලීන වන විට ලොග් වගුවක වෙනස්කම් ඉතිහාසය සටහන් කරගත හැක, හෝ නව ඇණවුම් දත්ත ඇතුළත් වන විට ස්වයංක්‍රීයව තොගය සකස් කළ හැක.

Trigger වල භාවිතා සහ ප්‍රතිලාභ

MySQL trigger ගණනාවක් දත්ත ගබඩා මෙහෙයුම් වල පහත ප්‍රතිලාභ ලබා දෙයි.

දත්ත අඛණ්ඩතාව ස්වයංක්‍රීයව රැක ගැනීම

Trigger භාවිතා කිරීමෙන් සම්බන්ධිත දත්ත අතර අඛණ්ඩතාව අතින් රැක ගැනීමට අවශ්‍යතාවය ඉවත් වේ.
උදාහරණයක් ලෙස, මකා දැමූ දත්ත සඳහා ස්වයංක්‍රීයව පිටපතක් සකස් කරන යන්ත්‍රණයක් ඔබට හඳුන්වා දිය හැක.

ස්වයංක්‍රීය ලොග් කිරීම

දත්ත වෙනස්කම් ඉතිහාසය සටහන් කිරීම සඳහා ලොග් වගුවක් සෑදිය හැකි අතර, trigger භාවිතා කර ඒ වෙනස්කම් ස්වයංක්‍රීයව ගබඩා කළ හැක.
මෙම ක්‍රියාවලිය මඟින් කවුරුන් දත්ත වෙනස් කළේද, කවදා වෙනස් කළේද යන්න හඳුනා ගැනීමට හැකියාව ලැබේ.

දත්ත සැකසීම ස්වයංක්‍රීය කිරීම

විශේෂිත සිදුවීමක් සිදුවන විට, ඔබට පෙරනිමි සැකසීම ස්වයංක්‍රීයව ක්‍රියාත්මක කළ හැක.
උදාහරණයක් ලෙස, නව ඇණවුමක් එක් කරන විට තොගය අඩු කිරීමෙන් දත්ත ගබඩා නඩත්තුව සරල කළ හැක.

සමාන්‍ය ව්‍යාපාර නීති අදාළ කිරීම

Trigger මඟින්, දත්ත මෙහෙයුම් අතර සෑම විටම විශේෂිත සැකසීම ක්‍රියාත්මක වන බැවින්, ව්‍යාපාර නීති සමාන්‍යව අදාළ කළ හැක.
උදාහරණයක් ලෙස, දත්ත ගබඩාවේ පාර්ශ්වයෙන් නකල අගයන් ඇතුළත් වීම වැළැක්වීමට සත්‍යාපනය ක්‍රියාත්මක කළ හැක.

ඔබට Trigger ගැන ඉගෙන ගැනීමට හේතු

Trigger ගණනාවක් අයදුම්පත් සංවර්ධනය සහ දත්ත කළමනාකරණය සඳහා ඉතා බලවත් මෙවලමකි.
විශේෂයෙන්, පහත සඳහන් තත්ත්වයන්හි trigger භාවිතා කිරීම නිර්දේශ කරයි.

  • දෘඩ දත්ත අඛණ්ඩතාව : දත්ත වෙනස්වීමේදී, සම්බන්ධිත අනෙකුත් දත්ත ස්වයංක්‍රීයව යාවත්කාලීන කර අඛණ්ඩතාව රැකගත හැක.
  • ලොග් කළමනාකරණය සරල කිරීම : වෙනස්කම් ඉතිහාසය අතින් සටහන් කිරීම වෙනුවට, trigger මඟින් ස්වයංක්‍රීය ලොග් කිරීමෙන් මෙහෙයුම් පණිවිඩය අඩු කළ හැක.
  • දත්ත අසමතුලිතතා වැළැක්වීම : trigger භාවිතා කර ඇතුළත් දත්ත සත්‍යාපනය කිරීමෙන් අසත්‍ය දත්ත ඇතුළත් වීම වැළැක්විය හැක.

මෙම ආකාරයෙන්, trigger භාවිතා කිරීම දත්ත ගබඩා කළමනාකරණය වැඩි දියුණු කර පද්ධතියේ විශ්වාසනීයතාවය වැඩි කරයි.

2. MySQL Trigger මූලික කරුණු

Trigger කොම්පොනන්ට්ස්

MySQL trigger ගණනාවක් යනු විශේෂිත දත්ත මෙහෙයුම් (INSERT, UPDATE, DELETE) සිදුවන විට ස්වයංක්‍රීයව SQL ක්‍රියාත්මක කරන යන්ත්‍රණයකි.
මූලිකව, trigger එක පහත ත්‍රිත්ව අංග වලින් සමන්විත වේ.

1. සිදුවීම (trigger එක ක්‍රියාත්මක වන වේලාව)

Trigger ගණනාවක් පහත දත්ත මෙහෙයුම් සිදුවීම් මත ක්‍රියා කරයි.

  • INSERT : නව දත්ත එකතු වන විට
  • UPDATE : පවතින දත්ත සංස්කරණය වන විට
  • DELETE : දත්ත මකා දැමෙන විට

2. කාලය (BEFORE / AFTER)

Trigger එක පෙර (BEFORE) හෝ පසු (AFTER) ඉලක්ක දත්ත මෙහෙයුම ක්‍රියාත්මක වන විට ක්‍රියා කරයි.

  • BEFORE trigger
  • INSERT, UPDATE, හෝ DELETE කිරීමට පෙර ක්‍රියා කරයි
  • දත්ත සත්‍යාපනය හෝ වෙනස්කම් අවහිර කිරීම සඳහා භාවිතා වේ
  • උදාහරණය: අසත්‍ය ඇතුළත් කිරීම (උදා. නකල අගයන් අනුමත නොකිරීම) වැළැක්වීම
  • AFTER trigger
  • INSERT, UPDATE, හෝ DELETE කිරීමෙන් පසු ක්‍රියා කරයි
  • ලොග් කිරීම සහ සම්බන්ධිත වගු යාවත්කාලීන කිරීම සඳහා භාවිතා වේ
  • උදාහරණය: ලොග් වගුවක වෙනස්කම් ඉතිහාසය සුරකින්න

3. පරාසය (row-level / statement-level)

  • Row-level trigger (FOR EACH ROW)
  • එම trigger එක සම්බන්ධිත සෑම පේළියක් සඳහා එක් වරක් ක්‍රියා කරයි (MySQL හි row-level trigger පමණක් සහාය දක්වයි)
  • උදාහරණය: UPDATE මඟින් බහු පේළි යාවත්කාලීන කරන විට, trigger එක සෑම පේළියක් සඳහාම ක්‍රියා කරයි
  • Statement-level trigger (MySQL හි සහාය නොදක්වයි)
  • trigger එක INSERT හෝ UPDATE ප්‍රකාශයක් සඳහා එක් වරක් පමණක් ක්‍රියා කරයි (MySQL හි සහාය නොදක්වයි)

Trigger වර්ග සහ තේරීමේ ක්‍රමය

සංයෝජනය මත පදනම්ව, ඔබට trigger හය වර්ග නිර්වචනය කළ හැක.

Trigger TypeEventTimingPrimary Use
BEFORE INSERTINSERTBeforeData validation (prevent invalid values)
AFTER INSERTINSERTAfterLog records, create backups
BEFORE UPDATEUPDATEBeforeCheck updated data, enforce constraints
AFTER UPDATEUPDATEAfterRecord change history, sync other tables
BEFORE DELETEDELETEBeforeBack up data before deletion
AFTER DELETEDELETEAfterRecord deletion history

ප්‍රායෝගික උදාහරණ

1. අසත්‍ය දත්ත අවහිර කිරීම සඳහා BEFORE INSERT trigger එකක් භාවිතා කිරීම

CREATE TRIGGER prevent_negative_salary
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
  IF NEW.salary < 0 THEN
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = 'Salary cannot be a negative value';
  END IF;
END;

මෙම ට්‍රිගර් කරන දේ

  • ඍණ අගයන් ඇතුළත් වීම වැලැක්වයි (දෝෂ සැකසීම)

2. ලොග් ලිවීමට AFTER INSERT ට්‍රිගර් භාවිතා කරන්න

CREATE TRIGGER log_new_user
AFTER INSERT ON users
FOR EACH ROW
BEGIN
  INSERT INTO user_logs (user_id, action, timestamp)
  VALUES (NEW.id, 'Registered', NOW());
END;

මෙම ට්‍රිගර් කරන දේ

  • users වගුවට නව පරිශීලකයෙක් එක් කරන විට, user_logs වගුවේ ලියාපදිංචි ලොග් එකක් සටහන් කරයි.

ට්‍රිගර් සහ ගබඩා කළ ක්‍රම අතර වෙනස

ItemTriggerStored Procedure
How it runsRuns automaticallyRuns explicitly using CALL
Primary useAutomatic processing on data changesComplex SQL processing used repeatedly
Return valueNoneHas return value(s)
Transaction controlNot possiblePossible

සාරාංශය

  • MySQL ට්‍රිගර් දත්ත මෙහෙයුම් අතර ස්වයංක්‍රීයව SQL ක්‍රියාත්මක කරයි
  • දෙකක් කාල වර්ග ඇත: BEFORE / AFTER, සහ භාවිතය කාලය අනුව වෙනස් වේ
  • පේළි-මට්ටමේ ට්‍රිගර් (FOR EACH ROW) පමණක් සහය දක්වයි
  • ගබඩා කළ ක්‍රම වලට වඩා, ට්‍රිගර් ස්වයංක්‍රීයව ක්‍රියා කරයි

3. ට්‍රිගර් නිර්මාණය කිරීම

ට්‍රිගර් නිර්මාණය සඳහා පෙරඅවශ්‍යතා

MySQL හි ට්‍රිගර් නිර්මාණය කිරීමට පෙර, පහත කරුණු තහවුරු කළ යුතුය.

1. අවසර පරීක්ෂා කරන්න

ට්‍රිගර් එකක් නිර්මාණය කිරීමට, ඔබට MySQL SUPER අවසරය හෝ TRIGGER අවසරය අවශ්‍ය වේ.
අවශ්‍ය අවසර නොමැති නම්, පහත විධාන භාවිතා කර ඒවා ලබා දෙන්න (පරිපාලක අවසර අවශ්‍ය වේ).

GRANT SUPER, TRIGGER ON *.* TO 'username'@'host';
FLUSH PRIVILEGES;

සටහන: බෙදාගත් හෝ කුලී සේවාදායකවල, SUPER අවසරය සීමා කර තිබිය හැක.

2. වගුව පවතින බවට වග බලා ගන්න

ඔබට පවතින වගු වලට පමණක් ට්‍රිගර් නිර්මාණය කළ හැක.
ඉලක්ක වගුව නොපවතිනවා නම්, පෙරම එය සාදන්න.

3. MySQL අනුවාදය

ට්‍රිගර් MySQL 5.0.2 සහ ඉදිරියට ලබා ගත හැක.
ඔබේ අනුවාදය පරීක්ෂා කිරීමට, පහත SQL ක්‍රියාත්මක කරන්න.

SELECT VERSION();

මූලික CREATE TRIGGER ව්‍යවස්ථාව

MySQL හි ට්‍රිගර් නිර්මාණය කිරීමට, CREATE TRIGGER ප්‍රකාශනය භාවිතා කරන්න.

ව්‍යවස්ථාව

CREATE TRIGGER トリガー名
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON テーブル名
FOR EACH ROW
BEGIN
  -- 実行する処理(SQL)
END;
  • {BEFORE | AFTER} → ට්‍රිගර් කාලය
  • {INSERT | UPDATE | DELETE} → කුමන සිදුවීම ට්‍රිගර් කරයි
  • ON テーブル名 → ට්‍රිගර් යෙදෙන වගුව
  • FOR EACH ROWපේළි-මට්ටමේ ට්‍රිගර් (MySQL හි අවශ්‍ය)

ප්‍රායෝගික උදාහරණ

1. BEFORE INSERT ට්‍රිගර් (අවලංගු දත්ත වැලැක්වීම)

CREATE TRIGGER prevent_negative_salary
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
  IF NEW.salary < 0 THEN
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = 'Salary cannot be a negative value';
  END IF;
END;

මෙම ට්‍රිගර් කරන දේ

  • salary තීරුවට ඍණ අගයක් ඇතුළත් කරන්නේ නම්, දෝෂයක් උත්පාදනය කර ඇතුළත් කිරීම අවහිර කරයි.

2. AFTER INSERT ට්‍රිගර් (ස්වයංක්‍රීය ලොග් කිරීම)

CREATE TRIGGER log_new_user
AFTER INSERT ON users
FOR EACH ROW
BEGIN
  INSERT INTO user_logs (user_id, action, timestamp)
  VALUES (NEW.id, 'Registered', NOW());
END;

මෙම ට්‍රිගර් කරන දේ

  • users වගුවට නව පරිශීලකයෙක් එක් කරන විට, user_logs වගුවේ ලියාපදිංචි ලොග් එකක් සටහන් කරයි.

3. AFTER UPDATE ට්‍රිගර් (වෙනස්කම් ඉතිහාසය සුරකින්න)

CREATE TRIGGER track_salary_changes
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
  INSERT INTO salary_history (employee_id, old_salary, new_salary, changed_at)
  VALUES (OLD.id, OLD.salary, NEW.salary, NOW());
END;

මෙම ට්‍රිගර් කරන දේ

  • employees වගුවේ salary වෙනස් වන විට, එය පරණ සහ නව අගයන් දෙකම ඉතිහාස වගුවක සුරකිනු ඇත.

ට්‍රිගර් කළමනාකරණය

දත්ත ගබඩාවක ට්‍රිගර් ලැයිස්තුව

SHOW TRIGGERS FROM database_name;
  • database_name වෙනුවට ඉලක්ක දත්ත ගබඩාවේ නාමය යොදන්න.

නියමිත වගුවකට සම්බන්ධ ට්‍රිගර් සොයා ගැනීම

SELECT * FROM information_schema.TRIGGERS
WHERE EVENT_OBJECT_TABLE = 'employees';

ට්‍රිගර් ඉවත් කිරීම

ට්‍රිගර් ඉවත් කිරීමේ ක්‍රමය

DROP TRIGGER IF EXISTS trigger_name;

උදාහරණයක් ලෙස, log_new_user ට්‍රිගර් එක ඉවත් කිරීමට:

DROP TRIGGER IF EXISTS log_new_user;

සාරාංශය

  • ට්‍රිගර් සෑදීමට, ඔබට SUPER අවසරය හෝ TRIGGER අවසරය අවශ්‍ය වේ
  • විශේෂ දත්ත මෙහෙයුම් වල ස්වයංක්‍රීයව ක්‍රියාත්මක කිරීමට CREATE TRIGGER භාවිතා කරන්න
  • BEFORE ට්‍රිගර්ස් වලින් සත්‍යාපනය සහ වෙනස්කම් අවහිර කිරීම සඳහා භාවිතා වේ
  • AFTER ට්‍රිගර්ස් ලොග් කිරීම සහ වෙනස්කම් ඉතිහාසය සුරකිීමට ප්‍රයෝජනවත් වේ
  • ඔබට SHOW TRIGGERS සහ DROP TRIGGER භාවිතා කර ට්‍රිගර් කළමනාකරණය කළ හැක

4. MySQL ට්‍රිගර් භාවිතා කේස්

MySQL ට්‍රිගර්ස් ස්වයංක්‍රීය දත්ත සැකසීම ක්‍රියාත්මක කිරීමට ඉතා ප්‍රයෝජනවත් වේ. මෙහි, ප්‍රායෝගික භාවිතා කේස් හඳුන්වා දෙමින්, ඒවා සැබෑ පද්ධති සංවර්ධනය සහ දත්ත කළමනාකරණයට උපකාරී වේ.

1. ස්වයංක්‍රීය දත්ත සමමුහුර්තය (උපස්ථ)

දත්ත අඛණ්ඩතාව රැක ගැනීමට, ඔබට එක් වගුවකින් අනෙක් වගුවකට වෙනස්කම් ස්වයංක්‍රීයව සමමුහුර්ත කළ හැක. උදාහරණයක් ලෙස, නව පේළියක් orders වගුවට ඇතුළත් වන විට order_backup වෙත ඇතුළත් කිරීමෙන් නව ඇණවුම් උපස්ථ කරගැනීමට ට්‍රිගර් එකක් සෑදිය හැක.

✅ උදාහරණය: AFTER INSERT සමඟ දත්ත උපස්ථ කිරීම

CREATE TRIGGER sync_orders
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
  INSERT INTO order_backup (order_id, user_id, total_price, created_at)
  VALUES (NEW.id, NEW.user_id, NEW.total, NOW());
END;

මෙම ට්‍රිගර් කරන දේ

  • නව ඇණවුමක් orders වගුවට එක් කරන විට, එය ස්වයංක්‍රීයව දත්ත order_backup වෙත සුරකිනු ඇත .

2. ස්වයංක්‍රීය සත්‍යාපනය (අවලංගු දත්ත අවහිර කිරීම)

දත්ත සමගාමීතාව රැක ගැනීමට, ඔබට ට්‍රිගර්ස් භාවිතා කර අවලංගු අගයන් ඇතුළත් වීම වැළැක්විය හැක. උදාහරණයක් ලෙස, inventory වගුවේ තොගය කිසිවිටෙකත් ඍණ වීමට ඉඩ නොදෙන්න.

✅ උදාහරණය: BEFORE INSERT සමඟ අවලංගු දත්ත අවහිර කිරීම

CREATE TRIGGER prevent_negative_stock
BEFORE INSERT ON inventory
FOR EACH ROW
BEGIN
  IF NEW.stock < 0 THEN
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = 'Stock cannot be negative. Please enter a valid value.';
  END IF;
END;

මෙම ට්‍රිගර් කරන දේ

  • inventory වගුවට ඍණ අගයක් ඇතුළත් කරන්නේ නම්, එය දෝෂයක් උත්පාදනය කර ඇතුළත් කිරීම අවහිර කරයි.

3. පරිශීලක ක්‍රියාකාරකම් ලොග් කිරීම

ට්‍රිගර්ස් භාවිතා කර, ඔබට පරිශීලක ක්‍රියාකාරකම් ස්වයංක්‍රීයව ලියාගත හැක. උදාහරණයක් ලෙස, නව පරිශීලකයෙක් ලියාපදිංචි වන විට එය ලොග් කළ හැක.

✅ උදාහරණය: AFTER INSERT සමඟ ස්වයංක්‍රීය ලොග් කිරීම

CREATE TRIGGER log_user_activity
AFTER INSERT ON users
FOR EACH ROW
BEGIN
  INSERT INTO user_logs (user_id, action, timestamp)
  VALUES (NEW.id, 'Registered', NOW());
END;

මෙම ට්‍රිගර් කරන දේ

  • නව පරිශීලකයෙක් users වගුවට එක් කරන විට, එය ලොග් වගුවට රෙකෝඩ් එකක් ලියයි .

4. දත්ත වෙනස්කම් පිළිබඳ දැනුම්දීම් (ඊමේල් ඇලර්ට් / වෙබ්හුක්ස්)

MySQL එකක් පමණක් සෘජුවම ඊමේල් දැනුම්දීම් යැවීමට නොහැක, නමුත් ඔබට ට්‍රිගර්ස් භාවිතා කර දත්ත වෙනස්කම් හඳුනාගෙන, දැනුම්දීම් ක්‍රියාත්මක කිරීම සඳහා සුරැකුම් ක්‍රියාවලියක් ක්‍රියාත්මක කළ හැක.

✅ උදාහරණය: AFTER UPDATE සමඟ සුරැකුම් ක්‍රියාවලියක් කැඳවීම

CREATE TRIGGER notify_stock_update
AFTER UPDATE ON inventory
FOR EACH ROW
BEGIN
  CALL send_stock_alert(NEW.product_id, NEW.stock);
END;

මෙම ට්‍රිගර් කරන දේ

  • inventory හි stock යාවත්කාලීන කරන විට, එය send_stock_alert සුරැකුම් ක්‍රියාවලිය කැඳවයි.

5. වගු අතර දත්ත ඒකාබද්ධ කිරීම

ඔබට ට්‍රිගර්ස් භාවිතා කර දත්ත බහු වගු අතර ස්වයංක්‍රීයව ඒකාබද්ධ කළ හැක.

✅ උදාහරණය: AFTER UPDATE සමඟ වැටුප් ඉතිහාසය සුරැකීම

CREATE TRIGGER track_salary_changes
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
  INSERT INTO salary_history (employee_id, old_salary, new_salary, changed_at)
  VALUES (OLD.id, OLD.salary, NEW.salary, NOW());
END;

මෙම ට්‍රිගර් කරන දේ

  • employees වගුවේ salary යාවත්කාලීන කරන විට, එය පෙර සහ නව වැටුප salary_history හි ලියාගනී .

සාරාංශය

  • ට්‍රිගර්ස් දත්ත සැකසීම ස්වයංක්‍රීය කිරීම සඳහා ඉතා සුදුසු වන අතර බැකප්, වලංගු කිරීම සහ ලොග් කිරීම සඳහා පුළුල් ලෙස භාවිතා කළ හැක.
  • AFTER ට්‍රිගර්ස් වෙනස්කම් ඉතිහාස ලොග් කිරීම සහ බාහිර පද්ධති සමඟ ඒකාබද්ධ කිරීම සක්‍රිය කරයි.
  • BEFORE ට්‍රිගර්ස් වලංගු නොවන දත්ත ඇතුළත් වීම වැළැක්වීමට උපකාරී වේ.
  • ට්‍රිගර්ස් සමඟ සුරැකුම් ක්‍රියාවලීන් (stored procedures) එකතු කිරීම වඩාත් උසස් සැකසීම සහ දැනුම්දීමේ විශේෂතා සක්‍රිය කරයි.

5. ට්‍රිගර්ස් භාවිතා කිරීමේ වැදගත් සටහන්

MySQL ට්‍රිගර්ස් දත්ත අඛණ්ඩතාව රැක ගැනීමට සහ සැකසීම ස්වයංක්‍රීය කිරීමට ඉතා පහසු වේ,
නමුත් ඔවුන් නිසි ලෙස සැලසුම් කර කළමනාකරණය නොකළහොත්, කාර්ය සාධන අඩු වීම සහ දෝෂ නිරාකරණය කටුක වීම සිදුවිය හැක.
මෙහිදී, ට්‍රිගර්ස් භාවිතා කිරීමේ වැදගත් සැලකිලි පැහැදිලි කරමු.

1. කාර්ය සාධන බලපෑම

ට්‍රිගර්ස් සෑම දත්ත ගබඩා මෙහෙයුමකටම ස්වයංක්‍රීයව ක්‍රියා කරන බැවින්, නරක සැලසුම කාර්ය සාධන අඩු වීම වෙත හේතු විය හැක.

✅ සම්භාව්‍ය ගැටළු

  • ට්‍රිගර්ස් බොහොමයක් තිබීම දත්ත මෙහෙයුම් මන්දගාමී කරයි
  • නැස්තූ ට්‍රිගර්ස් (එක් ට්‍රිගර් එකක් තවත් ට්‍රිගර් එකක් සක්‍රිය කරන) අනපේක්ෂිත පූර්ණභාරයක් නිර්මාණය කරයි
  • විශාල පරිමාණ දත්ත යාවත්කාලීන කරන විට, ට්‍රිගර්ස් නැවත නැවත ක්‍රියා කරලා ප්‍රතිලාභය වැඩි කරයි

✅ නිරාකරණය

  • අවශ්‍ය නොවන ට්‍රිගර්ස් නිර්මාණය නොකරන්න
  • තර්කය සරලව තබන්න (සංකීර්ණ තර්කය සුරැකුම් ක්‍රියාවලීන් තුළ කළමනාකරණය කරන්න)
  • උපයෝගීතා වැඩිදියුණු කිරීම සඳහා ඉන්ඩෙක්ස් භාවිතා කරන්න

2. ඩෙඩ්ලොක් අවදානම

ට්‍රිගර්ස් භාවිතා කිරීම ඩෙඩ්ලොක් (බහු ගනුදෙනු ලොක් අල්ලා එකිනෙකට බාධා කරන) සිදු කරයි, එය සැකසීම නවත්වයි.

✅ උදාහරණය: ට්‍රිගර් එකක් නිසා ඇති වූ ඩෙඩ්ලොක්

CREATE TRIGGER update_stock
AFTER UPDATE ON orders
FOR EACH ROW
BEGIN
  UPDATE inventory SET stock = stock - NEW.quantity WHERE product_id = NEW.product_id;
END;

මෙම ට්‍රිගර් ක්‍රියා කරන විට, orders සහ inventory යාවත්කාලීන කිරීම් එකිනෙකට ගැලපී ඩෙඩ්ලොක් එකක් ඇති විය හැක.

✅ නිරාකරණය

  • BEFORE ට්‍රිගර්ස් භාවිතා කර වෙනස්කම් සුදුසු කරගන්න (AFTER ට්‍රිගර්ස් වඩා ලොක් බලපෑම අඩු වේ)
  • ට්‍රිගර්ස් තුළ ප්‍රශ්න කෙටි කර සංකීර්ණ සැකසීම සුරැකුම් ක්‍රියාවලීන් වෙත ගෙන යන්න
  • ගනුදෙනු අනුපිළිවෙල සම්මත කර ලොක් ගැලපීම් වැළැක්වන්න
  • යාවත්කාලීන කරන පේළි ගණන ඉතා අඩු කර හැකි තරම් අඩු කරන්න

3. ට්‍රිගර් සීමා සහ සීමාබද්ධතා

MySQL ට්‍රිගර්ස් බොහෝ සීමා සහ සීමාබද්ධතා ඇත.

✅ ගනුදෙනු පාලනය නොමැත (COMMIT / ROLLBACK)

  • ඔබට ට්‍රිගර් තුළ COMMIT හෝ ROLLBACK භාවිතා කළ නොහැක → ට්‍රිගර් එකේ දෝෂයක් සිදු වූ විට, සම්පූර්ණ මෙහෙයුම (ට්‍රිගර් ඇතුළත්) පසුපසට ආපසු යයි.

✅ එකම වගුවේ එකම වර්ගයේ බහු ට්‍රිගර්ස් නිර්මාණය කළ නොහැක

  • MySQL හි, එකම සිදුවීම සහ කාලය (උදා: AFTER INSERT) සමඟ බහු ට්‍රිගර්ස් එකම වගුවේ නිර්වචනය කළ නොහැක → උදාහරණයක් ලෙස, එකම වගුවේ දෙක AFTER INSERT ට්‍රිගර්ස් නිර්මාණය කිරීම දෝෂයක් වේ.

🚨 නිරාකරණය:

  • තර්කය එකම ට්‍රිගර් එකට එකතු කර, ශාඛා තර්කය ක්‍රියාත්මක කරන්න

4. ට්‍රිගර්ස් නිරාකරණය කිරීම අමාරුයි

ට්‍රිගර්ස් පසුබැසීමේ (background) ක්‍රියා කරන බැවින්, දෝෂ පණිවුඩ පැහැදිලි නොවීම සිදුවේ.

✅ නිරාකරණ ක්‍රමය

  1. ට්‍රිගර් ක්‍රියාත්මක ඉතිහාසය සුරැකීමට ලොග් වගුවක් සාදන්න
    CREATE TABLE trigger_logs (
      id INT AUTO_INCREMENT PRIMARY KEY,
      event_type VARCHAR(50),
      message TEXT,
      created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
    
  1. ට්‍රිගර් තුළ INSERT භාවිතා කර ප්‍රවාහය ලියාගන්න
    CREATE TRIGGER debug_trigger
    AFTER INSERT ON users
    FOR EACH ROW
    BEGIN
      INSERT INTO trigger_logs (event_type, message)
      VALUES ('INSERT', CONCAT('New user added: ', NEW.username));
    END;
    

මෙම ක්‍රමය භාවිතා කර ඔබට ට්‍රිගර් ප්‍රතිඵල තහවුරු කළ හැක
SELECT * FROM trigger_logs; ක්‍රියාත්මක කර ලොග් පරීක්ෂා කරන්න.

5. ඔබට ට්‍රිගර්ස් භාවිතා කළ යුතු අවස්ථා සහ නොකළ යුතු අවස්ථා

ට්‍රිගර්ස් ප්‍රයෝජනවත්, නමුත් ඔවුන් සෑම අවස්ථාවකම භාවිතා නොකළ යුතුය.

✅ ඔබට ට්‍රිගර්ස් භාවිතා කළ යුතු අවස්ථා

  • දත්ත අඛණ්ඩතාවය තහවුරු කිරීම සඳහා සැකසීම
  • වෙනස්කම් ඉතිහාසය සහ ලොග් ස්වයංක්‍රීයව රෙකෝඩ් කිරීම
  • දත්ත වලංගු කිරීම (වලංගු නොවන දත්ත වැළැක්වීම)

🚫 ඔබට ට්‍රිගර්ස් භාවිතා නොකළ යුතු අවස්ථා

  • සංකීර්ණ ගණනයන් හෝ තර්ක අවශ්‍ය වන විට (සාමාන්‍යයෙන් සුරැකුම් ක්‍රම (stored procedures) වඩා හොඳයි)
  • ට්‍රිගර්ස් බොහෝ වගු යාවත්කාලීන කරන විට (කාර්ය සාධන අඩු වීමේ අවදානම)
  • ගනුදෙනු පාලනය අවශ්‍ය වන විට (ට්‍රිගර්ස් තුළ COMMIT / ROLLBACK භාවිතා කළ නොහැක)

Summary

  • අනිසි ලෙස භාවිතා කරන විට, ට්‍රිගර්ස් කාර්ය සාධනය අඩු කරයි
  • ඩෙඩ්ලොක්ස් (deadlocks) වැළැක්වීමට, BEFORE ට්‍රිගර්ස් භාවිතා කිරීම සහ ගනුදෙනු සැලසුම් සැලකිල්ලෙන් පරික්ෂා කිරීම සලකා බලන්න
  • MySQL සීමා (ගනුදෙනු පාලනය නොමැති, එකම වර්ගයේ බහු ට්‍රිගර්ස් නොමැති) තේරුම් ගන්න
  • ඩිබග් කිරීම අභියෝගාත්මක වන බැවින්, ක්‍රියාත්මක ප්‍රවාහය ලියා ගැනීමට ලොග් වගු භාවිතා කරන්න
  • ට්‍රිගර්ස් සුදුසු වන ස්ථානය තෝරා ගැනීමට අවධානයෙන් සිටින්න

6. FAQ

MySQL ට්‍රිගර්ස් පිළිබඳ නිතර අසන ප්‍රශ්න මෙහි ඇත. මූලික භාවිතයෙන් පරීක්ෂා කිරීම දක්වා ප්‍රායෝගික තොරතුරු අපි ආවරණය කරමු.

Q1. ට්‍රිගර්ස් සහ සුරැකුම් ක්‍රම (stored procedures) අතර වෙනස කුමක්ද?

A.

ItemTriggerStored Procedure
How it runsRuns automatically (on data changes)Runs manually (CALL procedure_name)
Primary useAutomatic processing on data changesAutomating repeated SQL operations
Return valueNoneHas return value(s)
Transaction controlNot possiblePossible

තෝරා ගැනීමේ ක්‍රම

  • ඩේටා වෙනස් වන විට සැමවිටම ක්‍රියාත්මක විය යුතු “සංස්කරණ” සඳහා ට්‍රිගර්ස් හොඳම වේ
  • උදාහරණ: ලොග් කිරීම, දත්ත අඛණ්ඩතාවය සහතික කිරීම, වෙනස්කම් ඉතිහාසය සුරැකීම
  • ඔබට අතින් ක්‍රියාත්මක කිරීමට අවශ්‍ය “ක්‍රියා” සඳහා සුරැකුම් ක්‍රම (stored procedures) හොඳම වේ
  • උදාහරණ: බැච් ප්‍රොසෙසින්, එකතු කිරීම, විශාල පරිමාණ යාවත්කාලීන

Q2. MySQL හි එක් වගුවකට බහු ට්‍රිගර්ස් සකස් කළ හැදියිද?

A. ඔව්, නමුත් සීමා ඇත.

සීමාව:

  • ඔබට එකම වගුවේ එකම සිදුවීම සහ කාලය (උදා: AFTER INSERT) සමඟ බහු ට්‍රිගර්ස් සෑදිය නොහැක
  • උදාහරණයක් ලෙස, users වගුවේ පහත දෙකේ AFTER INSERT ට්‍රිගර්ස් සකස් කිරීමට උත්සාහ කිරීමේදී දෝෂයක් සිදුවේ.
    CREATE TRIGGER trigger1 AFTER INSERT ON users FOR EACH ROW BEGIN ... END;
    CREATE TRIGGER trigger2 AFTER INSERT ON users FOR EACH ROW BEGIN ... END;
    
  • MySQL එක් වගුවකට එක AFTER INSERT ට්‍රිගර් එකක් පමණක් ඉඩ දෙයි.

විසඳුම:

  • තර්කය එක ට්‍රිගර් එකකට එකතු කර, කොන්දේසිමය ශාඛා (IF) භාවිතයෙන් බහු ක්‍රියාකාරකම් ක්‍රියාත්මක කරන්න
    CREATE TRIGGER manage_user_insert
    AFTER INSERT ON users
    FOR EACH ROW
    BEGIN
      -- Write a log
      INSERT INTO user_logs (user_id, action, timestamp)
      VALUES (NEW.id, 'Registered', NOW());
    
      -- Grant a first-login bonus
      IF NEW.is_new = 1 THEN
        INSERT INTO bonuses (user_id, amount) VALUES (NEW.id, 1000);
      END IF;
    END;
    

Q3. MySQL ට්‍රිගර්ස් ඩිබග් කරන්නේ කෙසේද?

A. ට්‍රිගර්ස් ඩිබග් කිරීම අමාරුයි, සාමාන්‍ය SQL වගේ SELECT මගින් ප්‍රතිඵල පරීක්ෂා කළ නොහැකි නිසා. සාමාන්‍ය ක්‍රමයක් ලෙස ලොග් වගුවක් භාවිතා කිරීම වේ.

ඩිබග් කිරීම සඳහා ලොග් වගුවක් සාදන්න

CREATE TABLE trigger_logs (
  id INT AUTO_INCREMENT PRIMARY KEY,
  message TEXT,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

ට්‍රිගර් තුළ INSERT භාවිතයෙන් ලොග් සටහන් කරන්න

CREATE TRIGGER debug_trigger
AFTER INSERT ON users
FOR EACH ROW
BEGIN
  INSERT INTO trigger_logs (message)
  VALUES (CONCAT('New user added: ', NEW.username));
END;

ලොග් පරීක්ෂා කරන්න

SELECT * FROM trigger_logs;

📌 මෙය ඔබට ට්‍රිගර් සාර්ථකව ක්‍රියාත්මක වූදැයි තහවුරු කිරීමට ඉඩ දෙයි.

Q4. ට්‍රිගර්ස් කාර්ය සාධනයට බලපාද?

A. ඔව්—විශාල දත්ත ගබඩා වලදී විශේෂයෙන් සැලකිල්ලෙන් විය යුතුය.

සාමාන්‍ය හේතු

  • නිතර ට්‍රිගර් ක්‍රියාත්මක වීම දත්ත මෙහෙයුම් (INSERT / UPDATE / DELETE) මන්දගාමී කරයි
  • ට්‍රිගර්ස් තුළ සංකීර්ණ තර්ක (වෙනත් වගු යාවත්කාලීන කිරීම, ගණනයන්, ආදිය) භාරය වැඩි කරයි
  • අන්‍ය ට්‍රිගර්ස් (Nested triggers) අනපේක්ෂිත ප්‍රමාදයන්ට හේතු විය හැක

කාර්ය සාධන වැඩිදියුණු කිරීමේ උපදෙස්

  1. අවශ්‍ය නොවන ට්‍රිගර්ස් සෑදීමෙන් වැළකී සිටින්න (හැකි නම් යෙදුමේදී මෙය කළ හැක)
  2. තර්කය සරලව තබා ගන්න (සංකීර්ණ ගණනයන්/ශාඛා සුරැකුම් ක්‍රම වෙත ගෙන යන්න)
  3. සුදුසු ඉන්ඩෙක්ස් භාවිතා කරන්න ට්‍රිගර්ස් තුළ ප්‍රශ්න වේගය වැඩි කිරීමට
  4. BEFORE ට්‍රිගර්ස් භාවිතා කරන්න පෙර පරීක්ෂා කිරීම සහ අයවැය අඩු කිරීම සඳහා

Summary

  • ට්‍රිගර්ස් ස්වයංක්‍රිය කිරීම සඳහා පහසුය, නමුත් ට්‍රිගර්ස් සහ සුරැකුම් ක්‍රම (හෝ දෘශ්‍ය) අතර තේරීම වැදගත් වේ
  • MySQL හි, එකම වර්ගයේ බහු ට්‍රිගර්ස් එකම වගුවකට සෑදිය නොහැක
  • ලොග් වගු භාවිතා කරන විට දෝෂ නිරාකරණය පහසු වේ
  • කාර්ය සාධන ගැටළු වලක්වා ගැනීමට, ට්‍රිගර්ස් සරලව තබන්න
  • ට්‍රිගර්ස් සෘජුවම වෙනස් කළ නොහැක; ඔබට ඒවා ඉවත් කර නැවත සෑදිය යුතුය

7. සාරාංශය

MySQL ට්‍රිගර්ස් දත්ත ගබඩා ස්වයංක්‍රිය කිරීම සක්‍රිය කරයි සහ දත්ත අඛණ්ඩතාව රැක ගැනීමට ශක්තිමත් මෙවලමකි.
මෙම ලිපියේ, අපි ට්‍රිගර් මූලිකතා, ට්‍රිගර්ස් සෑදීමේ ක්‍රම, භාවිතා නිරූපණ, වැදගත් සැලකිලි, සහ ප්‍රශ්න-පිළිතුරු (FAQ) ආවරණය කර ඇත.

පහත දැක්වෙන්නේ ප්‍රධාන කරුණු සාරාංශයයි.

1. MySQL ට්‍රිගර්ස් සමාලෝචනය

  • ට්‍රිගර් යනු කුමක්ද?
  • විශේෂ දත්ත මෙහෙයුම් (INSERT, UPDATE, DELETE) සිදු වන විට ස්වයංක්‍රියව SQL ක්‍රියාත්මක කරන යන්ත්‍රණයක්
  • ට්‍රිගර් භාවිතා නිරූපණ
  • දත්ත අඛණ්ඩතාව රැක ගැනීම, ලොග් කිරීම, දත්ත වෙනස්වීමේ ස්වයංක්‍රිය සැකසීම
  • ට්‍රිගර් වර්ග
  • BEFORE ට්‍රිගර්ස් (දත්ත වෙනස්වීමට පෙර ක්‍රියා කරයි)
  • AFTER ට්‍රිගර්ස් (දත්ත වෙනස්වීමෙන් පසු ක්‍රියා කරයි)

2. ට්‍රිගර්ස් සෑදීමේ ක්‍රම

  • CREATE TRIGGER භාවිතා කර ඉලක්ක වගුවේ දත්ත මෙහෙයුම් මත පදනම්ව ට්‍රිගර්ස් සකසන්න
  • උදාහරණය: AFTER INSERT සමඟ ලොග් කිරීම
    CREATE TRIGGER log_new_user
    AFTER INSERT ON users
    FOR EACH ROW
    BEGIN
      INSERT INTO user_logs (user_id, action, timestamp)
      VALUES (NEW.id, 'Registered', NOW());
    END;
    
  • SHOW TRIGGERS භාවිතා කර ට්‍රිගර්ස් පරීක්ෂා කරන්න සහ DROP TRIGGER භාවිතා කර ඒවා ඉවත් කරන්න

3. ට්‍රිගර් භාවිතා නිරූපණ

  • ස්වයංක්‍රිය දත්ත සමමුහුර්ත (උපස්ථ)
  • orders දත්ත ස්වයංක්‍රියව order_backup වෙත සුරකින්න
  • ස්වයංක්‍රිය වලංගු කිරීම
  • අනුකූල නොවන (ඍණ) අගයන් වැළැක්වීමට BEFORE INSERT භාවිතා කරන්න
  • ලොග් කිරීම
  • AFTER INSERT භාවිතා කර user_logs හි පරිශීලක ක්‍රියාකාරකම් ලියාගන්න
  • දැනුම්දීම / බාහිර පද්ධති ඒකාබද්ධ කිරීම
  • ඊමේල් ඇලට් සඳහා සුරැකුම් ක්‍රමයක් කැඳවීමට AFTER UPDATE භාවිතා කරන්න
  • වෙනස්කම් ඉතිහාසය සුරකින්න
  • පරණ/නව දත්ත salary_history වෙත ලියාගැනීමට AFTER UPDATE භාවිතා කරන්න

4. ට්‍රිගර්ස් භාවිතා කරන විට වැදගත් සටහන්

  • කාර්ය සාධන බලපෑම
  • බොහෝ ට්‍රිගර්ස් දත්ත මෙහෙයුම් මන්දගාමී කරයි
  • අන්‍යෝන්‍ය ට්‍රිගර්ස් සමඟ අවධානයෙන් සිටින්න
  • ඩෙඩ්ලොක් අවදානම
  • ලොක් ගැටළු වලක්වා ගැනීමට BEFORE ට්‍රිගර්ස් සහ සැලකිලිමත් ගනුදෙනු සැලසුම් භාවිතා කරන්න
  • ට්‍රිගර් සීමා
  • ගනුදෙනු පාලනය (COMMIT / ROLLBACK) නොමැත
  • එකම වර්ගයේ බහු ට්‍රිගර්ස් එකම වගුවකට නිර්වචනය කළ නොහැක
  • දෝෂ නිරාකරණය
  • ට්‍රිගර් ක්‍රියාත්මක ඉතිහාසය ලියාගැනීමට ලොග් වගු සෑදන්න
  • SHOW TRIGGERS සහ information_schema.TRIGGERS භාවිතා කර සැකසුම් පරීක්ෂා කරන්න

5. ප්‍රශ්න-පිළිතුරු

Q. MySQL හි සුරැකුම් ක්‍රම සහ ට්‍රිගර්ස් අතර වෙනස කුමක්ද?
ට්‍රිගර් දත්ත මෙහෙයුම් මත ස්වයංක්‍රියව ක්‍රියා කරයි, එතැන්දී සුරැකුම් ක්‍රම අතින් ක්‍රියාත්මක කරයි.

Q. ට්‍රිගර්ස් කාර්ය සාධනයට බලපානවාද?
ඔව්. වැඩි දියුණු කිරීම සඳහා: අනිවාර්ය නොවන ට්‍රිගර්ස් වලක්වා, තර්කය සරලව තබා, සහ ඉන්ඩෙක්ස් භාවිතා කරන්න.

Q. ඔබට ට්‍රිගර්ස් දෝෂ නිරාකරණය කෙසේ කරන්නේද?
➡ සාමාන්‍ය ක්‍රමයක් ලෙස ලොග් වගුවක් සෑදීම සහ INSERT මඟින් ට්‍රිගර් ක්‍රියාත්මක වීම ලියාගැනීම වේ.

INSERT INTO trigger_logs (message) VALUES ('Trigger executed');

Q. ඔබට ට්‍රිගර්ස් වෙනස් කළ හැදුවද?
➡ ඔබට ට්‍රිගර්ස් සෘජුවම වෙනස් කළ නොහැක. ඔබට DROP TRIGGER භාවිතා කර ට්‍රිගර් ඉවත් කර නැවත සෑදිය යුතුය.

සාරාංශය

✔ MySQL ට්‍රිගර්ස් වල ප්‍රතිලාභ

ස්වයංක්‍රියව දත්ත අඛණ්ඩතාව රැකගන්න
අතින් කරන වැඩ අඩු කර මෙහෙයුම් කාර්යක්ෂමතාව වැඩි කරන්න
වෙනස්කම් ඉතිහාස කළමනාකරණය පහසු කරයි
සුරැකුම් ක්‍රම සමඟ එකතු කිරීමෙන් වැඩි උසස් සැකසීම සක්‍රිය කරයි

❗ සටහන් සහ අවදානම්

බොහෝ ට්‍රිගර්ස් කාර්ය සාධනයට බලපායි
දෝෂ නිරාකරණය අධික වේ, එබැවින් ලොග් වගු උපකාරී වේ
ඩෙඩ්ලොක් සහ ලොක් ගැටළු වලක්වා ගැනීමට සැලකිලිමත් ලෙස සැලසුම් කරන්න

සුදුසු සැලසුම් සමඟ, MySQL ට්‍රිගර්ස් දත්ත කළමනාකරණය විශාල ලෙස වැඩිදියුණු කරයි.
මෙම මාර්ගෝපදේශය භාවිතා කර ප්‍රභාවී ට්‍රිගර්ස් සැලසුම් කර වැඩි කාර්යක්ෂම දත්ත ගබඩා මෙහෙයුමක් ලබා ගන්න!