《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > SQL Server數據庫中DML觸發器的教學探討
SQL Server數據庫中DML觸發器的教學探討
2014年微型機與應用第21期
徐照興
江西服裝學院 服裝商貿分院,江西 南昌 330201
摘要: 針對初學者容易混淆AFTER觸發器與INSTEAD OF觸發器的問題,首先用通俗的語言對觸發器進行了概述,接著闡述了觸發器的工作原理,然后結合實例分析了AFTER觸發器與INSTEAD OF觸發器的主要區別與應用,最后總結了觸發器應用的注意事項。
Abstract:
Key words :

  摘 要: 針對初學者容易混淆AFTER觸發器與INSTEAD OF觸發器的問題,首先用通俗的語言對觸發器進行了概述,接著闡述了觸發器的工作原理,然后結合實例分析了AFTER觸發器與INSTEAD OF觸發器的主要區別與應用,最后總結了觸發器應用的注意事項。

  關鍵詞: SQL Server;數據庫;觸發器;AFTER;INSTEAD OF

0 引言

  觸發器是SQL Server數據庫教學中的重要內容之一,觸發器的教學重點是DML觸發器的創建、管理與應用,而DML觸發器的難點是AFTER觸發器與INSTEAD OF觸發器的區別與應用。初學者往往對此比較容易混淆,不知道何時選用AFTER觸發器、何時選用INSTEAD OF觸發器。為此,本文對SQL Server數據庫中DML觸發器的教學內容進行優化探討,以幫助初學者準確快速地掌握DML觸發器的精髓。

1 觸發器概述

  觸發器是一種特殊的存儲過程,它是針對表或視圖定義的數據庫對象,它不能被顯式地調用,而是當對定義了觸發器的表或視圖進行Create、Alter或Drop操作時,或者對定義了觸發器的表或視圖進行Insert、Update或Delete操作時,觸發器才被自動執行。在觸發器中主要是定義通過主鍵、外鍵、默認值或CHECK約束等無法實現的復雜的參照完整性和數據完整性的業務邏輯。當表或視圖被刪除時,其上定義的觸發器也一同被刪除[1]。使用觸發器主要有以下幾點優點:

 ?。?)級聯修改數據庫中的所有相關表。

 ?。?)撤銷或回滾違反引用完整性的操作,防止非法數據修改。

 ?。?)強制執行比外鍵參照完整性、CHECK約束更為復雜的業務邏輯。

 ?。?)查找在數據修改前后表狀態之間的差別,并根據差別分別采取相應的措施。

  (5)觸發器是自動執行的,不需要管理員手動維護數據庫的數據完整性[2]。

  需要注意以下幾點:

 ?。?)只有表的所有者才可以在表上創建或刪除觸發器,且這種權限不能轉授。

  (2)可以在觸發器中引用臨時表,但不能在臨時表上創建觸發器。

 ?。?)在執行修改語句的過程中,觸發器的執行是執行修改語句的一部分,所以如果觸發器執行不成功則整個事務回滾[3]。

  在SQL Server2008中,觸發器主要有DML(Data Manipulation Language)觸發器、DDL(Data Definition Language)觸發器和登錄觸發器。其中DML觸發器又可以分為6種類型:AFTER-INSERT觸發器、AFTER-UPDATE觸發器、AFTER-DELETE觸發器與INSTEAD OF-INSERT觸發器、INSTEAD OF-UPDATE觸發器、INSTEAD OF-DELETE觸發器[1]。

