【SQL Server】-- 一觸即發之觸發器

ZeroWM發表於2015-02-03


一、什麼是觸發器?


   觸發器(Trigger),顧名思義,一觸即發。


 這裡的觸發指:呼叫某事件(如insert,delete,update)的時候執行觸發器的操作,就像連鎖反應一樣

 作用:保證資料完整性,加強資料的完整性約束和業務規則。說白了也就是保持資料一致性,不能同一欄位在不同的資料表裡面資料不一致。


二、觸發器的優缺點?


好處:

  度娘如是說:在約束所支援的功能無法滿足應用程式的功能要求時,觸發器就極為有用。

  解讀:約束此處應該指的是資料庫完整性約束。約束,觸發器,索引等都是為了保證資料的正確性和一致性而存在的。

   常見約束:唯一性(Unique)和主鍵約束(Primary key)、外來鍵約束(Foreign key)、檢查約束(Check)、空值約束(NOT Null)、預設值約束(Defult)。

  比如之前我們做過的《機房收費系統》,進行充值後,不僅僅要插入充值記錄到充值表裡面,還要更新學生的卡餘額,通過上面的這些約束,無法做到同時更新兩個表的資料,這就可以用到觸發器。這樣可以避免資料更新不同步造成的資料錯誤,不一致現象。


缺點:

  物極必反,凡事存在兩面性。濫用觸發器同樣會給我們帶來麻煩。比如影響資料庫的結構,增加維護的複雜程度。


三、觸發器常見的應用-級聯刪除


     學過《資料庫系統原理》的同學都應該對主外來鍵關係有所瞭解。如果一條SQL語句存在外來鍵,想要刪除該語句,就必須要先刪除外來鍵關聯的表中對應的語句。比如牛腩裡面的類別表(category)裡面包含新聞表(news)的外來鍵,新聞表(news)又包含評論表(comment)的外來鍵,要想刪除的時候要先根據新聞類別,找到該類別下的新聞,再找到新聞下的評論,先刪除評論,然後是新聞,再是新聞類別,才能進行刪除。


程式碼例項:

<span style="font-family:SimSun;"><span style="font-family:Microsoft YaHei;"><span style="font-family:SimSun;font-size:18px;">USE [newssystem]
GO
/****** Object:  Trigger [dbo].[trigCategoryDelete]    Script Date: 02/02/2015 23:22:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		王美
-- Create date: 2015年2月2日
-- Description:刪除類別觸發器
-- =============================================
ALTER TRIGGER [dbo].[trigCategoryDelete]
   ON  [dbo].[category] 
   instead of  DELETE
AS 
BEGIN
	declare @caId int--定義id
	select @caId=id  from deleted  --從刪除的裡面取出id
	
	--刪除評論
	delete comment where newsId in(select newsId from news where caId=@caid ) 
	
	--刪除新聞
	delete news where  caId =@caId --先刪除類別下面的所有新聞
	--刪除類別
	delete category where id =@caId --刪除該類別

END
</span></span></span>


四、總結

  機遇之於人就像觸發器的事件,前提是要時刻完善自身的觸發器,這樣才不會與機遇失之交臂。




相關文章