Trigger در SQL Server
یکشنبه 15 فروردین 1395این مقاله در مورد 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
- 21k بازدید
- 13 تشکر