亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL Server:觸發器實例詳解

2024-08-31 01:04:32
字體:
來源:轉載
供稿:網友

1. 概述

sql/8264.html">觸發器是一種特殊的存儲過程,它不能被顯式地調用,而是在往表中插入記錄﹑更新記錄或者刪除記錄時被自動地激活。 所以觸發器可以用來實現對表實施復雜的完整性約束。

2. 觸發器的分類

SQL Server2000提供了兩種觸發器:“Instead of” 和“After” 觸發器。

一個表或視圖的每一個修改動作(Insert、Update和Delete)都可以有一個“Instead of” 觸發器,一個表的每個修改動作都可以有多個“After”觸發器。

2.1 “Instead of”觸發器

  • “Instead of”觸發器在執行真正“插入”之前被執行。除表之外,“Instead of” 觸發器也可以用于視圖,用來擴展視圖可以支持的更新操作。
  • “Instead of”觸發器會替代所要執行的SQL語句,言下之意就是所要執行SQL并不會“真正執行”
alter trigger trigger_學生_Deleteon 學生instead of Deleteasbegin  select 學號, 姓名 from deletedenddelete from 學生 where 學號 = 4 

上例中定義了“trigger學生_Delete”觸發器,該觸發器從“delete”表中打印出所要刪除的學生.在執行“delete”操作后,會發現“學號 = 4”的學生并未被刪除, 原因在于“trigger學生Delete”替代了所要執行的“delete from 學生 where 學號 = 4”語句,而在“trigger學生_Delete”中并未真正刪除學生。

2.2 “After”觸發器

  • “After”觸發器在Insert、Update或Deleted語句執行之后被觸發。“After”觸發器只能用于表。
  • “After”觸發器主要用于表在修改后(insert、update或delete操作之后),來修改其他表

3. Inserted和Deleted表

SQL Server為每個觸發器都創建了兩個專用表:Inserted表和Deleted表。

  • 這兩個表由系統來維護,它們存在于內存中而不是在數據庫中,可以理解為一個虛擬的表。
  • 這兩個表的結構總是與被該觸發器作用的表的結構相同。
  • 觸發器執行完成后,與該觸發器相關的這兩個表也被刪除。
  • Deleted表存放由于執行Delete或Update語句而要從表中刪除的所有行。
  • Inserted表存放由于執行Insert或Update語句而要向表中插入的所有行。

 

對表的操作 Inserted邏輯表 Deleted邏輯表
增加記錄(insert) 存放增加的記錄
刪除記錄(delete) 存放被刪除的記錄
修改記錄(update) 存放更新后的記錄 存放更新前的記錄

 

4. 觸發器的執行過程

  • 如果一個Insert﹑update或者delete語句違反了約束,那么這條SQL語句就沒有執行成功,因此“After”觸發器也不會被激活。
  • “Instead of” 觸發器可以取代激發它的操作來執行。它在Inserted表和Deleted表剛剛建立,其它任何操作還沒有發生時被執行。因為“Instead of” 觸發器在約束之前執行,所以它可以對約束進行一些預處理。

5. 創建觸發器

create trigger trigger_nameon {table_name|view_name}{After|Instead of} {insert|update|delete}as 相應T-SQL語句

6. 修改觸發器:

alter trigger trigger_nameon {table_name|view_name}{After|Instead of} {insert|update|delete}as 相應T-SQL語句

7. 刪除觸發器:

drop trigger trigger_name

8. 查看數據庫中已有觸發器:

8.1 查看數據庫中所有觸發器

select * from sysobjects where xtype='TR'

8.2 查看單個觸發器

exec sp_helptext '觸發器名'

9. “Instead of”相關示例:

兩張表:學生(學號 int, 姓名 varchar)、借書記錄(學號 int, 圖書編號 int)

實現功能:在刪除學生表時,如果該學生仍有借書記錄(未還)則不能刪除

