এস কিউ এল সার্ভার ২০০৮ শিখুন ধাপে ধাপে [পর্ব-১৫] :: ট্রিগার-২

SQL সার্ভার ২০০৮ শিখুন ধাপে ধাপে

সুপ্রিয় বন্ধুরা,

কেমন আছেন সবাই? ভাল নিশ্চয়ই। কেমন কাটলো আপনাদের পহেলা বৈশাখ? সবাইকে বৈশাখের ঝড়ো বাতাসের ঝাপটা দিয়ে শুরু করছি আমার আজকের টিউন। গত পর্বে আমরা দেখেছিলাম AFTER INSERT TRIGGER এ পর্বে দেখবো AFTER UPDATE TRIGGER এবং AFTER DELETE TRIGGER

b) AFTER UPDATE TRIGGER:

CREATE TRIGGER trgAfterUpdate ON EmpInfo
FOR UPDATE
AS
declare @empid int;
declare @empname varchar(100);
declare @empsal decimal(10,2);
declare @audit_action varchar(100);

select @empid=i.eid from inserted i;
select @empname=i.ename from inserted i;
select @empsal=i.eSalary from inserted i;

if update(ename)
set @audit_action='Updated Record -- After Update Trigger.';
if update(ESalary)
set @audit_action='Updated Record -- After Update Trigger.';

insert into Emp_Audit(Emp_ID,Emp_Name,Emp_Sal,Audit_Action,Audit_Timestamp)
values(@empid,@empname,@empsal,@audit_action,getdate());

PRINT 'AFTER UPDATE Trigger fired.'
GO

এখানে লক্ষ করুন EmpInfo টেবিল এ যদি কোন Update Query চালাই তবেই শুধুমাত্র ট্রিগারটি ফায়ার করবে, অন্যথায় করবে না। যেমন ধরুন আপনি একটি select statement লিখলেন এভাবেঃ select * from EmpInfo দেখুন এখানে কিন্তু আপনার তৈরি কৃত দুটি ট্রিগার এর একটিও ফায়ার করে নি। কারন select statement এর জন্য কোন ট্রিগার আপনি তৈরি করেননি। তৈরি করেছেন insert এবং update এর জন্য। তাহলে চলুন দেখি এই টেবিল এ update Query চালালে এই ট্রিগারটি ফায়ার করে কিনা সেটা দেখি।

update EmpInfo set eSalary=18250 where eid=6

নিচে রেজাল্ট দেখুনঃ

দেখলেন তো আমাদের ট্রিগারটি ফায়ার করেছে। অর্থাৎ এই ট্রিগারটি শুধু মাত্র এই টেবিল এ update করলেই ফায়ার হবে এবং অন্য টেবিল এ তার information insert হবে। চলুন দেখি অন্য টেবিল অর্থাৎ Emp_Audit টেবিল এ update করা ডাটা insert হল কিনা সেটা দেখিঃ

কি? কেমন বুঝছেন? কঠিন লাগছে? ভয় পাবেন না, কারন ভয়ের পরেই জয়। ধৈর্য ধরে আমাকে অনুসরন করে যান। এগুলো কেবল শেখার জন্য, কোড গুলোর ধরন এবং কোনটার কি কাজ সেটা দেখাচ্ছি। সামনে practical life এ এগুলো কি কাজ করে, কেন করে, কিভাবে করে সব আপনাদের সাথে শেয়ার করবো; তখন দেখবেন কত ভাল ভাগছে শিখতে।

c) AFTER DELETE TRIGGER:


CREATE TRIGGER trgAfterDelete ON EmpInfo
AFTER DELETE
AS
declare @empid int;
declare @empname varchar(100);
declare @empsal decimal(10,2);
declare @audit_action varchar(100);

select @empid=d.eid from deleted d;
select @empname=d.ename from deleted d;
select @empsal=d.eSalary from deleted d;
set @audit_action='Deleted -- After Delete Trigger.';

insert into Emp_Audit
(Emp_ID,Emp_Name,Emp_Sal,Audit_Action,Audit_Timestamp)
values(@empid,@empname,@empsal,@audit_action,getdate());

