Sie sind auf Seite 1von 11

7/22/2014

After Trigger, Instead of Trigger Example

After Trigger, Instead of Trigger Example


P o st e d By : S h aile ndra Ch auh an, 0 9 May 2 0 1 1
U pdat e d On : 2 4 Jun 2 0 1 4
V e rs i o n Su p p o rt : SQ L Se rv e r 2 0 0 5 ,2 0 0 8 ,2 0 1 2
Ke y wo rd s : DML Tri g g e rs Exa mp l e , Sq l Se rv e r Tri g g e rs Exa mp l e p d f, I n s t e a d o f Tri g g e r
Exa mp l e , A ft e r Tri g g e r Exa mp l e

riggers are special type of stored procedure that automatically execute when a DDL or DML statement
associated with the trigger is executed. DML Triggers are used to evaluate data after data manipulation

using DML statements. We have two types of DML triggers.

Types of DML Triggers

01. After Trigger (using FOR/AFTER CLAUSE)


This trigger fires after SQL Server completes the execution of the action successfully that fired it.
Example :If you insert record/row in a table then the trigger associated with the insert event on this table
will fire only after the row passes all the checks, such as primary key, rules, and constraints. If the
record/row insertion fails, SQL Server will not fire the After Trigger.

02. Instead of Trigger (using INSTEAD OF CLAUSE)


This trigger fires before SQL Server starts the execution of the action that fired it. This is much more
different from the AFTER trigger, which fires after the action that caused it to fire. We can have an INSTEAD
OF insert/update/delete trigger on a table that successfully executed but does not include the actual
insert/update/delet to the table.
Example :If you insert record/row in a table then the trigger associated with the insert event on this table
will fire before the row passes all the checks, such as primary key, rules, and constraints. If the record/row
insertion fails, SQL Server will fire the Instead of Trigger.

Example
1. -- First create table Employee_Demo
2. CREATE TABLE Employee_Demo
3. (
http://www.dotnet-tricks.com/Tutorial/sqlserver/OPUH170312-After-Trigger,-Instead-of-Trigger-Example.html

1/11

7/22/2014

After Trigger, Instead of Trigger Example

4. Emp_ID int identity,


5. Emp_Name varchar(55),
6. Emp_Sal decimal (10,2)
7. )
8. -- Now Insert records
9. Insert into Employee_Demo values ('Amit',1000);
10. Insert into Employee_Demo values ('Mohan',1200);
11. Insert into Employee_Demo values ('Avin',1100);
12. Insert into Employee_Demo values ('Manoj',1300);
13. Insert into Employee_Demo values ('Riyaz',1400);
14. --Now create table Employee_Demo_Audit for logging/backup purpose of table
Employee_Demo create table Employee_Demo_Audit
15. (
16. Emp_ID int,
17. Emp_Name varchar(55),
18. Emp_Sal decimal(10,2),
19. Audit_Action varchar(100),
20. Audit_Timestamp datetime
21. )
Now I am going to explain the use of After Trigger using Insert, Update, Delete statement with example

01. After Insert Trigger


1.

-- Create trigger on table Employee_Demo for Insert statement

2. CREATE TRIGGER trgAfterInsert on Employee_Demo


3. FOR INSERT
4. AS declare @empid int, @empname varchar(55), @empsal decimal(10,2),
@audit_action varchar(100);
5. select @empid=i.Emp_ID from inserted i;
6. select @empname=i.Emp_Name from inserted i;
7. select @empsal=i.Emp_Sal from inserted i;
8. set @audit_action='Inserted Record -- After Insert Trigger.'; insert into
Employee_Demo_Audit(Emp_ID,Emp_Name,Emp_Sal,Audit_Action,Audit_Timestamp)
9. values (@empid,@empname,@empsal,@audit_action,getdate());
10. PRINT 'AFTER INSERT trigger fired.'
11. --Output will be