2 觸發器工作原理

  觸發器被觸發時,系統將在內存中自動創建兩個特殊的臨時表,分別是INSERTED表和DELETED表。INSERTED表用于存儲INSERT和UPDATE語句所影響的記錄行的副本。DELETED表用于存儲DELETE和UPDATE語句所影響的記錄行的副本。INSERTED表和DELETED表只是存儲于內存的邏輯表,而不是存儲在數據庫中的物理表,但其結構與觸發器所關聯的表結構一致。

  這兩個表由系統進行創建和管理,用戶不允許直接讀取和修改其內容,但可以在觸發器中訪問它們的數據。當觸發器執行完畢后,這兩個表由系統自動刪除[4]。

  當通過插入(INSERT)語句引發觸發器時,新的記錄的副本會添加到臨時表INSERTED表中。當通過刪除(DELETE)語句引發觸發器時,被刪除的記錄會添加到臨時表DELETED表中。當通過更新(UPDATE)語句引發觸發器時,首先刪除原有的舊記錄,并將該被刪除的記錄添加到臨時表DELETED表中,然后添加更新后的新記錄,并將更新后的新記錄添加到臨時表INSERTED表中。在觸發器內部可以引用INSERTED表和DELETED表中相關數據實現數據的操縱。

  創建觸發器的基本語法結構如下:

  CREATE TRIGGER [<所有者名稱>.]<觸發器名> /*指明

  觸發器的名稱*/

  ON { <表名> | <視圖名> } /*指定觸發器依賴的基表或視

  圖*/

  [ WITH ENCRYPTION ] /*指定對觸發器的源碼進行加密*/

  {

  { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [,][DELETE]}

  AS

  [BEGIN]

  <T-SQL語句>[ ...n ] /*指定觸發器執行的SQL語句,

  是觸發器的核心*/

  [END]

  }

  }

  說明:上面基本語法結構中,INSERT、UPDATE、DELETE選項用來指定觸發器的事件類型,三個選項至少要指定一個,允許任意次序組合這三個選項。FOR與AFTER關鍵字含義完全相同,與INSTEAD OF一起組成指定觸發的方式,AFTER為后觸發,INSTEAD OF為替代觸發。

3 AFTER觸發器與INSTEAD OF觸發器的區別

  AFTER觸發器也稱后觸發,是只有執行了某一個操作(如INSERT、UPDATE、DELETE等)之后,觸發器才被觸發。也即只有引發觸發器的操作語句已經完成,并通過各類約束驗證后才會去執行觸發器的語句;如果引發觸發器的操作語句有錯誤或違反了約束而導致執行失敗,觸發器是不會執行的。

  INSTEAD OF觸發器也稱替代觸發,該類型觸發器并不會執行引發觸發器的操作語句(如INSERT、UPDATE、DELETE等T-SQL語句),而只是去執行觸發器里面的T-SQL語句。即由觸發器里面的T-SQL語句替代引發觸發器的T-SQL語句的執行。

