SQLSever觸發器建立

先附上示例代碼:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE TRIGGER  trigUserDelete
   ON  userTable 
   instead of delete
AS 
BEGIN
	declare @num varchar(20)
    	select @num=phoneNum from deleted
	delete customRoute where userId=@num
	delete userLocat where phoneNum=@num
	delete userTable where phoneNum=@num
END
GO

什麼是觸發器?在我的理解中:它不是人爲啓動的,而是系統自動啓動的,就像事件一樣,當觸發條件滿足時,就會執行觸發器裏面的內容。

在上述實例代碼中,在表userTable中定義了一個名爲trigUserDelete的刪除(delete)觸發器。

在我的數據庫中有 customRoute,userLocat,userTable這三個表,前兩表存在字段與userTable表中的phoneNum存在外鍵關係。現在要根據phoneNum來刪除用戶表(userTable)的內容。

userLocat(a,phoneNum):a爲主鍵,phoneNum爲外鍵(來自於userTable.phoneNum) 

 userTable(phoneNum,c,d) :phoneNum爲主鍵 

 如果我把字段phoneNum的外鍵屬性去掉,對編程沒什麼影響。 如果不去,userLocat中的phoneNum要麼爲空,要麼是在userTable的phoneNum中存在的值。有外鍵的時候,數據庫會自動幫你檢查userLocat的phoneNum是否在UserTable的中存在。如果不存在,則操作失敗。

所以,如果直接刪除用戶表中的用戶,如果其他表的外鍵在該表的值中不存在,是會刪除失敗的。所以我們要刪除用戶表之前,需要刪除其他表外鍵與之關聯的數據。

類似的還有很多,例如現在有一個數據庫,數據庫中有兩個表: 

博客表:(博客id,博客內容)

評論表:(評論id,評論內容,所屬博客id); 其中所屬博客id來自於 博客id。

  要想刪除博客,在這之前要先刪除所屬這博客的評論  。


上述代碼用的是INSTEAD OF觸發器,和ALTER觸發器不同的是,ALTER觸發器在(delete,insert,update)原來操作後執行。而INSTEAD OF 是代替原來操作,也就是說不執行原來的SQL語句。 

觸發器還用到了臨時表,常用臨時表有兩個,一個是inserted ,還有一個是deleted。當用戶做增刪改操作時,會把將要插入的數據放入inserted中,同理會把將要刪除的數據放在deleted中。

在一個實例代碼:有這樣的一個功能,用戶能夠上傳自己位置,不過要把原來的位置刪除。換言之,就是更新位置信息的操作。(注:userLocat(phoneNum,Latitude,Longitude)).

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE TRIGGER  trigUserLocatInsert
   ON  userLocat
   instead of insert
AS 
BEGIN
	declare @phonenum varchar(20)
declare @latitude float
declare @longitude float
select @phonenum=phoneNum,@latitude=Latitude,@longitude=Longitude from inserted
delete userLocat where phoneNum=@phonenum
insert into userLocat (Latitude,Longitude,phoneNum) values(@latitude,@longitude,@phonenum)
END
GO

當然用update也可以實現。上述觸發器在userLocat中定義,當進行insert操作的時候觸發

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章