alter trigger trigger_學生_Deleteon 學生instead of Deleteasbegin  if not exists(select * from 借書記錄, deleted where 借書記錄.學號 = deleted.學號)    delete from 學生 where 學生.學號 in (select 學號 from deleted)end

10. “After”觸發器

10.1 在“訂單”表中建立觸發器,當向“訂單”表中插入一條訂單記錄時,檢查“商品”表的貨品狀態“狀態”是否為1(正在整理),則不能往“訂單”表加入該訂單。

create trigger trigger_訂單_inserton 訂單after insertas  if (select 狀態 from 商品, inserted where 商品.pid = inserted.pid)=1  begin    print 'the goods is being processed'    print 'the order cannot be committed'    rollback transaction --回滾,避免加入  end
  • 該示例中“pid”為商品編碼
  • 該示例的if判斷嚴格來講是不準確的,因為“訂單”表如果每次插入一條記錄,該判斷沒有問題;如果一次插入多條記錄,則“select 狀態”返回的是多行。

10.2 在“訂單”表建立一個插入觸發器,在添加一條訂單時,減少“商品”表相應的貨品記錄中的庫存。

create trigger trigger_訂單_insert2on 訂單after insertas  update 商品 set 數量 = 數量 - inserted.數量  from 商品, inserted  where 商品.pid = inserted.pid

10.3 在“商品”表建立刪除觸發器,實現“商品”表和“訂單”表的級聯刪除。

create trigger goodsdelete trigger_商品_deleteon 商品after deleteas  delete from 訂單 where 訂單.pid in (select pid from deleted)

10.4 在“訂單”表建立一個更新觸發器,監視“訂單”表的“訂單日期”列,使其不能被“update”.

create trigger trigger_訂單_updateon 訂單after updateas  if update(訂單日期)  begin    raiserror('訂單日期不能手動修改',10,1)    rollback transaction  end

10.5 在“訂單”表建立一個插入觸發器,保證向“訂單”表插入的貨品必須要在“商品”表中一定存在。

create trigger trigger_訂單_insert3on 訂單after insertas  if (select count(*) from 商品, inserted where 商品.pid = inserted.pid)=0  begin    print '商品不存在'    rollback transaction  end

10.6 “訂單”表建立一個插入觸發器,保證向“訂單”表插入的貨品信息要在“訂單日志”表中添加

