Trigger در SQL Server

یکشنبه 15 فروردین 1395

این مقاله در مورد trigger ها در SQL server و روش کار با آنها می باشد که در قالب چندین مثال و کدهای مربوطه توضیح داده شده است.

 Trigger در SQL Server

Trigger ها نوع خاصی از برنامه ی ذخیره شده می باشند که می توانند برای عمل روی فعالیت یک جدول مانند INSERT, UPDATE,  یا DELETE نوشته شوند.دو نوع trigger داریم :

1.تریگری که بعد از انجام کار باید اجرا شود. (After Trigger)

2.تریگری که به جای انجام کاری باید اجرا شود.(Instead Of Trigger )

After Trigger  ها :

After Trigger ها خودشان در سه دسته طبقه بندی میشوند:

After Insert.1 : زمانی فعال میشود که عملیات Insert در جدول اجرا شود.

After Update.2 : زمانی فعال میشود که عملیات update در جدول اجرا میشود.

After Delete.3 : زمانی فعال میشود که یک رکورد از جدول حذف شود.

حال میخواهیم برای درک بهتر از trigger، آنها را در یک مثال بررس کنیم. برای این کار نیاز داریم که دو جدول ایجاد کنیم.

1.	CREATE TABLE [dbo].[Blogs](    
2.	 [blog_id] [int] IDENTITY(1,1) NOT NULL,    
3.	 [blog_title] [varchar](max) NOT NULL,    
4.	 [blog_date] [date] NOT NULL,    
5.	 [blog_description] [varchar](max) NOT NULL,    
6.	 [blog_tags] [varchar](max) NOT NULL,    
7.	 [status] [bit] NULL,    
8.	 [blog_url] [varchar](max) NULL,    
9.	 CONSTRAINT [PK_Blogs] PRIMARY KEY )    
10.	    
11.	GO    
12.	CREATE TABLE [dbo].[Blog_tag](    
13.	 [Blog_id] [int] NOT NULL,    
14.	 [Tag_id] [int] NOT NULL    
15.	) ON [PRIMARY]    
16.	    
17.	GO    
18.	    
19.	    
20.	CREATE TABLE [dbo].[Tags](    
21.	 [Tags_id] [int] IDENTITY(1,1) NOT NULL,    
22.	 [Tag_name] [varchar](50) NOT NULL,    
23.	 CONSTRAINT [PK_Tags] PRIMARY KEY     
24.	)     
25.	    
26.	GO   

حال میخواهیم که در جدول  tags   با استفاده ازtrigger یک رکورد اضافه کنیم.

1.	INSERT INTO [dbo].[Tags]    
2.	         ([Tag_name])    
3.	   VALUES    
4.	         ('Sql Server')    
5.	GO    

بعد از اینکه رکورد جدید در جدول tags درج شد میتوانیم یک trigger در جدول blogs ایجاد میکنیم که به صورت خودکار رکورد مورد نظرمان را در جدول Blog_Tag اضافه خواهد کرد.

1.	Create trigger [dbo].[trgAfterInsert] on [dbo].[Blogs]    
2.	After Insert    
3.	As    
4.	declare @blog_id int;    
5.	declare @tag_id int;    
6.	declare @tagname varchar(50);    
7.	select @blog_id=i.blog_id from inserted i;    
8.	select @tagname=i.blog_tags from inserted i;    
9.	select  @tag_id=Tags_id from Tags where Tag_name=@tagname;    
10.	    
11.	Insert into Blog_tag(Blog_id,Tag_id) values(@blog_id,@tag_id);   

حالا اگر یک رکورد در جدول blogs درج کنیم  این رکورد به صورت خودکار در جدول   Blog_tagدرج خواهد شد.

1.	INSERT INTO [dbo].[Blogs]    
2.	       ([blog_title]    
3.	       ,[blog_date]    
4.	       ,[blog_description]    
5.	       ,[blog_tags]    
6.	       ,[status]    
7.	       ,[blog_url])    
8.	 VALUES    
9.	       ('Test'    
10.	       ,'2016-02-06'    
11.	       ,'Test Description'    
12.	       ,'Sql Server'    
13.	       ,0    
14.	       ,'test url')    
15.	GO   

به طور مشابه ما میتوانیم از trigger بعد از update و بعد از delete کردن هم استفاده کنیم. نکته : برای trigger مربوط به update/delete یک تفاوت کوچک وجود دارد که syntaxآن در زیر آمده است.

1.	Create trigger [dbo].[trgAfterUpdate] on [dbo].[Blogs]    
2.	After Update    
3.	As    
4.	declare @blog_id int;    
5.	declare @tagname varchar(50);    
6.	declare @tag_id int;    
7.	select @blog_id=i.blog_id from inserted i;    
8.	select @tagname=i.blog_tags from inserted i;    
9.	select  @tag_id=Tags_id from Tags where Tag_name=@tagname;    
10.	print @tagname;    
11.	Update Blog_tag set Tag_id=@tag_id where  Blog_id=@blog_id; 

به طور مشابه برای delete هم از کد زیر استفاده میکنیم.

1.	Create trigger [dbo].[trgAfterDelete] on [dbo].[Blogs]    
2.	After Delete    
3.	As    
4.	declare @blog_id int;    
5.	    
6.	select @blog_id=i.blog_id from deleted i;    
7.	    
8.	delete from Blog_tag where  Blog_id=@blog_id; 

 ما در اینجا به جای inserted i از deleted i استفاده کرده ایم.

Instead of Trigger ها :

این نوع از trigger ها درزمانی مورد استفاده قرار میگیرند که ما بخواهیم شرایط مشخصی را  قبل از درج بررسی کنیم که به سه دسته تقسیم میشوند.

1. Instead of Insert: این نوع ، زمانی فعال میشوند که یک رکورد  در جدول درج کرده ایم و میخواهیم یک query مشخص به جای insert اجرا شود.

2. Instead of Update: این نوع زمانی فعال میشود که یک رکورد در جدول درج کرده ایم و میخواهیم یک query مشخص به جای updateاجرا شود.

3. Instead of delete: این نوع از trigger ها زمانی فعال میشوند که ما یک رکورد در جدول درج کرده ایم و میخواهیم یک query مشخص به جای updateاجرا شود. حال میخواهیم به شما نشان دهیم که چگونه یک trigger از نوع Instead of delete ایجاد کنیم.

1.	Create trigger[dbo].[trgInsteadDelete] on[dbo].[Blogs]  
2.	instead of Delete  
3.	As  
4.	declare @blog_id int;  
5.	declare @tag_id int;  
6.	select @blog_id = i.blog_id from deleted i;  
7.	select @tag_id = Tag_id from Blog_tag where Blog_id = @blog_id  
8.	begin  
9.	if (@tag_id is null) begin  
10.	rollback;  
11.	end  
12.	else begin  
13.	delete from Blog_tag where Blog_id = @blog_id;  
14.	end  
15.	end  

با روشی مشابه میتوانیم trigger از نوع instead of insert و instead of update ایجاد میکنیم.

آموزش نصب sql server 2017

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید