SQLSever触发器建立
先附上示例代碼:
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: <Description,,> -- ============================================= CREATE TRIGGER trigUserDeleteON userTable instead of delete AS BEGINdeclare @num varchar(20) select @num=phoneNum from deleteddelete customRoute where userId=@numdelete userLocat where phoneNum=@numdelete 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 trigUserLocatInsertON userLocatinstead of insert AS BEGINdeclare @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操作的時候觸發 與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的SQLSever触发器建立的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android studio百度地图的使
- 下一篇: SQLSever 存储过程创建