Triggers হল ডেটাবেসের অবজেক্ট যা স্বয়ংক্রিয়ভাবে কার্যকর হয় যখন কোনো নির্দিষ্ট ইভেন্ট ঘটে। এটি SQL Server এবং অন্যান্য রিলেশনাল ডেটাবেস ম্যানেজমেন্ট সিস্টেম (RDBMS) এ ব্যবহৃত হয়। Triggers প্রধানত ডেটাবেসের মধ্যে একটি নির্দিষ্ট পরিবর্তন ঘটলে কিছু অটোমেটিক অ্যাকশন সম্পাদন করার জন্য ব্যবহৃত হয়, যেমন ডেটা ইনসার্ট, আপডেট, বা ডিলিট করা।
Trigger এর প্রকারভেদ
- DML Triggers (Data Manipulation Language Triggers):
- AFTER Trigger: ডেটাবেসে কোনো পরিবর্তন করার পর চালিত হয়।
- INSTEAD OF Trigger: ডেটাবেসে পরিবর্তন করার আগে চালিত হয় এবং পরিবর্তনটি প্রতিস্থাপন করে।
- BEFORE Trigger: SQL Server তে এই ধরনের Trigger নেই, তবে অন্যান্য ডেটাবেস সিস্টেমে এটি ব্যবহৃত হয় (যেমন PostgreSQL বা MySQL)।
- DDL Triggers (Data Definition Language Triggers):
- এটি ডেটাবেসের কাঠামোর (Schema) পরিবর্তন যেমন টেবিল তৈরি, পরিবর্তন বা মুছে ফেলা হলে চালিত হয়।
- LOGON এবং LOGOFF Triggers:
- যখন ইউজার ডেটাবেসে লগইন বা লগআউট করে, তখন এই ধরনের triggers চালিত হয়।
- CLR Triggers:
- এটি .NET ভাষার CLR (Common Language Runtime) কোড ব্যবহার করে তৈরি করা হয় এবং ডেটাবেসে নির্দিষ্ট শর্তে কার্যকর হয়।
Trigger এর সিনট্যাক্স
একটি Trigger তৈরি করার জন্য সাধারণ সিনট্যাক্স:
CREATE TRIGGER trigger_name
ON table_name
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
-- Trigger action
END;
এখানে:
- trigger_name: ট্রিগারের নাম।
- table_name: সেই টেবিলের নাম যেখানে Triggerটি প্রয়োগ হবে।
- AFTER/INSTEAD OF: Triggerটি কোন ইভেন্ট (INSERT, UPDATE, DELETE) এর পরে বা আগে কার্যকর হবে তা নির্দেশ করে।
Trigger এর উদাহরণ
১. AFTER Trigger (DML Trigger)
এই Triggerটি একটি ডেটাবেস অপারেশন (যেমন INSERT, UPDATE, বা DELETE) করার পর চালিত হয়।
উদাহরণ ১: AFTER INSERT Trigger
ধরা যাক, Employees টেবিলের জন্য একটি AFTER INSERT Trigger তৈরি করতে চান, যা প্রতিবার একটি নতুন কর্মচারী ইনসার্ট হলে একটি লগ টেবিল (যেমন Employee_Log) এ একটি রেকর্ড যোগ করবে।
CREATE TRIGGER trg_AfterEmployeeInsert
ON Employees
AFTER INSERT
AS
BEGIN
INSERT INTO Employee_Log (EmployeeID, Action)
SELECT EmployeeID, 'Inserted' FROM INSERTED;
END;
এখানে:
INSERTEDএকটি বিশেষ টেবিল যা ডেটাবেসে ইনসার্ট হওয়া নতুন রেকর্ডগুলো ধারণ করে।
২. INSTEAD OF Trigger
এটি যখন ব্যবহার করা হয়, তখন INSERT, UPDATE, বা DELETE অপারেশনের পরিবর্তে Triggerটি সেই অপারেশনটি নিজেই সম্পাদন করে।
উদাহরণ ২: INSTEAD OF INSERT Trigger
ধরা যাক, আপনি চান যে Employees টেবিলে যদি কোনো নতুন রেকর্ড ইনসার্ট করার চেষ্টা করা হয়, তবে তা Salary কলামের মান 0 হলে তা প্রতিস্থাপন করা হোক।
CREATE TRIGGER trg_InsteadOfInsert
ON Employees
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO Employees (EmployeeID, FirstName, LastName, Salary)
SELECT EmployeeID, FirstName, LastName,
CASE WHEN Salary = 0 THEN 1000 ELSE Salary END
FROM INSERTED;
END;
এখানে:
- Salary 0 হলে এটি 1000 দিয়ে প্রতিস্থাপিত হবে।
৩. BEFORE Trigger (তথ্য পরিবর্তনের আগে)
SQL Server তে BEFORE Trigger নেই, তবে কিছু অন্যান্য ডেটাবেস সিস্টেমে (যেমন PostgreSQL বা MySQL) এটি ব্যবহৃত হয়।
৪. DDL Trigger
DDL Trigger ডেটাবেসের কাঠামোতে পরিবর্তন ঘটলে (যেমন টেবিল তৈরি বা মুছে ফেলা) কার্যকর হয়। এই ধরনের Trigger সাধারণত CREATE, ALTER, বা DROP ইভেন্টে কাজ করে।
উদাহরণ ৩: DDL Trigger
CREATE TRIGGER trg_DDLExample
ON DATABASE
FOR CREATE_TABLE
AS
BEGIN
PRINT 'A new table has been created!';
END;
এটি CREATE_TABLE ইভেন্টে কাজ করবে এবং একটি নতুন টেবিল তৈরি হলে একটি বার্তা প্রিন্ট করবে।
Trigger এর ব্যবহার
- ডেটাবেস অডিটিং: ডেটাবেসে পরিবর্তন (INSERT, UPDATE, DELETE) ট্র্যাক করার জন্য Trigger ব্যবহার করা যায়। এটি ডেটাবেসের ইতিহাস সংরক্ষণে সাহায্য করে।
- স্বয়ংক্রিয় কাজ করা: কিছু স্বয়ংক্রিয় কাজ যেমন লগিং, অ্যালার্ম, বা ডেটাবেস ইন্টিগ্রিটি নিশ্চিত করা Trigger এর মাধ্যমে করা যেতে পারে।
- ডেটাবেস ইন্টিগ্রিটি বজায় রাখা: Trigger ব্যবহার করে ডেটাবেসের ইন্টিগ্রিটি রক্ষা করা যায়, যেমন কোনো কলামের মান শর্তানুযায়ী সঠিক থাকলেই পরিবর্তন করা।
- ডেটা ভ্যালিডেশন: ডেটাবেসে কিছু ভ্যালিডেশন প্রয়োগ করতে Trigger ব্যবহার করা যেতে পারে, যেমন সঠিক তথ্য ইনসার্ট করা হচ্ছে কিনা তা চেক করা।
Trigger এর সুবিধা এবং অসুবিধা
সুবিধা:
- স্বয়ংক্রিয় প্রক্রিয়া: ডেটাবেসের মধ্যে নির্দিষ্ট কাজ বা অপারেশন স্বয়ংক্রিয়ভাবে করা যায়।
- ডেটাবেস ইন্টিগ্রিটি রক্ষা: ডেটাবেসের ভ্যালিডেশন এবং ইন্টিগ্রিটি নিশ্চিত করতে সাহায্য করে।
- ডেটাবেস ট্র্যাকিং: ডেটাবেসে কী পরিবর্তন হচ্ছে তা ট্র্যাক করা সহজ হয়।
অসুবিধা:
- পারফরম্যান্স প্রভাব: একাধিক Trigger ব্যবহারের ফলে ডেটাবেসের কর্মক্ষমতা কমতে পারে, কারণ তারা প্রতি SQL অপারেশনের সাথে কার্যকর হয়।
- কমপ্লেক্স কোড: Trigger গুলি কোডের মধ্যে অদৃশ্যভাবে কার্যকর হওয়ায় মাঝে মাঝে কোডের অবস্থা বুঝতে সমস্যা হতে পারে।
- ডেডলক: মাঝে মাঝে Trigger এর মাধ্যমে একাধিক অপারেশন সম্পাদিত হলে ডেডলক সৃষ্টি হতে পারে।
সারাংশ
Triggers হল ডেটাবেসের একটি শক্তিশালী ফিচার যা ডেটাবেসের উপর নির্দিষ্ট ইভেন্টে স্বয়ংক্রিয়ভাবে কাজ চালাতে সাহায্য করে। এগুলি INSERT, UPDATE, DELETE, এবং DDL অপারেশনগুলির সাথে সংযুক্ত করা যায় এবং ডেটাবেসের অডিটিং, ইন্টিগ্রিটি রক্ষা এবং অন্যান্য কাজের জন্য ব্যবহৃত হয়। তবে, Trigger ব্যবহারের সময় পারফরম্যান্স এবং কমপ্লেক্সিটি সম্পর্কিত কিছু বিষয় বিবেচনা করা উচিত।
Triggers হল একটি ধরনের নির্ধারিত SQL কোড, যা নির্দিষ্ট ইভেন্ট বা অপারেশন ঘটলে স্বয়ংক্রিয়ভাবে কার্যকর হয়ে থাকে। এই ইভেন্টগুলি সাধারণত INSERT, UPDATE, DELETE অপারেশন হতে পারে, যা টেবিল বা ভিউতে ঘটলে ট্রিগারটি চালানো হয়। ট্রিগারগুলি ডেটাবেসের মধ্যে ঘটনার পরে স্বয়ংক্রিয়ভাবে কার্যকর হয় এবং সাধারণত ডেটা ইন্টিগ্রিটি, অ্যাক্সেস কন্ট্রোল, এবং অডিটিং নিশ্চিত করতে ব্যবহৃত হয়।
Triggers এর ধরন
- DML Triggers (Data Manipulation Language Triggers):
- INSERT: নতুন ডেটা ইনসার্ট করার পর ট্রিগার কার্যকর হয়।
- UPDATE: কোনো রেকর্ড আপডেট করার পর ট্রিগার কার্যকর হয়।
- DELETE: কোনো রেকর্ড মুছে ফেলার পর ট্রিগার কার্যকর হয়।
- INSTEAD OF Triggers:
- এটি DML অপারেশনগুলির জন্য ব্যবহৃত হয় যেখানে মূল অপারেশনটি (যেমন
INSERT,UPDATE,DELETE) প্রতিস্থাপন করা হয়। উদাহরণস্বরূপ,INSERTঅপারেশনটি করার পরিবর্তে কিছু নির্দিষ্ট অপারেশন করা হতে পারে।
- এটি DML অপারেশনগুলির জন্য ব্যবহৃত হয় যেখানে মূল অপারেশনটি (যেমন
- DCL Triggers (Data Control Language Triggers):
- GRANT, REVOKE অপারেশনগুলির জন্য ট্রিগারগুলি ব্যবহার করা যেতে পারে (কিছু RDBMS এ সীমিত থাকে)।
- DDL Triggers (Data Definition Language Triggers):
- ডেটাবেস স্কিমার পরিবর্তনের জন্য (যেমন টেবিল তৈরি বা মুছে ফেলা) ট্রিগার ব্যবহার করা হয়।
Triggers এর উদাহরণ
১. INSERT Trigger
এটি তখন ব্যবহৃত হয় যখন কোনো নতুন ডেটা একটি টেবিলে ইনসার্ট করা হয়।
CREATE TRIGGER trgAfterInsert
ON Employees
FOR INSERT
AS
BEGIN
PRINT 'New employee record inserted';
-- এখানে আপনার কাস্টম কোড বা লজিক যোগ করা যেতে পারে
END;
এখানে, যখন Employees টেবিলে কোনো নতুন রেকর্ড ইনসার্ট হবে, তখন trgAfterInsert ট্রিগারটি সক্রিয় হবে এবং একটি মেসেজ প্রদর্শিত হবে।
২. UPDATE Trigger
এটি ব্যবহৃত হয় যখন কোনো টেবিলে ডেটা আপডেট করা হয়।
CREATE TRIGGER trgAfterUpdate
ON Employees
FOR UPDATE
AS
BEGIN
PRINT 'Employee record updated';
-- অন্য কোনো কার্যকলাপ করতে পারেন
END;
এটি তখন কার্যকর হবে যখন Employees টেবিলের কোনো রেকর্ড আপডেট হবে এবং ট্রিগারটি কাজ শুরু করবে।
৩. DELETE Trigger
এটি ব্যবহৃত হয় যখন কোনো ডেটা ডিলিট করা হয়।
CREATE TRIGGER trgAfterDelete
ON Employees
FOR DELETE
AS
BEGIN
PRINT 'Employee record deleted';
-- ডিলিট হওয়ার পরে কিছু লজিক প্রক্রিয়া করা যেতে পারে
END;
যখন Employees টেবিল থেকে কোনো রেকর্ড ডিলিট হবে, তখন ট্রিগারটি স্বয়ংক্রিয়ভাবে কার্যকর হবে।
৪. INSTEAD OF Trigger
এটি ব্যবহৃত হয় যখন একটি ডিএমএল অপারেশন সম্পাদন করার পরিবর্তে কিছু নির্দিষ্ট কোড রান করতে হয়।
CREATE TRIGGER trgInsteadOfUpdate
ON Employees
INSTEAD OF UPDATE
AS
BEGIN
PRINT 'Update operation intercepted';
-- কিছু কোড লিখে আপডেট অপারেশন পরিবর্তন করা যেতে পারে
END;
এটি UPDATE অপারেশন পরিবর্তে কিছু নির্দিষ্ট কার্যকলাপ সম্পাদন করতে পারে।
Triggers এর ব্যবহার কেন প্রয়োজন?
- ডেটা ইন্টিগ্রিটি নিশ্চিতকরণ:
- ট্রিগার ব্যবহার করে ডেটাবেসের ডেটার সঠিকতা নিশ্চিত করা যায়। উদাহরণস্বরূপ, একটি
CHECKকন্ডিশন বা ডেটা ভ্যালিডেশন প্রয়োগ করতে।
- ট্রিগার ব্যবহার করে ডেটাবেসের ডেটার সঠিকতা নিশ্চিত করা যায়। উদাহরণস্বরূপ, একটি
- অডিটিং এবং লগিং:
- ট্রিগার ব্যবহার করে ডেটাবেসের পরিবর্তনগুলি ট্র্যাক করা যায়। যেগুলি ডেটাবেসের ইতিহাস সংরক্ষণ বা লগিং করতে সহায়ক।
- অটোমেটেড অ্যাকশন বা নোটিফিকেশন:
- একটি ট্রিগার ব্যবহার করে যদি কোনো ডেটা পরিবর্তন হয়, তবে স্বয়ংক্রিয়ভাবে অন্য কোনো টেবিল আপডেট করা যেতে পারে বা ইমেল পাঠানো যেতে পারে।
- অন্যান্য টেবিলের সাথে সিঙ্ক্রোনাইজেশন:
- ডেটার পরিবর্তন হলে তা অন্যান্য টেবিল বা সিস্টেমের সাথে সিঙ্ক্রোনাইজ করা যায়। উদাহরণস্বরূপ, যখন একটি টেবিলে ডেটা আপডেট হয়, তখন অন্য কোনো টেবিলেও সেই আপডেট করা হতে পারে।
- ব্যবহারকারী কনস্ট্রেইন্ট নিশ্চিতকরণ:
- যখন কিছু ডেটা পরিবর্তন বা মুছে ফেলা হয়, তখন আপনি ট্রিগার ব্যবহার করে কিছু অতিরিক্ত শর্ত বা নিয়ম প্রয়োগ করতে পারেন।
Triggers এর কিছু সীমাবদ্ধতা:
- Performance Issues:
- ট্রিগারগুলি অতিরিক্ত লোড তৈরি করতে পারে, বিশেষত যদি তারা অনেক বার কাজ করে বা জটিল কার্যকলাপ সম্পাদন করে। এটি সিস্টেমের পারফরম্যান্সকে প্রভাবিত করতে পারে।
- Debugging and Maintenance:
- টেবিলের পরিবর্তনগুলি যখন ট্রিগারের মাধ্যমে ঘটে, তখন এটি কিছুটা কম স্পষ্ট হতে পারে এবং কোড ডিবাগ করা কঠিন হতে পারে।
- Recursive Triggers:
- কিছু ডেটাবেসে Recursive Triggers সমস্যা সৃষ্টি করতে পারে, যেখানে এক ট্রিগার আরেকটি ট্রিগারকে সক্রিয় করে এবং এটি একটি লুপ তৈরি করতে পারে।
- Complexity in Managing:
- যদি একাধিক ট্রিগার একই টেবিলে একই ইভেন্টে যুক্ত থাকে, তবে তা পরিচালনা করা কঠিন হতে পারে এবং ইস্যু তৈরি করতে পারে।
সারাংশ
Triggers হল ডেটাবেসের একটি গুরুত্বপূর্ণ অংশ যা ডেটাবেসের মধ্যে নির্দিষ্ট ইভেন্ট বা অপারেশন ঘটলে স্বয়ংক্রিয়ভাবে কার্যকর হয়। এগুলি ডেটা ইন্টিগ্রিটি, অডিটিং, লগিং এবং স্বয়ংক্রিয় অ্যাকশন বাস্তবায়নের জন্য ব্যবহৃত হয়। তবে, এগুলি ব্যবহারের সময় পারফরম্যান্স এবং রক্ষণাবেক্ষণের বিষয়েও সতর্ক থাকতে হবে।
Triggers T-SQL (Transact-SQL)-এ একটি বিশেষ ধরনের অবজেক্ট যা ডেটাবেসে কোনো নির্দিষ্ট ঘটনার (insert, update, delete) পর স্বয়ংক্রিয়ভাবে কার্যকর হয়। এগুলি মূলত ডেটাবেসের স্বয়ংক্রিয়তা এবং ইন্টিগ্রিটি বজায় রাখতে ব্যবহৃত হয়।
AFTER Trigger এবং INSTEAD OF Trigger হল দুটি গুরুত্বপূর্ণ ধরনের Trigger, যা ডেটাবেস অপারেশন (যেমন INSERT, UPDATE, DELETE) সম্পাদনের পরে বা তার পরিবর্তে নির্দিষ্ট কার্যাবলী চালাতে ব্যবহৃত হয়।
1. AFTER Trigger
AFTER Trigger কোনো নির্দিষ্ট ডেটাবেস অপারেশন (insert, update, delete) সম্পাদিত হওয়ার পরে কার্যকর হয়। এটি সাধারণত ডেটাবেসের স্বয়ংক্রিয়তা বজায় রাখার জন্য ব্যবহৃত হয়, যেমন ডেটা লক করা, লগ ইনসার্ট করা বা সম্পর্কিত টেবিল আপডেট করা। AFTER Trigger ডেটাবেসে ডেটা পরিবর্তনের পর কার্যকর হয় এবং এটির পরিবর্তনগুলো ডেটাবেসে পূর্ববর্তী অবস্থানে প্রভাব ফেলতে পারে।
সিনট্যাক্স:
CREATE TRIGGER TriggerName
ON TableName
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
-- Trigger-এর কার্যাবলী
END;
উদাহরণ (AFTER INSERT Trigger):
CREATE TRIGGER AfterInsertEmployee
ON Employees
AFTER INSERT
AS
BEGIN
DECLARE @EmployeeID INT;
SELECT @EmployeeID = EmployeeID FROM INSERTED;
PRINT 'Employee ' + CAST(@EmployeeID AS VARCHAR) + ' was added successfully.';
END;
এখানে:
AFTER INSERTTriggerEmployeesটেবিলের মধ্যে নতুন রেকর্ড ইনসার্ট হওয়ার পর কার্যকর হবে এবং ইনসার্ট হওয়া কর্মচারীর EmployeeID প্রিন্ট করবে।
AFTER Trigger এর ব্যবহার:
- Data Validation: ডেটা ইনসার্ট বা আপডেট হওয়ার পরে অন্য টেবিলের সঙ্গে সম্পর্কিত ডেটা আপডেট বা যাচাই করা।
- Audit Logging: ডেটাবেসের যেকোনো পরিবর্তনের পর লগ বা অডিট তথ্য সংরক্ষণ করা।
- Cascade Updates/Deletes: যখন একটি টেবিলের ডেটা পরিবর্তিত হয়, তখন সম্পর্কিত টেবিলগুলিতেও পরিবর্তন করা।
2. INSTEAD OF Trigger
INSTEAD OF Trigger যখন কোনো নির্দিষ্ট ডেটাবেস অপারেশন (insert, update, delete) চলে, তখন সেটি ডিফাইন করা INSTEAD OF Trigger দ্বারা প্রতিস্থাপিত হয়। অর্থাৎ, INSTEAD OF Trigger ঐ অপারেশনটি কার্যকর না করে নিজের ভিতরের কাস্টম কোড চালায়। এটি সাধারণত ব্যবহার করা হয় যখন আপনি ডেটাবেসের প্রকৃত অপারেশন প্রতিস্থাপন করতে চান, যেমন একটি ভিউ (view) থেকে ডেটা ইনসার্ট বা আপডেট করার সময়।
সিনট্যাক্স:
CREATE TRIGGER TriggerName
ON TableName
INSTEAD OF INSERT, UPDATE, DELETE
AS
BEGIN
-- Trigger-এর কার্যাবলী
END;
উদাহরণ (INSTEAD OF INSERT Trigger):
CREATE TRIGGER InsteadOfInsertEmployee
ON Employees
INSTEAD OF INSERT
AS
BEGIN
-- নতুন রেকর্ড ইনসার্ট হওয়ার আগে কিছু কাস্টম কাজ করা
PRINT 'INSERT operation is intercepted and replaced by custom action';
INSERT INTO Employees (EmployeeID, FirstName, LastName)
SELECT EmployeeID, FirstName, LastName FROM INSERTED;
END;
এখানে:
- INSTEAD OF INSERT Trigger Employees টেবিলে নতুন রেকর্ড ইনসার্ট হওয়ার পরিবর্তে একটি কাস্টম অপারেশন চালায় এবং তারপর ঐ রেকর্ডটি টেবিলটিতে ইনসার্ট করে।
INSTEAD OF Trigger এর ব্যবহার:
- View Modification: ভিউ (view)-এর মাধ্যমে টেবিলে INSERT, UPDATE, বা DELETE করা, যেখানে প্রকৃত ডেটাবেসে কাজ করা সম্ভব নয়।
- Complex Logic: জটিল লজিক প্রয়োগের মাধ্যমে ডেটাবেস অপারেশন প্রতিস্থাপন করা।
- Redirect Operations: কোনো নির্দিষ্ট অপারেশন করার পরিবর্তে অন্য অপারেশন চালানো।
AFTER এবং INSTEAD OF Trigger এর মধ্যে পার্থক্য
| Feature | AFTER Trigger | INSTEAD OF Trigger |
|---|---|---|
| Execution Time | ডেটাবেস অপারেশন শেষ হওয়ার পরে কার্যকর হয়। | ডেটাবেস অপারেশনটি শুরু হওয়ার আগে কার্যকর হয়। |
| Use Case | ডেটা পরিবর্তনের পর পরবর্তী কার্যাবলী বা লগিং। | ডেটাবেস অপারেশন প্রতিস্থাপন বা কাস্টম অপারেশন। |
| Impact on Original Operation | আসল অপারেশন কার্যকর হয়, শুধুমাত্র পরবর্তী কার্যাবলী হয়। | আসল অপারেশন বন্ধ হয়ে কাস্টম কোড চলে। |
| Common Use Cases | - Cascade updates- Audit logs- Referential integrity | - Views modification- Complex logic handling- Preventing certain operations |
| Behavior | ডেটাবেস পরিবর্তন আসলভাবে ঘটে। | ডেটাবেস অপারেশনগুলো প্রতিস্থাপিত হয়। |
Conclusion
- AFTER Trigger ডেটাবেসে একটি অপারেশন (insert, update, delete) শেষে কাজ করে এবং সাধারণত ডেটাবেসের রেফারেন্সিয়াল ইন্টিগ্রিটি বজায় রাখতে বা লগিং এবং অডিটিংয়ের জন্য ব্যবহৃত হয়।
- INSTEAD OF Trigger ডেটাবেস অপারেশন প্রতিস্থাপন করে এবং জটিল লজিক প্রয়োগে ব্যবহৃত হয়, বিশেষত যখন আপনি ভিউয়ের মধ্যে ডেটাবেসের পরিবর্তন করতে চান।
- দুটি Trigger ডেটাবেসের কার্যকলাপের ওপর নিয়ন্ত্রণ প্রদান করে, তবে তাদের ব্যবহারের উদ্দেশ্য এবং কার্যকারিতা ভিন্ন।
Triggers হল বিশেষ ধরনের স্টোরড প্রোগ্রাম যা নির্দিষ্ট ডেটাবেস ইভেন্টের জন্য স্বয়ংক্রিয়ভাবে কার্যকর হয়। এগুলি সাধারণত INSERT, UPDATE, বা DELETE অপারেশনগুলির পরে কার্যকর হয় এবং ডেটাবেসে স্বয়ংক্রিয় কার্যক্রম (যেমন ডেটা ভ্যালিডেশন, লগিং, বা হিসাব সংরক্ষণ) পরিচালনা করতে ব্যবহৃত হয়।
Row Level এবং Statement Level Triggers হল দুটি প্রধান প্রকারের ট্রিগার। এগুলির মধ্যে পার্থক্য ডেটাবেস অপারেশনের প্রতি প্রতিক্রিয়া এবং প্রক্রিয়াকরণের স্তরের উপর নির্ভর করে।
১. Row Level Triggers (রো-লেভেল ট্রিগার)
Row Level Triggers হল এমন ট্রিগার যা প্রতিটি রেকর্ডের জন্য একাধিক বার চালানো হয়। এটি একটি নির্দিষ্ট INSERT, UPDATE, বা DELETE অপারেশন দ্বারা প্রভাবিত প্রতিটি রো-এর জন্য কার্যকর হয়।
কিভাবে কাজ করে:
- যখন কোনো INSERT, UPDATE, বা DELETE অপারেশন একটি বা একাধিক রেকর্ডে পরিবর্তন ঘটায়, তখন এই ট্রিগারটি প্রতিটি রেকর্ডের জন্য একে একে কার্যকর হয়।
- একে একে প্রভাবিত রেকর্ডগুলির উপর প্রক্রিয়া চালানো হয়।
সিনট্যাক্স:
CREATE TRIGGER trigger_name
ON table_name
FOR INSERT, UPDATE, DELETE
AS
BEGIN
-- Trigger body
-- Perform operations for each affected row
END;
উদাহরণ:
ধরা যাক, একটি Employees টেবিল আছে এবং আপনি চান যে যখন কোনো কর্মচারী বেতন আপডেট হবে, তখন তার পুরানো বেতন SalaryHistory টেবিলে সংরক্ষণ করা হোক।
CREATE TRIGGER trg_UpdateSalary
ON Employees
FOR UPDATE
AS
BEGIN
-- Salary history table এ পুরানো বেতন সংরক্ষণ করা
INSERT INTO SalaryHistory (EmployeeID, OldSalary, ChangeDate)
SELECT EmployeeID, Salary, GETDATE()
FROM inserted;
END;
এখানে:
- inserted হলো একটি virtual table যা UPDATE অপারেশনের পরে সংশোধিত রেকর্ডগুলি ধারণ করে।
- প্রতিটি আপডেট হওয়া রেকর্ডের জন্য SalaryHistory টেবিলে পুরানো বেতন সংরক্ষণ করা হচ্ছে।
বিশেষত্ব:
- Row Level Triggers একে একে সমস্ত পরিবর্তিত রেকর্ডে কার্যকর হয়, তাই যখন একাধিক রেকর্ড প্রভাবিত হয়, তখন ট্রিগারটি বারবার চালানো হয়।
- এটি সাধারণত complex business logic বা validation করতে ব্যবহৃত হয়, যেখানে প্রতিটি রেকর্ডের জন্য আলাদাভাবে অপারেশন করা প্রয়োজন।
২. Statement Level Triggers (স্টেটমেন্ট-লেভেল ট্রিগার)
Statement Level Triggers হল এমন ট্রিগার যা একবারে পুরো স্টেটমেন্টের জন্য কার্যকর হয়, যে স্টেটমেন্টটি INSERT, UPDATE, বা DELETE অপারেশন সম্পাদন করছে, তা যত রেকর্ডেই প্রভাব ফেলুক না কেন। এই ট্রিগারটি শুধুমাত্র একটি স্টেটমেন্টের জন্য একবার চালানো হয়।
কিভাবে কাজ করে:
- যখন একটি INSERT, UPDATE, বা DELETE অপারেশন সম্পন্ন হয়, তখন Statement Level Trigger পুরো অপারেশনটির উপর একবার কার্যকর হয়, তা যত রেকর্ডেই প্রভাব ফেলুক না কেন।
- এটি সাধারণত সিস্টেমের জন্য সাধারণ লগিং বা ব্যাচ অপারেশন চালানোর জন্য ব্যবহৃত হয়, যেখানে প্রতিটি রেকর্ডের উপর আলাদাভাবে কাজ করার প্রয়োজন হয় না।
সিনট্যাক্স:
CREATE TRIGGER trigger_name
ON table_name
FOR INSERT, UPDATE, DELETE
AS
BEGIN
-- Trigger body
-- Perform operations for the entire statement
END;
উদাহরণ:
ধরা যাক, একটি AuditLogs টেবিল আছে এবং আপনি চান যে যখন কোনো Employees টেবিলের কোনো রেকর্ড UPDATE হবে, তখন পুরো অপারেশনের একটি লগ AuditLogs টেবিলে রেকর্ড হোক।
CREATE TRIGGER trg_AuditEmployeeUpdate
ON Employees
FOR UPDATE
AS
BEGIN
INSERT INTO AuditLogs (Action, TableName, ActionDate)
VALUES ('UPDATE', 'Employees', GETDATE());
END;
এখানে:
- যখন Employees টেবিলের কোনো UPDATE অপারেশন ঘটে, তখন AuditLogs টেবিলে একটি লগ রেকর্ড করা হবে।
- এটি একটি স্টেটমেন্ট-লেভেল ট্রিগার, তাই সমস্ত আপডেটের জন্য একবারেই কার্যকর হবে।
বিশেষত্ব:
- Statement Level Triggers শুধুমাত্র INSERT, UPDATE, বা DELETE অপারেশন সম্পন্ন হওয়ার পর একবারই চালানো হয়, তা যত রেকর্ডই প্রভাবিত করুক না কেন।
- এটি সাধারণত system-wide logging, batch updates, বা generic auditing এর জন্য ব্যবহৃত হয়।
৩. Row Level এবং Statement Level Triggers এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Row Level Triggers | Statement Level Triggers |
|---|---|---|
| কাজের স্তর | একে একে প্রতিটি রেকর্ডের জন্য কার্যকর | পুরো স্টেটমেন্টের জন্য একবার কার্যকর |
| ব্যবহার | যখন প্রতিটি রেকর্ডের উপর কাজ করতে হয় | যখন পুরো অপারেশন বা স্টেটমেন্টের জন্য কাজ করতে হয় |
| কার্যকর হওয়া | প্রতিটি প্রভাবিত রেকর্ডের জন্য কার্যকর | একবার, পুরো স্টেটমেন্ট সম্পন্ন হলে কার্যকর |
| পারফরম্যান্স | অনেক রেকর্ড প্রভাবিত হলে পারফরম্যান্স কমে যেতে পারে | একটি স্টেটমেন্টের জন্য একবারই কাজ হয়, তাই পারফরম্যান্স ভালো |
| ব্যবহার ক্ষেত্র | ব্যবসায়িক লজিক, ভ্যালিডেশন, বা প্রতিটি রেকর্ডের জন্য অ্যাকশন | সিস্টেম লগিং, অডিটিং, ব্যাচ প্রক্রিয়া |
সারাংশ
Row Level Triggers এবং Statement Level Triggers উভয়ই ডেটাবেসের INSERT, UPDATE, বা DELETE অপারেশনগুলির পরে স্বয়ংক্রিয়ভাবে কার্যকর হয়, তবে তাদের কাজের প্রক্রিয়া ভিন্ন। Row Level Triggers একে একে প্রতিটি রেকর্ডের জন্য কাজ করে, যা জটিল লজিক বা প্রতিটি রেকর্ডের জন্য পৃথকভাবে কাজ করার জন্য উপকারী। অন্যদিকে, Statement Level Triggers পুরো অপারেশন বা স্টেটমেন্টের জন্য একবার কার্যকর হয় এবং সাধারণত সিস্টেম স্তরের কাজের জন্য ব্যবহৃত হয়।
Triggers হল বিশেষ ধরনের স্টোরড প্রসিডিউর যা স্বয়ংক্রিয়ভাবে কোনও নির্দিষ্ট ডেটাবেস অপারেশন (যেমন INSERT, UPDATE, বা DELETE) ঘটলে কার্যকর হয়। Triggers সাধারণত ডেটাবেসে ডেটা পরিবর্তনের প্রক্রিয়ায় অটোমেশন ও ইন্টিগ্রিটি বজায় রাখার জন্য ব্যবহৃত হয়। এটি একটি event-driven প্রোগ্রামিং কৌশল, যেখানে এক বা একাধিক শর্ত পূর্ণ হলে trigger সক্রিয় হয়।
Trigger এর ধরন
- DML Triggers (Data Manipulation Language Triggers):
- INSERT Trigger: একটি নতুন রেকর্ড টেবিলে যোগ হলে trigger কাজ করে।
- UPDATE Trigger: একটি রেকর্ডের মান পরিবর্তিত হলে trigger কাজ করে।
- DELETE Trigger: একটি রেকর্ড ডিলিট হলে trigger কাজ করে।
- INSTEAD OF Triggers:
- INSTEAD OF Triggers হল এমন triggers যা কোনো ডেটাবেস অপারেশন সম্পাদনের পরিবর্তে নির্দিষ্ট কাজ বা স্টেটমেন্ট কার্যকর করে।
- DDL Triggers (Data Definition Language Triggers):
- এগুলি ডেটাবেস স্কিমা পরিবর্তন বা ডেটাবেসের অবকাঠামোর জন্য ব্যবহৃত হয় (যেমন
CREATE,ALTER,DROPঅপারেশন)।
- এগুলি ডেটাবেস স্কিমা পরিবর্তন বা ডেটাবেসের অবকাঠামোর জন্য ব্যবহৃত হয় (যেমন
- LOGON/LOGOFF Triggers:
- এটি ব্যবহারকারীর লগিন বা লগআউট হওয়ার সময় কোনো প্রক্রিয়া চালানোর জন্য ব্যবহৃত হয়।
Trigger এর সিনট্যাক্স:
CREATE TRIGGER trigger_name
ON table_name
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
-- Triggered code
END;
- trigger_name: Trigger এর নাম।
- table_name: Trigger টি যে টেবিলের ওপর প্রয়োগ হবে তার নাম।
- AFTER INSERT, UPDATE, DELETE: কোন ডেটাবেস অপারেশনের পরে trigger কাজ করবে।
- BEGIN...END: Trigger এর কার্যকরী অংশ যেখানে আপনার কোড থাকবে।
Trigger এর উদাহরণ এবং ব্যবহার:
১. INSERT Trigger উদাহরণ
ধরা যাক, একটি Sales টেবিল রয়েছে যেখানে SaleAmount কলামে বিক্রয়ের পরিমাণ থাকে এবং আপনি চান যে বিক্রয়ের পরিমাণ ইনসার্ট হলে AuditSales টেবিলে একটি রেকর্ড তৈরি হোক, যেখানে বিক্রয়ের পরিমাণ, তারিখ এবং কর্মচারীর আইডি থাকবে।
CREATE TRIGGER trg_AuditSaleInsert
ON Sales
AFTER INSERT
AS
BEGIN
DECLARE @SaleAmount DECIMAL(10, 2), @EmployeeID INT, @SaleDate DATETIME;
-- Inserted রেকর্ড থেকে ডেটা নিয়ে আসা
SELECT @SaleAmount = SaleAmount, @EmployeeID = EmployeeID, @SaleDate = SaleDate
FROM INSERTED;
-- AuditSales টেবিলে রেকর্ড ইনসার্ট করা
INSERT INTO AuditSales (SaleAmount, EmployeeID, SaleDate)
VALUES (@SaleAmount, @EmployeeID, @SaleDate);
END;
এখানে:
- AFTER INSERT: যখন নতুন রেকর্ড Sales টেবিলে ইনসার্ট হবে, তখন এই trigger কার্যকর হবে।
- INSERTED: এটি একটি বিশেষ টেবিল যা
INSERT,UPDATEঅপারেশনের পরবর্তী রেকর্ড ধারণ করে।
২. UPDATE Trigger উদাহরণ
ধরা যাক, একটি Employees টেবিল রয়েছে এবং আপনি চান যে কর্মচারীর Salary পরিবর্তিত হলে একটি SalaryHistory টেবিলে পুরনো এবং নতুন স্যালারি মানের সাথে এক্সট্রা তথ্য (যেমন পরিবর্তনের তারিখ) সংরক্ষিত হোক।
CREATE TRIGGER trg_UpdateSalary
ON Employees
AFTER UPDATE
AS
BEGIN
DECLARE @OldSalary DECIMAL(10, 2), @NewSalary DECIMAL(10, 2), @EmployeeID INT, @ChangeDate DATETIME;
-- Updated রেকর্ড থেকে পুরনো এবং নতুন স্যালারি পাওয়া
SELECT @OldSalary = DELETED.Salary, @NewSalary = INSERTED.Salary, @EmployeeID = INSERTED.EmployeeID
FROM INSERTED
INNER JOIN DELETED ON INSERTED.EmployeeID = DELETED.EmployeeID;
-- SalaryHistory টেবিলে রেকর্ড ইনসার্ট করা
INSERT INTO SalaryHistory (EmployeeID, OldSalary, NewSalary, ChangeDate)
VALUES (@EmployeeID, @OldSalary, @NewSalary, GETDATE());
END;
এখানে:
- AFTER UPDATE: যখন Salary পরিবর্তিত হবে, trigger এটি সনাক্ত করে এবং SalaryHistory টেবিলে পুরনো এবং নতুন স্যালারি সংরক্ষণ করবে।
৩. DELETE Trigger উদাহরণ
ধরা যাক, আপনি চান যে Employees টেবিল থেকে একটি রেকর্ড ডিলিট হলে তা AuditLog টেবিলে লোগ করা হোক, যাতে পরে ট্র্যাক করা যায় কোন রেকর্ডটি মুছে ফেলা হয়েছে।
CREATE TRIGGER trg_DeleteEmployee
ON Employees
AFTER DELETE
AS
BEGIN
DECLARE @EmployeeID INT, @EmployeeName VARCHAR(100);
-- Deleted রেকর্ড থেকে ডেটা নেয়া
SELECT @EmployeeID = EmployeeID, @EmployeeName = FirstName + ' ' + LastName
FROM DELETED;
-- AuditLog টেবিলে রেকর্ড ইনসার্ট করা
INSERT INTO AuditLog (EmployeeID, EmployeeName, Action, ActionDate)
VALUES (@EmployeeID, @EmployeeName, 'Deleted', GETDATE());
END;
এখানে:
- AFTER DELETE: যখন Employees টেবিল থেকে কোনো রেকর্ড মুছে ফেলা হবে, trigger এটি সনাক্ত করে এবং AuditLog টেবিলে লোগ করবে।
Trigger ব্যবহার করার প্রয়োজনীয়তা:
- ডেটাবেস ইন্টিগ্রিটি:
- Trigger ব্যবহার করে ডেটাবেসের ইন্টিগ্রিটি বজায় রাখা যায়, যেমন ডেটার সঠিকতা এবং মান যাচাই করা।
- অটোমেটিক ডেটা ম্যানিপুলেশন:
- Triggers ডেটাবেসে যেকোনো পরিবর্তনের পর অটোমেটিকভাবে ডেটা ম্যানিপুলেট করতে সাহায্য করে, যেমন লগ বা অডিট রেকর্ড তৈরি করা, ডেটা আপডেট করা ইত্যাদি।
- Audit Trails:
- Trigger ব্যবহার করে আপনি ডেটাবেসের পরিবর্তনগুলি ট্র্যাক করতে পারেন। যখন কোনো রেকর্ড মুছে যায় বা পরিবর্তিত হয়, তখন সেই পরিবর্তন বা মুছা হওয়ার ঘটনা অডিট টেবিল বা লগ টেবিলে রেকর্ড করা হয়।
- Complex Business Logic:
- Trigger ব্যবহার করে আপনি ডেটাবেসের মধ্যে জটিল ব্যবসায়িক লজিক প্রয়োগ করতে পারেন, যেমন ডেটাবেসের একাধিক টেবিলের মধ্যে সম্পর্ক তৈরি করা বা তাদের মধ্যে সিঙ্ক্রোনাইজেশন রাখা।
CURSOR এর তুলনায় Trigger এর সুবিধা:
- Performance: Triggers সাধারণত খুব দ্রুত কাজ করে কারণ তারা SET-BASED প্রক্রিয়া ব্যবহার করে এবং CURSOR এর তুলনায় কম রিসোর্স নেয়।
- Automatic Execution: Triggers স্বয়ংক্রিয়ভাবে কাজ করে, তাই আপনাকে ম্যানুয়ালি কোড লেখার প্রয়োজন নেই।
সারাংশ
Triggers T-SQL-এ স্বয়ংক্রিয়ভাবে নির্দিষ্ট ডেটাবেস অপারেশন (যেমন INSERT, UPDATE, DELETE) ঘটলে কার্যকরী হয়। তারা ডেটাবেসের ইন্টিগ্রিটি বজায় রাখে, জটিল ব্যবসায়িক লজিক কার্যকর করে, এবং অডিট ট্রেইল তৈরি করতে সাহায্য করে। DML Triggers ডেটা ম্যানিপুলেশন (INSERT, UPDATE, DELETE) অপারেশন পরিচালনা করে, INSTEAD OF Triggers এবং DDL Triggers স্কিমা পরিবর্তন ও ডেটাবেস কাঠামো পরিবর্তনে ব্যবহৃত হয়।
Read more