先附上示例代碼:
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操作的時候觸發