http://www.dotnet-tricks.com/Tutorial/sqlserver/OPUH170312-After-Trigger,-Instead-of-Trigger-Example.html

2/11

7/22/2014

After Trigger, Instead of Trigger Example

1.

--Now try to insert data in Employee_Demo table

2. insert into Employee_Demo(Emp_Name,Emp_Sal)values ('Shailu',1000);


3. --Output will be

1.

--now select data from both the tables to see trigger action

2. select * from Employee_Demo


3. select * from Employee_Demo_Audit
4. --Output will be

Trigger have inserted the new record to Employee_Demo_Audit table for insert statement. In this way we
can trace a insert activity on a table using trigger.

02. After Update Trigger


1.

-- Create trigger on table Employee_Demo for Update statement

2. CREATE TRIGGER trgAfterUpdate ON dbo.Employee_Demo


3. FOR UPDATE
4. AS
5. declare @empid int, @empname varchar(55), @empsal decimal(10,2),
@audit_action varchar(100);
6. select @empid=i.Emp_ID from inserted i;
http://www.dotnet-tricks.com/Tutorial/sqlserver/OPUH170312-After-Trigger,-Instead-of-Trigger-Example.html

3/11

7/22/2014

After Trigger, Instead of Trigger Example

7. select @empname=i.Emp_Name from inserted i;


8. select @empsal=i.Emp_Sal from inserted i; if update(Emp_Name)
9.

set @audit_action='Update Record --- After Update Trigger.';

10. if update (Emp_Sal)


11.

set @audit_action='Update Record --- After Update Trigger.';

12. insert
intoEmployee_Demo_Audit(Emp_ID,Emp_Name,Emp_Sal,Audit_Action,Audit_Timestamp)
13. values (@empid,@empname,@empsal,@audit_action,getdate());
14. PRINT 'AFTER UPDATE trigger fired.'
15. --Output will be

1.

--Now try to upadte data in Employee_Demo table

2. update Employee_Demo set Emp_Name='Pawan' Where Emp_ID =6;


3. --Output will be

1.

--now select data from both the tables to see trigger action

2. select * from Employee_Demo


3. select * from Employee_Demo_Audit
4. --Output will be

Trigger have inserted the new record to Employee_Demo_Audit table for update statement. In this way we
http://www.dotnet-tricks.com/Tutorial/sqlserver/OPUH170312-After-Trigger,-Instead-of-Trigger-Example.html

4/11

7/22/2014

After Trigger, Instead of Trigger Example

can trace a update activity on a table using trigger.

03. After Delete Trigger


1.

-- Create trigger on table Employee_Demo for Delete statement

2. CREATE TRIGGER trgAfterDelete ON dbo.Employee_Demo


3. FOR DELETE
4. AS
5. declare @empid int, @empname varchar(55), @empsal decimal(10,2),
@audit_action varchar(100); select @empid=d.Emp_ID FROM deleted d;
6. select @empname=d.Emp_Name from deleted d;
7. select @empsal=d.Emp_Sal from deleted d;
8. select @audit_action='Deleted -- After Delete Trigger.';
9. insert into Employee_Demo_Audit
(Emp_ID,Emp_Name,Emp_Sal,Audit_Action,Audit_Timestamp)
10. values (@empid,@empname,@empsal,@audit_action,getdate());
11. PRINT 'AFTER DELETE TRIGGER fired.'
12. --Output will be

1.

--Now try to delete data in Employee_Demo table

2. DELETE FROM Employee_Demo where emp_id = 5


3. --Output will be

1.

--now select data from both the tables to see trigger action

2. select * from Employee_Demo


3. select * from Employee_Demo_Audit
4. --Output will be

http://www.dotnet-tricks.com/Tutorial/sqlserver/OPUH170312-After-Trigger,-Instead-of-Trigger-Example.html

5/11

7/22/2014

After Trigger, Instead of Trigger Example

