What is a Trigger
A trigger is a special kind of a store procedure that executes in response to certain action on the table like insertion, deletion or updation of data. It is a database object which is bound to a table and is executed automatically. You can’t explicitly invoke triggers. The only way to do this is by performing the required action no the table that they are assigned to.
Types Of Triggers
There are three action query types that you use in SQL which are INSERT, UPDATE and DELETE. So, there are three types of triggers and hybrids that come from mixing and matching the events and timings that fire them.
Basically, triggers are classified into two main types:-
(i) After Triggers (For Triggers)
(ii) Instead Of Triggers
(i) After Triggers
These triggers run after an insert, update or delete on a table. They are not supported for views.
AFTER TRIGGERS can be classified further into three types as:
(a) AFTER INSERT Trigger.
(b) AFTER UPDATE Trigger.
(c) AFTER DELETE Trigger.
(ii) Instead Of Triggers
These can be used as an interceptor for anything that anyonr tried to do on our table or view. If you define an Instead Of trigger on a table for the Delete operation, they try to delete rows, and they will not actually get deleted (unless you issue another delete instruction from within the trigger)
INSTEAD OF TRIGGERS can be classified further into three types as:-
(a) INSTEAD OF INSERT Trigger.
(b) INSTEAD OF UPDATE Trigger.
(c) INSTEAD OF DELETE Trigger.
Examples
CREATE TABLE [dbo].[tblEmp](
[EmpId] [int] NULL,
[Ename] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[Age] [int] NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[tblEmp_dup](
[EmpId] [int] IDENTITY(1,1) NOT NULL,
[Ename] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[Age] [int] NULL,
[Action] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
CONSTRAINT [PK_tblEmp_dup] PRIMARY KEY CLUSTERED
(
[EmpId] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
After Triggers:
1)For Insert
Create trigger [dbo].[trginsertemp] on [dbo].[tblEmp] After insert
As
Declare @EmpId int;
Declare @Empname varchar(50);
Declare @Age int;
Select @EmpId=EmpId from inserted
Select @Empname=Ename from inserted
Select @Age=Age from inserted
insert into tblEmp_dup values(@Empname,@Age,'insert')
2)For Update
Create trigger [dbo].[trgupdateEmp] on [dbo].[tblEmp] for update
As
Declare @Enameold as varchar(50);
Declare @Ageold as int;
Declare @Enamenew as varchar(50);
Declare @Agenew as int;
Select @Enameold=Ename,@Ageold=Age from deleted
Select @Enamenew=Ename,@Agenew=Age from inserted
insert into tblEmp_dup values(@Enameold,@Ageold,'before update')
insert into tblEmp_dup values(@Enamenew,@Agenew,'After update')
3)For Delete
Create trigger [dbo].[trgdeleteEmp] on [dbo].[tblEmp] for delete
As
Declare @Ename as varchar(50);
Declare @Age as int;
Select @Ename=Ename,@Age=Age from deleted
insert into tblEmp_dup values(@Ename,@Age,'Deleted Record’)
)
Instead of Triggers for Delete:
ALTER trigger [dbo].[trgdeleteEmp] on [dbo].[tblEmp] INSTEAD OF DELETE
As
Declare @Ename as varchar(50);
Declare @Age as int;
if(@Age>25)
Begin
RAISERROR('Cannot delete where age > 25',16,1)
Rollback;
End
else
Begin
insert into tblEmp_dup values(@Ename,@Age,'Deleted Record')
Commit;
End
A trigger is a special kind of a store procedure that executes in response to certain action on the table like insertion, deletion or updation of data. It is a database object which is bound to a table and is executed automatically. You can’t explicitly invoke triggers. The only way to do this is by performing the required action no the table that they are assigned to.
Types Of Triggers
There are three action query types that you use in SQL which are INSERT, UPDATE and DELETE. So, there are three types of triggers and hybrids that come from mixing and matching the events and timings that fire them.
Basically, triggers are classified into two main types:-
(i) After Triggers (For Triggers)
(ii) Instead Of Triggers
(i) After Triggers
These triggers run after an insert, update or delete on a table. They are not supported for views.
AFTER TRIGGERS can be classified further into three types as:
(a) AFTER INSERT Trigger.
(b) AFTER UPDATE Trigger.
(c) AFTER DELETE Trigger.
(ii) Instead Of Triggers
These can be used as an interceptor for anything that anyonr tried to do on our table or view. If you define an Instead Of trigger on a table for the Delete operation, they try to delete rows, and they will not actually get deleted (unless you issue another delete instruction from within the trigger)
INSTEAD OF TRIGGERS can be classified further into three types as:-
(a) INSTEAD OF INSERT Trigger.
(b) INSTEAD OF UPDATE Trigger.
(c) INSTEAD OF DELETE Trigger.
Examples
CREATE TABLE [dbo].[tblEmp](
[EmpId] [int] NULL,
[Ename] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[Age] [int] NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[tblEmp_dup](
[EmpId] [int] IDENTITY(1,1) NOT NULL,
[Ename] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[Age] [int] NULL,
[Action] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
CONSTRAINT [PK_tblEmp_dup] PRIMARY KEY CLUSTERED
(
[EmpId] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
After Triggers:
1)For Insert
Create trigger [dbo].[trginsertemp] on [dbo].[tblEmp] After insert
As
Declare @EmpId int;
Declare @Empname varchar(50);
Declare @Age int;
Select @EmpId=EmpId from inserted
Select @Empname=Ename from inserted
Select @Age=Age from inserted
insert into tblEmp_dup values(@Empname,@Age,'insert')
2)For Update
Create trigger [dbo].[trgupdateEmp] on [dbo].[tblEmp] for update
As
Declare @Enameold as varchar(50);
Declare @Ageold as int;
Declare @Enamenew as varchar(50);
Declare @Agenew as int;
Select @Enameold=Ename,@Ageold=Age from deleted
Select @Enamenew=Ename,@Agenew=Age from inserted
insert into tblEmp_dup values(@Enameold,@Ageold,'before update')
insert into tblEmp_dup values(@Enamenew,@Agenew,'After update')
3)For Delete
Create trigger [dbo].[trgdeleteEmp] on [dbo].[tblEmp] for delete
As
Declare @Ename as varchar(50);
Declare @Age as int;
Select @Ename=Ename,@Age=Age from deleted
insert into tblEmp_dup values(@Ename,@Age,'Deleted Record’)
)
Instead of Triggers for Delete:
ALTER trigger [dbo].[trgdeleteEmp] on [dbo].[tblEmp] INSTEAD OF DELETE
As
Declare @Ename as varchar(50);
Declare @Age as int;
if(@Age>25)
Begin
RAISERROR('Cannot delete where age > 25',16,1)
Rollback;
End
else
Begin
insert into tblEmp_dup values(@Ename,@Age,'Deleted Record')
Commit;
End
Comments