001.jpg

  假如在一個StudentManager數據庫中有tbStudent表及tbDepartment表,兩個表的結構如表1、表2所示(由于只是為了說明問題,在此對表結構做了簡化處理)。

  現假定tbStudent表中有如下3條記錄:1001,張三,女,1;1002,李四,男,2;1003,王五,男,3。tbDepartment表中有如下4條記錄:1,計算機系,小張;2,藝術系,小李;3,服裝工程系,小朱;4,物理系,老譚。

  例:假如要從tbDepartment表中刪除某系部信息,如果該系部下存在學生信息,則不允許刪除,要求利用觸發器來實現。

  現編寫替代觸發器delete_DepInfo_instead,代碼如下:

  USE StudentManager

  GO

  CREATE TRIGGER delete_DepInfo_instead ON tbDepartment

  INSTEAD OF DELETE -- 替代觸發

  AS

  -- 從表deleted中獲取刪除記錄的部門編號

  DECLARE @depid varchar(20)

  DECLARE @stuname varchar(20)

  SELECT @depid = DepID FROM deleted

  -- 判斷要刪除的部門編號是否存在學生信息

  SELECT @stuname= StuName FROM tbStudent WHERE DepID=@depid

  IF @stuname IS NOT NULL

  PRINT '指定系部存在學生,請先刪除或修改學生信息!' -- 提示錯誤信息

  ELSE

  DELETE FROM tbDepartment WHERE DepId=@depid

  GO

  編寫引發該觸發器T-SQL語句代碼如下:

  USE StudentManager

  GO

  DELETE FROM tbDepartment WHERE DepId=1

  GO

  結果分析:由于tbStudent表中存在系部編號為1的學生信息,所以結果為彈出“指定系部存在學生,請先刪除或修改學生信息!”。但是把引發觸發器的SQL語句修改為“DELETE FROM Department WHERE DepId=4”,由于在學生表tbStudent中不存在系部編號為4的學生信息,所以會執行觸發器本身所含的“DELETE FROM tbDepartment WHERE DepId=@depid”SQL語句刪除系部編號為4的系部信息,而不是通過引發觸發器的SQL語句“DELETE FROM tbDepartment WHERE DepId=4”刪除系部編號為4的系部信息。換句話說假如上面觸發器delete_DepInfo_instead中T-SQL語句中沒有“ELSE DELETE FROM tbDepartment WHERE DepId=@depid”語句,即使引發該觸發器T-SQL語句要刪除系部編號為4的記錄(DELETE FROM tbDepartment WHERE DepId=4),也不能完成刪除操作。

  但是如果把上面觸發器(delete_DepInfo_instead)修改為后觸發的觸發器(delete_DepInfo_after):

  USE StudentManager

  GO

  CREATE TRIGGER delete_DepInfo_after ON tbDepartment

  after DELETE -- 后觸發

  AS

  -- 從表deleted中獲取刪除記錄的部門編號

  DECLARE @depid varchar(20)

  DECLARE @stuname varchar(20)

  SELECT @depid = DepID FROM deleted

  -- 判斷要刪除的部門編號是否存在學生信息

  SELECT @stuname= StuName FROM tbStudent WHERE DepID=@depid

  IF @stuname IS NOT NULL

  PRINT '指定系部存在學生,請先刪除或修改學生信息!' -- 提示錯誤信息

  ELSE

  DELETE FROM tbDepartment WHERE DepId=@depid

  GO

  編寫引發該觸發器T-SQL語句代碼如下:

  USE StudentManager

  GO

  DELETE FROM tbDepartment WHERE DepId=4

  GO

  結果是不論觸發器T-SQL語句中有沒有“ELSE DELETE FROM tbDepartment WHERE DepId=@depid”語句,系部編號為4的記錄都將刪除,因為此時會先執行引發觸發器的T-SQL語句(DELETE FROM tbDepartment WHERE DepId=4),從而把系部編號為4的記錄刪除。

  此外,AFTER觸發器只能定義在表上,INSTEAD OF觸發器可以定義在表上,也可以定義在視圖上。一個表上可以定義多個AFTER觸發器,但是只能在一個表或視圖上定義一個INSTEAD OF觸發器。

4 觸發器應用注意事項

  觸發器功能強大,可輕松地實現許多復雜的功能。觸發器主要用來實現比較復雜的數據完整性、一致性。例如監督某一列數據的變化范圍,并在超出規定范圍以后,對兩個以上的表進行修改。但當使用約束、規則、默認值就可以實現數據完整性時,應優先使用前三種措施,因為濫用觸發器會造成數據庫及應用程序維護困難。對表執行修改操作時,約束優先于觸發器。如果約束和觸發器發生沖突,觸發器將被屏蔽,不再執行。一般來說,只要不影響數據的修改,AFTER觸發器比INSTEAD OF觸發器效率更高,因此,AFTER觸發器和INSTEAD OF觸發器都能實現某功能需求時,優先選用AFTER觸發器。