Trigger have inserted the new record to Employee_Demo_Audit table for delete statement. In this way we
can trace a delete activity on a table using trigger.
Now I am going to explain the use of Instead of Trigger using Insert, Update, Delete statement with example

01. Instead of Insert Trigger


1.

-- Create trigger on table Employee_Demo for Insert statement

2. CREATE TRIGGER trgInsteadOfInsert ON dbo.Employee_Demo


3. INSTEAD OF Insert
4. AS
5. declare @emp_id int, @emp_name varchar(55), @emp_sal decimal(10,2),
@audit_action varchar(100);
6. select @emp_id=i.Emp_ID from inserted i;
7. select @emp_name=i.Emp_Name from inserted i;
8. select @emp_sal=i.Emp_Sal from inserted i;
9. SET @audit_action='Inserted Record -- Instead Of Insert Trigger.';
10. BEGIN
11.

BEGIN TRAN

12.

SET NOCOUNT ON

13.

if(@emp_sal>=1000)

14.

begin

15.

RAISERROR('Cannot Insert where salary < 1000',16,1); ROLLBACK; end

16.

else begin Insert into Employee_Demo (Emp_Name,Emp_Sal) values


(@emp_name,@emp_sal); Insert into
Employee_Demo_Audit(Emp_ID,Emp_Name,Emp_Sal,Audit_Action,Audit_Timestamp)

http://www.dotnet-tricks.com/Tutorial/sqlserver/OPUH170312-After-Trigger,-Instead-of-Trigger-Example.html

6/11

7/22/2014

After Trigger, Instead of Trigger Example

values(@@identity,@emp_name,@emp_sal,@audit_action,getdate());
17.

COMMIT;

18.

PRINT 'Record Inserted -- Instead Of Insert Trigger.'

19. END
20. --Output will be

1.

--Now try to insert data in Employee_Demo table

2. insert into Employee_Demo values ('Shailu',1300)


3. insert into Employee_Demo values ('Shailu',900) -- It will raise error since
we are checking salary >=1000
4. --Outputs will be

1.

--now select data from both the tables to see trigger action

2. select * from Employee_Demo


3. select * from Employee_Demo_Audit
4. --Output will be

Trigger have inserted the new record to Employee_Demo_Audit table for insert statement. In this way we
can apply business validation on the data to be inserted using Instead of trigger and can also trace a insert
activity on a table.

02. Instead of Update Trigger


1.

-- Create trigger on table Employee_Demo for Update statement

http://www.dotnet-tricks.com/Tutorial/sqlserver/OPUH170312-After-Trigger,-Instead-of-Trigger-Example.html

7/11

7/22/2014

After Trigger, Instead of Trigger Example

2. CREATE TRIGGER trgInsteadOfUpdate ON dbo.Employee_Demo


3. INSTEAD OF Update
4. AS
5. declare @emp_id int, @emp_name varchar(55), @emp_sal decimal(10,2),
@audit_action varchar(100);
6. select @emp_id=i.Emp_ID from inserted i;
7. select @emp_name=i.Emp_Name from inserted i;
8. select @emp_sal=i.Emp_Sal from inserted i;
9. BEGIN
10.

BEGIN TRAN

11. if(@emp_sal>=1000)
12.

begin

13.

RAISERROR('Cannot Insert where salary < 1000',16,1); ROLLBACK; end

14.

else begin

15.

insert into
Employee_Demo_Audit(Emp_ID,Emp_Name,Emp_Sal,Audit_Action,Audit_Timestamp)
values(@emp_id,@emp_name,@emp_sal,@audit_action,getdate());

16.

COMMIT;

17.

PRINT 'Record Updated -- Instead Of Update Trigger.'; END

18. --Output will be

1.

--Now try to upadte data in Employee_Demo table

2. update Employee_Demo set Emp_Sal = '1400' where emp_id = 6