alter trigger trigger_訂單_inserton 訂單for insertasinsert into 訂單日志 select inserted.Id, inserted.pid,inserted.數量 from inserted 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲经典中文字幕| 九九热这里只有在线精品视| 亚洲第一精品夜夜躁人人爽| 日韩欧美在线观看| 久久99热精品这里久久精品| 国产精品∨欧美精品v日韩精品| 性色av香蕉一区二区| 欧美性xxxx极品高清hd直播| 精品二区三区线观看| 国产精品美女免费| 国产成人精品电影| 国产精品天天狠天天看| 欧美做受高潮电影o| 2019亚洲男人天堂| 黑人巨大精品欧美一区二区免费| 欧美第一页在线| 亚洲一区二区三区xxx视频| 97成人精品区在线播放| 91av视频在线播放| 日韩在线中文视频| 亚洲国模精品私拍| 久久久久久国产三级电影| 欧美性色视频在线| 日韩电影中文字幕在线| 国产91精品黑色丝袜高跟鞋| 欧美综合一区第一页| 92版电视剧仙鹤神针在线观看| 久久久久久久久久久人体| 亚洲女人天堂视频| 欧美精品福利在线| 国产有码在线一区二区视频| 亚洲福利视频免费观看| 国产精品18久久久久久首页狼| 中文字幕亚洲欧美一区二区三区| 久久精品国产欧美亚洲人人爽| 91国内产香蕉| 日韩中文视频免费在线观看| 欧美电影免费观看网站| 日韩在线视频观看正片免费网站| 日本韩国欧美精品大片卡二| 国产成人精品日本亚洲| 伊人成人开心激情综合网| 日韩精品极品视频免费观看| 亚洲韩国青草视频| 亚洲网在线观看| 91精品国产亚洲| 国产精品扒开腿做爽爽爽的视频| 国产精品免费在线免费| 欧美大码xxxx| 欧美性一区二区三区| 亚洲娇小xxxx欧美娇小| 亚洲欧美在线一区| 日韩中文字幕免费看| 日韩第一页在线| 富二代精品短视频| 欧美成aaa人片免费看| 亚洲第一福利网站| 亚洲欧美中文字幕| 91精品国产综合久久香蕉922| 国产成人高潮免费观看精品| 欧美一区二粉嫩精品国产一线天| 色综合91久久精品中文字幕| 日本欧美爱爱爱| 国产香蕉97碰碰久久人人| 欧美午夜性色大片在线观看| 国产精品久久av| 国产精品www色诱视频| 国产精品一区电影| 国产一区二区三区在线视频| 在线观看日韩欧美| 亚洲精品自拍偷拍| 国产亚洲精品高潮| 日韩精品免费看| 欧美精品一区在线播放| 777午夜精品福利在线观看| 色偷偷亚洲男人天堂| 久久久久久网址| 97精品一区二区视频在线观看| 日韩免费观看高清| 国产精品稀缺呦系列在线| 日韩视频免费在线观看| 国内精品美女av在线播放| 久久国产精品亚洲| 精品亚洲男同gayvideo网站| 欧美日韩免费区域视频在线观看| www.日韩视频| 久久久伊人日本| 欧美激情网站在线观看| 亚洲aaaaaa| 国产精品色婷婷视频| 姬川优奈aav一区二区| 91在线精品视频| 欧美老女人bb| 久久综合九色九九| 精品日韩美女的视频高清| 国产精品美女视频网站| 亚洲图中文字幕| 国产精品稀缺呦系列在线| 国产不卡视频在线| 欧美成人精品影院| 欧美日韩久久久久| 色综合久久中文字幕综合网小说| 国产精品成人av在线| 8090理伦午夜在线电影| 欧美裸体xxxx极品少妇| 亚洲无限av看| 亚洲石原莉奈一区二区在线观看| 久久成人国产精品| 欧美黑人又粗大| 亚洲第一精品自拍| 日韩在线观看高清| 日韩福利视频在线观看| 国产精品欧美日韩| 亚洲性av在线| 欧美日韩亚洲系列| 亚洲一级一级97网| 最近2019中文字幕一页二页| 久久精品视频99| 欧美性jizz18性欧美| 亚洲美女精品久久| 2021国产精品视频| 欧美午夜xxx| 欧美日韩色婷婷| 国产精品日韩在线观看| 亚洲午夜未满十八勿入免费观看全集| 1769国产精品| 97在线观看视频| 成人免费看黄网站| 亚洲第一男人av| 亚洲福利在线观看| 538国产精品一区二区在线| 在线国产精品视频| 亚洲精品国产拍免费91在线| 国产精品久久色| 日韩**中文字幕毛片| 国产成人精品免费视频| 日本乱人伦a精品| 在线午夜精品自拍| 亚洲成人精品视频在线观看| 欧美一区亚洲一区| 国产精品九九久久久久久久| 日韩有码在线播放| 国产在线精品播放| 日韩精品一二三四区| 久久精品视频va| 欧美视频13p| 欧美激情免费看| 九色精品美女在线| 久久精品国产99国产精品澳门| 精品中文字幕乱| 色哟哟网站入口亚洲精品| 91精品国产99久久久久久| 亚洲国产日韩一区| 亚洲国产日韩欧美在线动漫| 日韩高清a**址| 精品无人区乱码1区2区3区在线| 欧美尺度大的性做爰视频| 欧美视频在线视频| 国语自产精品视频在线看抢先版图片| 久久九九有精品国产23| 欧美日韩中文在线观看| 亚洲国产欧美一区二区丝袜黑人| 亚洲第一av在线| 亚洲激情视频网|