5 結束語

  DML觸發器是用得最廣泛的觸發器,在SQL SERVER教學中占有重要的地位。教學中的難點往往是ALTER觸發器與INSTEAD OF觸發器的區別與應用。本文通過通俗的語言對觸發器進行了概述,闡述了觸發器被觸發時兩個臨時邏輯表INSERTED表和DEKETED表的作用,結合實例分析了AFTER觸發器與INSTEAD OF觸發器的主要區別與應用。AFTER觸發器為后觸發器,也即AFTER觸發器會先執行引發觸發器中的T-SQL語句,后再執行觸發器本身的T-SQL語句,而INSTEAD OF觸發器為替代觸發器,即通過執行觸發器中的T-SQL語句來替代執行引發觸發器的T-SQL語句,也即INSTEAD OF觸發器中引發觸發器的T-SQL語句不會執行。

  參考文獻

  [1] 高曉黎,韓曉霞. SQL Server2008案例教程[M]. 北京:清華大學出版社, 2010.

  [2] 邱李華,李曉黎,任華,等. SQL Server 2008數據庫應用教程(第2版)[M]. 北京:人民郵電出版社, 2012.

  [3] 仝春靈,沈祥玖. 數據庫原理與應用[M]. 北京:中國水利水電出版社, 2006.

  [4] 程志梅,邱霞明,王曉燕. SQL Server2000數據庫中觸發器的妙用[J]. 計算機應用與軟件, 2009(3):188-189.