3. update Employee_Demo set Emp_Sal = '900' where emp_id = 6
4. --Output will be

1.

--now select data from both the tables to see trigger action

2. select * from Employee_Demo


3. select * from Employee_Demo_Audit
4. --Output will be

http://www.dotnet-tricks.com/Tutorial/sqlserver/OPUH170312-After-Trigger,-Instead-of-Trigger-Example.html

8/11

7/22/2014

After Trigger, Instead of Trigger Example

Trigger have inserted the updated record to Employee_Demo_Audit table for update statement. In this way
we can apply business validation on the data to be updated using Instead of trigger and can also trace a
update activity on a table.

03. Instead of Delete Trigger


1.

-- Create trigger on table Employee_Demo for Delete statement

2. CREATE TRIGGER trgAfterDelete ON dbo.Employee_Demo


3. INSTEAD OF DELETE
4. AS
5. declare @empid int, @empname varchar(55), @empsal decimal(10,2),
@audit_action varchar(100); select @empid=d.Emp_ID FROM deleted d;
6. select @empname=d.Emp_Name from deleted d;
7. select @empsal=d.Emp_Sal from deleted d;
8. BEGIN TRAN if(@empsal>1200) begin
9.

RAISERROR('Cannot delete where salary > 1200',16,1);

10.

ROLLBACK;

11.

end

12.

else begin

13.

delete from Employee_Demo where Emp_ID=@empid;

14.

COMMIT;

15.

insert into
Employee_Demo_Audit(Emp_ID,Emp_Name,Emp_Sal,Audit_Action,Audit_Timestamp)

16.

values(@empid,@empname,@empsal,'Deleted -- Instead Of Delete


Trigger.',getdate());

17.

PRINT 'Record Deleted -- Instead Of Delete Trigger.' end END

18. --Output will be


http://www.dotnet-tricks.com/Tutorial/sqlserver/OPUH170312-After-Trigger,-Instead-of-Trigger-Example.html

9/11

7/22/2014

After Trigger, Instead of Trigger Example

1.

--Now try to delete data in Employee_Demo table

2. DELETE FROM Employee_Demo where emp_id = 1


3. DELETE FROM Employee_Demo where emp_id = 3
4. --Output will be

1.

--now select data from both the tables to see trigger action

2. select * from Employee_Demo


3. select * from Employee_Demo_Audit
4. --Output will be

Trigger have inserted the deleted record to Employee_Demo_Audit table for delete statement. In this way
we can apply business validation on the data to be deleted using Instead of trigger and can also trace a
delete activity on a table.

What do you think?


In this article I try to explain the After Trigger and Instead of Trigger with example. I hope after reading this
http://www.dotnet-tricks.com/Tutorial/sqlserver/OPUH170312-After-Trigger,-Instead-of-Trigger-Example.html

10/11

7/22/2014

After Trigger, Instead of Trigger Example

article your sql triggers concepts will be strong. I would like to have feedback from my blog readers. Please post
your feedback, question, or comments about this article.
Print Article

Share this article with your friends!


in S h a r e 1

About the Author

Shailendra Chauhan works as Sr. Software Engineer at reputed MNC and has more than 5 years of hand
over Microsoft .NET technologies. He is a .NET Consultant and is the founder & chief editor of www.dotnettricks.com and www.dotnetinterviewtricks.com blogs. He is an author of books ASP.NET MVC Interview
Questions and Answers & LINQ Interview Questions and Answers.
He loves to work with web applications and mobile apps using Microsoft technology including ASP.NET,
MVC, C#, SQL Server, WCF, Web API, Entity Framework,Cloud Computing, Windows Azure, jQuery, jQuery
Mobile, Knockout.js, Angular.js and many more web technologies. More...

http://www.dotnet-tricks.com/Tutorial/sqlserver/OPUH170312-After-Trigger,-Instead-of-Trigger-Example.html

11/11

Das könnte Ihnen auch gefallen