একটি প্রফেশনাল ডাটাবেস অ্যাপ্লিকেশনে অনেক সময় আমরা চাই যে, কোনো নির্দিষ্ট ঘটনা (যেমন নতুন ডেটা ঢোকা, ডেটা বদলানো বা মুছে ফেলা) ঘটলে স্বয়ংক্রিয়ভাবে আরেকটি কাজ হয়ে যাক – যেমন একটি লগ টেবিলে রেকর্ড রাখা, বা কোনো ভ্যালিডেশন চেক করা। SQLite-তে এই অটোমেটিক কাজগুলো করার জন্য Trigger ব্যবহার করা হয়। ট্রিগার হলো এক ধরনের সঞ্চিত কার্যক্রম, যা নির্দিষ্ট টেবিলের উপর INSERT, UPDATE বা DELETE ইভেন্ট ঘটলে নিজে থেকেই চালু হয়। আজ আমরা ট্রিগার তৈরির সিনট্যাক্স, বাস্তব Audit Log উদাহরণ, ট্রিগার তালিকা দেখা ও মুছে ফেলার পদ্ধতি সম্পূর্ণ বাংলায় শিখব।
পূর্বপ্রস্তুতি
- SQLite ইন্সটল থাকতে হবে (সিরিজের ৩য় পর্ব দেখুন)।
- এই পর্বে
trigger_demo.dbনামে ডাটাবেস ব্যবহার করব। প্রথমে COMPANY ও AUDIT নামে দুটি টেবিল তৈরি করব।
টার্মিনাল:
bash
sqlite3 trigger_demo.db
sql
-- COMPANY টেবিল (সহজ কাঠামো) CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL ); -- AUDIT টেবিল (ট্রিগার লগ রাখার জন্য) CREATE TABLE AUDIT( EMP_ID INT NOT NULL, ENTRY_DATE TEXT NOT NULL );
- আউটপুট ফরম্যাট:
.header onও.mode column।
১. ট্রিগার কী?
ট্রিগার হলো ডাটাবেসের একটি বিশেষ বস্তু (object), যা:
- নির্দিষ্ট টেবিলের উপর INSERT, DELETE বা UPDATE অপারেশন ঘটলে স্বয়ংক্রিয়ভাবে কার্যকর হয়।
- ইভেন্টের আগে (BEFORE) বা পরে (AFTER) কাজ করতে পারে।
- SQLite কেবল FOR EACH ROW ট্রিগার সমর্থন করে, অর্থাৎ প্রতিটি প্রভাবিত সারির জন্য আলাদা করে ট্রিগার ফায়ার হয়।
- INSERT, UPDATE, DELETE-র সময় নতুন ও পুরনো মান যথাক্রমে NEW.column_name ও OLD.column_name দিয়ে অ্যাক্সেস করা যায়।
- WHEN ক্লজ দিয়ে শর্ত দেওয়া যায়, যে শর্ত সত্য হলেই কেবল ট্রিগার কাজ করবে।
২. ট্রিগার তৈরির সিনট্যাক্স
সাধারণ ট্রিগার (INSERT/DELETE/UPDATE):
sql
CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name ON table_name BEGIN -- Trigger logic (SQL statements) END;
event_name: INSERT, DELETE, UPDATEBEFOREবাAFTER: কখন কাজ করবে।FOR EACH ROWলেখা ঐচ্ছিক (SQLite ডিফল্টভাবে FOR EACH ROW)।
নির্দিষ্ট কলামের UPDATE-তে ট্রিগার:
sql
CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name ON table_name BEGIN -- Trigger logic END;
এটি তখনই ফায়ার হবে যখন ওই নির্দিষ্ট কলাম আপডেট হবে।
৩. উদাহরণ: Audit Log (AFTER INSERT ট্রিগার)
আমরা COMPANY টেবিলে নতুন কর্মী ঢোকানো হলে তার ID ও সময় AUDIT টেবিলে স্বয়ংক্রিয়ভাবে লগ করে রাখব।
ট্রিগার তৈরি:
sql
CREATE TRIGGER audit_log AFTER INSERT
ON COMPANY
BEGIN
INSERT INTO AUDIT (EMP_ID, ENTRY_DATE)
VALUES (NEW.ID, datetime('now'));
END;
NEW.IDদিয়ে নতুন ইনসার্ট হওয়া সারির ID পাচ্ছি।datetime('now')বর্তমান টাইমস্ট্যাম্প দেয়।
পরীক্ষা: COMPANY-তে একটি রেকর্ড ঢোকাই:
sql
INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00);
এখন COMPANY ও AUDIT উভয় টেবিল দেখি:
sql
SELECT * FROM COMPANY; SELECT * FROM AUDIT;
COMPANY-তে:
text
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0
AUDIT-তে:
text
EMP_ID ENTRY_DATE ---------- ------------------- 1 2025-08-07 14:30:00
ট্রিগার স্বয়ংক্রিয়ভাবে AUDIT-এ রেকর্ড ঢুকিয়েছে।
৪. UPDATE এবং DELETE ট্রিগার
UPDATE ট্রিগারে আমরা OLD.column ও NEW.column উভয়ই অ্যাক্সেস করতে পারি। DELETE ট্রিগারে শুধুমাত্র OLD.column পাওয়া যায় (কারণ মুছে যাওয়ার পর নতুন কিছু নেই)।
UPDATE ট্রিগার উদাহরণ:
sql
CREATE TRIGGER audit_log_update AFTER UPDATE
ON COMPANY
BEGIN
INSERT INTO AUDIT (EMP_ID, ENTRY_DATE)
VALUES (OLD.ID, 'UPDATED at ' || datetime('now'));
END;
এখন UPDATE COMPANY SET SALARY = 25000 WHERE ID = 1; চালালে AUDIT-এ আরেকটি রেকর্ড যোগ হবে।
DELETE ট্রিগার উদাহরণ:
sql
CREATE TRIGGER audit_log_delete AFTER DELETE
ON COMPANY
BEGIN
INSERT INTO AUDIT (EMP_ID, ENTRY_DATE)
VALUES (OLD.ID, 'DELETED at ' || datetime('now'));
END;
এখন DELETE FROM COMPANY WHERE ID = 1; দিলে AUDIT-এ OLD.ID সহ ডিলিট লগ ঢুকবে।
৫. WHEN ক্লজ দিয়ে শর্তযুক্ত ট্রিগার
আমরা চাইলে ট্রিগার শুধুমাত্র নির্দিষ্ট শর্তে কাজ করবে। যেমন, বেতন ৫০,০০০-এর বেশি হলে তবেই লগ হবে:
sql
CREATE TRIGGER high_salary_audit AFTER INSERT
ON COMPANY
WHEN NEW.SALARY > 50000
BEGIN
INSERT INTO AUDIT (EMP_ID, ENTRY_DATE)
VALUES (NEW.ID, 'High salary: ' || datetime('now'));
END;
৬. ট্রিগার তালিকা দেখা (Listing Triggers)
সমস্ত ট্রিগারের নাম sqlite_master টেবিল থেকে বের করা যায়:
সব ট্রিগার:
sql
SELECT name FROM sqlite_master WHERE type = 'trigger';
নির্দিষ্ট টেবিলের ট্রিগার:
sql
SELECT name FROM sqlite_master WHERE type = 'trigger' AND tbl_name = 'COMPANY';
আমাদের তৈরি audit_log, audit_log_update ইত্যাদি দেখাবে।
আপনি চাইলে ট্রিগারের বিস্তারিত দেখতে .schema কমান্ড দিতে পারেন (যদিও এটি শুধু টেবিল ও ইনডেক্স নয়, ট্রিগারের CREATE স্টেটমেন্ট-ও দেখায়): .schema অথবা SELECT sql FROM sqlite_master WHERE type='trigger' AND name='audit_log';
৭. ট্রিগার মুছে ফেলা (Dropping Triggers)
ট্রিগার ডিলিট করতে DROP TRIGGER ব্যবহার করুন:
sql
DROP TRIGGER audit_log;
এখন audit_log ট্রিগার আর কাজ করবে না। ট্রিগারের সাথে যুক্ত টেবিল ড্রপ করলে ট্রিগারও স্বয়ংক্রিয়ভাবে মুছে যায়।
৮. ডিরেক্টরি স্ট্রাকচার
আমাদের ডাটাবেস ফাইল trigger_demo.db। ট্রিগার ডাটাবেসেরই অংশ, কোনো আলাদা ফাইল তৈরি করে না।
text
project-folder/ └── trigger_demo.db
প্যাকেজ: কোনো বিশেষ প্যাকেজের প্রয়োজন নেই।
৯. গুরুত্বপূর্ণ টিপস
- ট্রিগার ডিবাগিং: ট্রিগারে কোনো SQL এরর হলে পুরো স্টেটমেন্ট (যে INSERT/UPDATE/DELETE ট্রিগারকে ডেকেছে) বাতিল হয়ে যায়। তাই ট্রিগারের ভেতর সঠিক SQL নিশ্চিত করুন।
- RAISE() ফাংশন: ট্রিগারের ভেতর
RAISE(ABORT, 'Error message')দিয়ে ইচ্ছাকৃতভাবে এরর তৈরি করে অপারেশন বাতিল করা যায়। ভ্যালিডেশন ট্রিগারে এটি খুব কাজের। - টেবিল ড্রপ: টেবিল ডিলিট করলে তার সব ট্রিগারও অটো-ড্রপ হয়।
- রিকার্সিভ ট্রিগার: একটি ট্রিগার অন্য টেবিলের ট্রিগারকে ডাকতে পারে, কিন্তু একই টেবিলের ট্রিগার নিজেই নিজেকে রিকার্সিভলি ডাকবে কিনা তা
PRAGMA recursive_triggersসেটিং নির্ধারণ করে। - পারফরমেন্স: বড় টেবিলে অনেক ট্রিগার পারফরমেন্স কমাতে পারে; প্রয়োজন ছাড়া ট্রিগার ব্যবহার নয়।
- OLD/NEW রেফারেন্স: INSERT-এ শুধু NEW, DELETE-এ শুধু OLD, UPDATE-এ OLD ও NEW উভয়ই পাওয়া যায়।
১০. সম্পূর্ণ অনুশীলন সেশন
sql
.headers on
.mode column
-- COMPANY ও AUDIT টেবিল তৈরি (উপরের মতো)
-- ট্রিগার তৈরি
CREATE TRIGGER audit_log AFTER INSERT ON COMPANY
BEGIN
INSERT INTO AUDIT (EMP_ID, ENTRY_DATE) VALUES (NEW.ID, datetime('now'));
END;
-- কয়েকটি ইনসার্ট
INSERT INTO COMPANY VALUES (2, 'Allen', 25, 'Texas', 15000.00);
INSERT INTO COMPANY VALUES (3, 'Teddy', 23, 'Norway', 20000.00);
-- AUDIT টেবিল দেখি
SELECT * FROM AUDIT;
-- UPDATE ট্রিগার তৈরি ও পরীক্ষা
CREATE TRIGGER audit_upd AFTER UPDATE ON COMPANY
BEGIN
INSERT INTO AUDIT VALUES (OLD.ID, 'UPD: ' || datetime('now'));
END;
UPDATE COMPANY SET SALARY = 30000 WHERE ID = 3;
SELECT * FROM AUDIT;
-- ট্রিগার লিস্ট
SELECT name FROM sqlite_master WHERE type = 'trigger';
-- ট্রিগার ড্রপ
DROP TRIGGER audit_upd;
পরবর্তী পর্বে
আমরা শিখব SQLite Indexes – কীভাবে ইনডেক্স তৈরি করে ডেটাবেসের অনুসন্ধান গতি বাড়ানো যায় এবং কখন ইনডেক্স ব্যবহার করতে হয়।
লেখকের কথা: ট্রিগার ডাটাবেসকে বুদ্ধিমান করে তোলে – স্বয়ংক্রিয় লগিং, ভ্যালিডেশন আরও কত কী! বাংলায় প্রযুক্তি শেখার এই ধারায় আপনার আগ্রহই আমাদের পাথেয়। পোস্টটি ভালো লাগলে বন্ধুদের শেয়ার করতে বলুন, এবং সব আপডেট পেতে ToLearnTeam.com সাবস্ক্রাইব করুন। আপনার প্রশ্ন বা মতামত কমেন্টে জানাতে দ্বিধা করবেন না!
SQLite Full Course
- SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
- SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
- SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
- SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
- SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
- SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
- SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
- SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
- SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
- SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
- SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
- SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
- SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
- SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
- SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
- SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
- SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
- SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
- SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
- SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
- SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
- SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
- SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
- SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
- SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
- SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
- SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
- SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
- SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
- SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
- SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
- SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
- SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
- SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
- SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
- SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
- SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
- SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
- SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
- SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
- SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
- SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
- SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
- SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
- SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
- SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
- SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
- SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
- SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
- SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)