此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          亚洲国产精彩中文乱码av在线播放| 黄色成人av在线| 亚洲一区二区三区午夜| 久久影院午夜论| 国产精品私人影院| 亚洲电影专区| 欧美日韩精品综合| 激情综合色综合久久| 欧美一区二粉嫩精品国产一线天| 亚洲欧美成人在线| 亚洲福利免费| 国产喷白浆一区二区三区| 鲁鲁狠狠狠7777一区二区| 亚洲一区欧美一区| 久久久久国产精品人| 国内精品一区二区三区| 国产日韩欧美视频在线| 国产精品欧美久久| 久久久999国产| 久久综合网络一区二区| 久久综合久久综合九色| 欧美日韩dvd在线观看| 欧美日本二区| 国产一级精品aaaaa看| 免费毛片一区二区三区久久久| 国产日本欧美一区二区三区| 欧美国产一区二区在线观看| 美日韩精品免费观看视频| 99re6热在线精品视频播放速度| 欧美亚日韩国产aⅴ精品中极品| 欧美成人精品在线观看| 欧美性jizz18性欧美| 一本色道久久综合狠狠躁的推荐| 国产欧美一区二区三区视频| 国产精品一香蕉国产线看观看| 国产精品yjizz| 国外视频精品毛片| 久久综合99re88久久爱| 国产主播一区| 黄色日韩精品| 欧美少妇一区二区| 久久婷婷综合激情| 亚洲精品1区| 欧美一区二区三区播放老司机| 狠狠爱www人成狠狠爱综合网| 老色鬼久久亚洲一区二区| 欧美国产亚洲精品久久久8v| 在线观看日韩一区| 亚洲精品一区二区三区福利| 欧美视频网站| 中日韩美女免费视频网址在线观看| 亚洲特黄一级片| 老鸭窝毛片一区二区三区| 欧美一区二区三区在线视频| 欧美精品一区二区三区在线看午夜| 亚洲区第一页| 亚洲国产精品久久久久久女王| 国产麻豆精品久久一二三| 欧美日韩国产色视频| 久久久噜噜噜久噜久久| 亚洲天堂成人在线观看| 欧美三区在线| 亚洲欧洲日韩在线| 欧美久久婷婷综合色| 激情婷婷久久| 欧美激情一区二区三区在线| 久久精品色图| 久久国产精品毛片| 久久综合久久综合九色| 欧美成人久久| 亚洲日本欧美在线| 亚洲欧美国产另类| 亚洲国产日韩欧美在线99| 亚洲美女少妇无套啪啪呻吟| 麻豆成人综合网| 亚洲免费电影在线观看| 欧美综合激情网| 欧美精品在线观看| 久久五月天婷婷| 亚洲看片免费| 久久免费的精品国产v∧| 99视频在线观看一区三区| 欧美一区二区三区四区高清| 麻豆成人综合网| 国产精品日韩欧美综合| 国产精品激情电影| 国产综合香蕉五月婷在线| 亚洲天堂久久| 香蕉久久夜色精品国产使用方法| 亚洲精品久久7777| 影音先锋久久精品| 欧美 日韩 国产精品免费观看| 亚洲免费高清| 蜜臀久久99精品久久久画质超高清| 亚洲图片你懂的| 欧美日本不卡高清| 国产女主播一区| 欧美大片在线观看一区| 国产农村妇女精品一区二区| 欧美精品久久99久久在免费线| 亚洲国产经典视频| 国产精品一级久久久| 亚洲欧美偷拍卡通变态| 亚洲欧美三级在线| 一区二区三区日韩| 国产乱码精品一区二区三| 欧美日一区二区在线观看| 亚洲高清av在线| 欧美日韩亚洲一区二区三区| 最新中文字幕一区二区三区| 国语自产精品视频在线看8查询8| 亚洲伊人一本大道中文字幕| 在线综合亚洲欧美在线视频| 国产精品成人av性教育| 欧美日韩一区二| 亚洲国产成人一区| 久久久蜜臀国产一区二区| 国产精品成人免费视频| 亚洲精品综合精品自拍| 亚洲影院一区| 欧美xart系列在线观看| 激情久久久久久久久久久久久久久久| 99精品热视频| 国产精品专区一| 中文一区在线| 亚洲激情成人网| 亚洲精品在线观| 亚洲欧美日韩系列| 亚洲一区久久久| 亚洲精品乱码久久久久久蜜桃91| 久久成人免费电影| 亚洲一区三区电影在线观看| 欧美亚洲尤物久久| 欧美日韩日本网| 亚洲视频 欧洲视频| 亚洲男女自偷自拍图片另类| 国产欧美在线看| 久久亚洲精品一区二区| 国产视频不卡| 欧美成年人在线观看| 久久久综合香蕉尹人综合网| 国产自产v一区二区三区c| 亚洲欧美资源在线| 国产精品日韩在线播放| 亚洲一区二区三区精品在线| 国内精品伊人久久久久av一坑| 久久综合狠狠综合久久综青草| 欧美在线观看www| 午夜精品福利电影| 久久激情中文| 日韩亚洲精品电影| 激情欧美一区二区三区在线观看| 国产一区二区中文字幕免费看| 欧美国产日韩一区二区在线观看| 亚洲美女av在线播放| 99精品国产99久久久久久福利| 欧美va天堂va视频va在线| 国产精品v日韩精品| 免费亚洲一区二区| 一本色道久久综合亚洲精品不卡| 精品粉嫩aⅴ一区二区三区四区| 亚洲毛片在线观看.| 亚洲欧洲另类国产综合| 欧美国产日韩a欧美在线观看| 亚洲欧美日韩国产中文| 国产在线观看精品一区二区三区| 99精品视频免费观看| 久久久久久久性| 亚洲女同同性videoxma| 国产精品无码专区在线观看| 欧美黄网免费在线观看| 国产精品国产三级国产aⅴ浪潮| 在线成人亚洲| 亚洲国产一区二区三区在线播| 亚洲电影欧美电影有声小说| 精品va天堂亚洲国产| 欧美日韩一区二区三区在线观看免| 亚洲天堂免费在线观看视频| 国产一区二区高清视频| 国产视频一区三区| 亚洲经典视频在线观看| 激情欧美国产欧美| 亚洲国产婷婷综合在线精品| 久久精品国产91精品亚洲| 亚洲自拍高清| 欧美日本免费一区二区三区| 欧美与欧洲交xxxx免费观看| 美女黄毛**国产精品啪啪| 嫩草伊人久久精品少妇av杨幂| 亚洲福利国产精品| 欧美一区二区啪啪| 欧美日韩不卡| 欧美一区二区三区四区在线观看地址| 亚洲国产欧美一区二区三区同亚洲| 欧美国产日韩一区二区| 欧美成人中文| 国产一区二区三区直播精品电影| 免费av成人在线| 永久91嫩草亚洲精品人人| 国产日产精品一区二区三区四区的观看方式| 蜜月aⅴ免费一区二区三区| 久久久激情视频| 国产欧美精品一区二区三区介绍| 久久se精品一区二区| 欧美波霸影院| 亚洲欧美在线播放| 鲁鲁狠狠狠7777一区二区| 欧美黑人国产人伦爽爽爽| 夜夜爽99久久国产综合精品女不卡| 欧美日韩三级| 免费黄网站欧美| 亚洲一级黄色| 亚洲午夜久久久久久久久电影网| 国产日韩精品一区二区浪潮av| 国产综合av| 亚洲日本成人在线观看| 欧美一级片久久久久久久| 在线观看日韩av先锋影音电影院| 久久久美女艺术照精彩视频福利播放| 欧美一区二区网站| 亚洲精品影视| 欧美在线综合视频| 欧美freesex8一10精品| 国产一区二区欧美| 欧美日韩国产精品成人| 久久不射网站| 国产精品一区二区久久| 亚洲福利视频专区| 久久综合久久综合这里只有精品| 国内精品伊人久久久久av一坑| 欧美视频你懂的| 欧美精品日韩三级| 亚洲精品国产精品乱码不99| 女女同性女同一区二区三区91| 亚洲精选一区二区| 欧美日韩在线免费观看| 香港久久久电影| 欧美在线综合| 久久久久久自在自线| 国产亚洲人成网站在线观看| 欧美日韩国产精品自在自线| 一区免费观看| 亚洲网在线观看| 久久久久久夜| 一区二区黄色| 欧美韩国日本一区| 国产伦一区二区三区色一情| 亚洲已满18点击进入久久| 久久精品亚洲精品国产欧美kt∨| 亚洲成人资源| 精品99视频| 国产欧美日韩精品丝袜高跟鞋| 久久在线观看视频| 亚洲黄色一区二区三区| 国产视频一区免费看| 在线亚洲精品福利网址导航| 亚洲精品一区二区三区蜜桃久| 久久久精品一区二区三区| 欧美精品免费观看二区| 亚洲欧美清纯在线制服| 国产精品久久久久久一区二区三区| 香蕉av福利精品导航| 另类欧美日韩国产在线| 国产欧美日韩免费看aⅴ视频| 久久亚洲一区二区| 国产精品日韩久久久久| 久久久91精品国产一区二区精品| 亚洲午夜精品视频| 国产乱码精品1区2区3区| 国产欧美一区二区三区久久人妖| 欧美成人一区二区三区| 一二三四社区欧美黄| 欧美在线观看一区二区三区| 国产一区深夜福利| 欧美三级第一页| 亚洲电影免费在线观看| 久久久免费精品| 免费在线看成人av| 久久视频免费观看| 欧美成年视频| 亚洲乱码视频| 中国亚洲黄色| 国产精品麻豆成人av电影艾秋| 免费欧美高清视频| 亚洲色图制服丝袜| 亚洲日本国产| 美女视频黄免费的久久| 欧美在线播放一区| 亚洲国产精品专区久久| 国产精品一区二区女厕厕| 宅男噜噜噜66国产日韩在线观看| 国内成人精品视频| 在线观看欧美日韩国产| 国产精品乱子久久久久| 欧美成人情趣视频| 亚洲肉体裸体xxxx137| 国产区精品在线观看| 国产精品一区免费观看| 国产精品丝袜91| 亚洲欧美另类国产| 欧美午夜精品久久久久久久| 久久成人18免费观看| 国产精品www网站| 国模精品娜娜一二三区| 国产毛片精品视频| 国产精品爱久久久久久久| 久久偷看各类wc女厕嘘嘘偷窃| 国产精品青草久久久久福利99| 欧美一区永久视频免费观看| 亚洲欧美在线磁力| 欧美吻胸吃奶大尺度电影| 一区二区三区波多野结衣在线观看| 欧美主播一区二区三区| 日韩视频在线播放| 免费毛片一区二区三区久久久| 亚洲精品日韩精品| 国产日本欧美视频| 欧美人成免费网站| 国产精品视频一二三| 国产精品高潮久久| 久久国产精品亚洲va麻豆| 亚洲一区免费网站| 欧美午夜精品久久久久久孕妇| 国产日韩专区| 性感少妇一区| 在线播放日韩欧美| 在线亚洲精品福利网址导航| 国产精品欧美日韩一区二区|