PRINT 'AFTER DELETE TRIGGER fired.'
GO

আপনি যদি EmpInfo টেবিল থেকে কোন ডাটা ডিলিট করেন তাহলে এই ট্রিগার টি ফায়ার হবে এবং Emp_Audit টেবিল এ সেই ডাটা Insert হয়ে যাবে। চলুন দেখা যাকঃ

ট্রিগারটি ফায়ার হয়েছে। ট্রিগারটি ফায়ার হয়েছে। দেখে আসি আমাদের Emp_Audit টেবিল এ ডাটা Insert হল কিনা।

বোল্ড করা নিচের ৪ নং সিরিয়াল দেখুন।

এবার একটু চিন্তা করুন আমরা যখন EmpInfo টেবিল এ Insert করছি তখন একটি ট্রিগার ফায়ার করছে, আবার যখন Update করছি তখন একটি ট্রিগার ফায়ার করছে, আবার যখন Delete করছি তখন আরেকটি ট্রিগার ফায়ার করছে; কিন্তু এমন পরিস্থিতিতে আমরা কি করবো যখন আমরা EmpInfo টেবিল এ insert অথবা Update অথবা Delete অপারেশন চালাব কিন্তু কোন ট্রিগার ফায়ার করবে না।  সে জন্য দেখুনঃ

ধরুন আমি EmpInfo টেবিল এ ডাটা Insert করবো কিন্তু কোন ট্রিগার ফায়ার করুক তা চাই না। সেজন্য লিখুনঃ

<code lang="sql">

ALTER TABLE EmpInfo DISABLE TRIGGER trgAfterInsert

</code>

এবার EmpInfo টেবিল এ insert করুন। দেখবেন ট্রিগার ফায়ার করবেনা। কারন আপনি ট্রিগার টি ডিজেবল করে রেখেছেন। দেখুনঃ

<code lang="sql">

insert into EmpInfo values('aaaaa',15000)

</code>

প্রমান দেখার জন্য Emp_Audit টেবিল এ যেয়ে দেখুন কোন নতুন ডাটা Insert হয়নি। তারমানে ট্রিগারটি ডিজেবল হয়ে গিয়েছে। আবার যদি ট্রিগারটি এনাবল অর্থাৎ কার্যকারিতা ফিরিয়ে আনতে চান, তাহলে লিখুনঃ

<code lang="sql">

ALTER TABLE EmpInfo ENABLE TRIGGER trgAfterInsert

</code>

এভাবে একটি একটি করে প্রতিটি ট্রিগার কেই ডিজেবল, এনাবল করতে পারেন প্রয়োজন অনুসারে আবার সব ট্রিগার কে একসাথে ডিজেবল, এনাবল করতে পারেন, অর্থাৎ AFTER INSERT TRIGGER, AFTER UPDATE TRIGGER, AFTER DELETE TRIGGER একসাথে ডিজেবল করতে পারেন। কিভাবে? দেখুনঃ

<code lang="sql">

ALTER TABLE EmpInfo DISABLE TRIGGER ALL

</code>

আবার সব ট্রিগার কে একসাথে এনাবল করবেন কিভাবে? দেখুনঃ

<code lang="sql">

ALTER TABLE EmpInfo ENABLE TRIGGER ALL

</code>

আজ এ পর্যন্তই। ভাল থাকুন। চর্চা করে যান। সমস্যা হলে জানান, আর মন্তব্য করুন কেমন লাগছে? আল্লাহ হাফেজ।

Level 2

আমি Shafiq। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 12 বছর 5 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 18 টি টিউন ও 44 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 1 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।


টিউনস


আরও টিউনস


টিউনারের আরও টিউনস


টিউমেন্টস

Level 0

ভাই আর কনটিনিউ করবেন না। করেন তাহলে খুব উপকৃত হতাম।

Level 2

এস কিউ এল এর বেসিক মোটামুটি এ পর্যন্তই… তবে সামনে এস কিউ এল এর এডভান্স লেভেলের টিউন করার ইচ্ছা আছে… সাথে থাকুন… ধন্যবাদ।