Triggers হল PL/SQL কোডের ব্লক যা বিশেষ কিছু ইভেন্ট বা পরিবর্তনের জন্য স্বয়ংক্রিয়ভাবে রান হয়। সাধারণত, Triggers ডেটাবেসে ডেটা ম্যানিপুলেশন (INSERT, UPDATE, DELETE) ঘটানোর আগে বা পরে রান হয়, এবং এগুলি ব্যবহৃত হয় ডেটাবেসের স্বয়ংক্রিয় কাজ বা ব্যবহারকারীর ক্রিয়ার প্রভাব সঠিকভাবে পরিচালনা করতে।
BEFORE এবং AFTER triggers দুটি প্রধান ধরনের trigger, যা নির্দিষ্ট কাজ করার জন্য ব্যবহৃত হয়।
BEFORE Trigger
BEFORE Trigger হল একটি trigger যা কোনো ডেটাবেস অপারেশন (INSERT, UPDATE, DELETE) সম্পাদন হওয়ার আগে কার্যকর হয়। যখন আপনি একটি BEFORE trigger ব্যবহার করেন, তখন আপনি তথ্য আপডেট বা পরিবর্তন করার আগে কিছু নির্দিষ্ট কোড কার্যকর করতে পারেন।
এটি সাধারণত ডেটা ভ্যালিডেশন বা অপারেশন থেকে পূর্বের অবস্থা চেক করা এর জন্য ব্যবহৃত হয়।
BEFORE Trigger ব্যবহার করা হয় যখন:
- একটি INSERT বা UPDATE করার আগে ডেটা যাচাই করতে চান।
- একটি ডেটার উপর প্রক্রিয়া চালানোর আগে কিছু কাস্টম লজিক প্রয়োগ করতে চান।
- ডেটা ইনপুট বা আপডেট করার আগেই নিরাপত্তা যাচাই করতে চান।
সিনট্যাক্স:
CREATE OR REPLACE TRIGGER before_trigger_example
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
-- Code to be executed before insert
:NEW.hire_date := SYSDATE; -- Automatically set hire_date to current date
END;
উদাহরণ:
ধরা যাক, একটি employees টেবিল আছে, যেখানে আপনি চান, যখন কেউ নতুন কর্মচারী অ্যাড করবে, তখন তার hire_date স্বয়ংক্রিয়ভাবে বর্তমান তারিখে সেট হোক।
CREATE OR REPLACE TRIGGER before_insert_employee
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
:NEW.hire_date := SYSDATE;
END;
এখানে, BEFORE INSERT trigger employees টেবিলে নতুন রেকর্ড ইনসার্ট করার আগে hire_date কলামটি বর্তমান তারিখে সেট করবে।
AFTER Trigger
AFTER Trigger হল একটি trigger যা একটি ডেটাবেস অপারেশন (INSERT, UPDATE, DELETE) সম্পন্ন হওয়ার পরে কার্যকর হয়। এটি সাধারণত ডেটাবেস অপারেশন শেষে কিছু কর্মকাণ্ড সম্পাদন করার জন্য ব্যবহৃত হয়।
AFTER Trigger ব্যবহার করে আপনি ডেটা আপডেট হওয়ার পরে কোনও লগ তৈরি করতে পারেন, বা পরে অন্য একটি টেবিল আপডেট বা ইনসার্ট করতে পারেন।
AFTER Trigger ব্যবহার করা হয় যখন:
- INSERT, UPDATE, বা DELETE অপারেশন শেষ হওয়ার পরে কিছু পরিবর্তন বা অডিট করতে চান।
- ডেটা পরিবর্তনের পরে কিছু কাজ করতে চান যেমন লগ ইনসার্ট করা।
- ডেটাবেসে অটোমেটিক বা সিরিয়াল অপারেশন সম্পাদন করতে চান।
সিনট্যাক্স:
CREATE OR REPLACE TRIGGER after_trigger_example
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
-- Code to be executed after insert
INSERT INTO employee_audit_log (employee_id, action, action_date)
VALUES (:NEW.employee_id, 'INSERT', SYSDATE);
END;
উদাহরণ:
ধরা যাক, আপনি চান যে, যখনই কেউ employees টেবিলে একটি নতুন রেকর্ড ইনসার্ট করবে, তখন সেই পরিবর্তনের একটি লগ তৈরি হোক employee_audit_log টেবিলে।
CREATE OR REPLACE TRIGGER after_insert_employee
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
INSERT INTO employee_audit_log (employee_id, action, action_date)
VALUES (:NEW.employee_id, 'INSERT', SYSDATE);
END;
এখানে, AFTER INSERT trigger employees টেবিলে নতুন রেকর্ড ইনসার্ট করার পর employee_audit_log টেবিলে একটি লগ এন্ট্রি তৈরি করবে।
BEFORE এবং AFTER Triggers এর মধ্যে পার্থক্য:
| Feature | BEFORE Trigger | AFTER Trigger |
|---|---|---|
| Execution Timing | The trigger executes before the database operation. | The trigger executes after the database operation. |
| Use Case | Used for data validation, modifying input before it's saved. | Used for logging, auditing, or cascading operations after a change. |
| Common Operations | Validating data before INSERT or UPDATE. | Inserting logs or triggering subsequent actions after INSERT or DELETE. |
| Access to Data | Can modify data using :NEW values. | Can only use :NEW values after the change has been applied. |
| Example | Setting a default value before INSERT (e.g., hire_date). | Auditing changes after an INSERT operation. |
BEFORE এবং AFTER Triggers এর ব্যবহারিক উদাহরণ:
BEFORE Trigger Example:
- আপনি চাইলে BEFORE trigger ব্যবহার করে ইনপুট ডেটার মান যাচাই করতে পারেন, যেমন অ্যাকাউন্ট নম্বরের ধরন বা দামটির সীমা।
CREATE OR REPLACE TRIGGER before_update_price BEFORE UPDATE ON products FOR EACH ROW BEGIN IF :NEW.price < 0 THEN RAISE_APPLICATION_ERROR(-20001, 'Price cannot be negative'); END IF; END;AFTER Trigger Example:
- AFTER trigger ব্যবহার করে আপনি লগ ইনসার্ট করতে পারেন যা ইভেন্টের পরবর্তী কার্যক্রম হিসেবে কাজ করে।
CREATE OR REPLACE TRIGGER after_delete_employee AFTER DELETE ON employees FOR EACH ROW BEGIN INSERT INTO employee_audit_log (employee_id, action, action_date) VALUES (:OLD.employee_id, 'DELETE', SYSDATE); END;
এখানে, AFTER DELETE trigger যখনই একটি employee টেবিলের রেকর্ড মুছে ফেলা হবে, তখন সেই কর্মচারীর তথ্য employee_audit_log টেবিলে একটি লগ হিসেবে ইনসার্ট হবে।
উপসংহার:
BEFORE এবং AFTER triggers বিভিন্ন পরিস্থিতিতে ডেটাবেসে বিভিন্ন ধরনের কাজ করার জন্য ব্যবহৃত হয়। BEFORE triggers সাধারণত ডেটা ম্যানিপুলেশন বা ইনপুট যাচাই করার জন্য, এবং AFTER triggers সাধারণত লগিং, অডিটিং, এবং পরবর্তী অ্যাকশন নেওয়ার জন্য ব্যবহৃত হয়।
Read more