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

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

深入淺析SQL Server 觸發器

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

觸發器是一種特殊的存儲過程,觸發器是通過事件觸發可以自動調用執行的。在sql2005中,觸發器可以分為dml觸發器和ddl觸發器。下面通過本篇文章給大家深入淺析sqlserver觸發器,需要的朋友可以參考下

觸發器是一種特殊類型的存儲過程,它不同于之前的我們介紹的存儲過程。觸發器主要是通過事件進行觸發被自動調用執行的。而存儲過程可以通過存儲過程的名稱被調用。

Ø 什么是觸發器

觸發器對表進行插入、更新、刪除的時候會自動執行的特殊存儲過程。觸發器一般用在check約束更加復雜的約束上面。觸發器和普通的存儲過程的區別是:觸發器是當對某一個表進行操作。諸如:update、insert、delete這些操作的時候,系統會自動調用執行該表上對應的觸發器。SQL Server 2005中觸發器可以分為兩類:DML觸發器和DDL觸發器,其中DDL觸發器它們會影響多種數據定義語言語句而激發,這些語句有create、alter、drop語句。

DML觸發器分為:

1、 after觸發器(之后觸發)

a、 insert觸發器

b、 update觸發器

c、 delete觸發器

2、 instead of 觸發器 (之前觸發)

其中after觸發器要求只有執行某一操作insert、update、delete之后觸發器才被觸發,且只能定義在表上。而instead of觸發器表示并不執行其定義的操作(insert、update、delete)而僅是執行觸發器本身。既可以在表上定義instead of觸發器,也可以在視圖上定義。

觸發器有兩個特殊的表:插入表(instered表)和刪除表(deleted表)。這兩張是邏輯表也是虛表。有系統在內存中創建者兩張表,不會存儲在數據庫中。而且兩張表的都是只讀的,只能讀取數據而不能修改數據。這兩張表的結果總是與被改觸發器應用的表的結構相同。當觸發器完成工作后,這兩張表就會被刪除。Inserted表的數據是插入或是修改后的數據,而deleted表的數據是更新前的或是刪除的數據。

Update數據的時候就是先刪除表記錄,然后增加一條記錄。這樣在inserted和deleted表就都有update后的數據記錄了。注意的是:觸發器本身就是一個事務,所以在觸發器里面可以對修改數據進行一些特殊的檢查。如果不滿足可以利用事務回滾,撤銷操作。

Ø 創建觸發器

語法

 

 
  1. create trigger tgr_name 
  2. on table_name 
  3. with encrypion –加密觸發器 
  4. for update... 
  5. as 
  6. Transact-SQL 
  7. # 創建insert類型觸發器 
  8. --創建insert插入類型觸發器 
  9. if (object_id('tgr_classes_insert''tr') is not null
  10. drop trigger tgr_classes_insert 
  11. go 
  12. create trigger tgr_classes_insert 
  13. on classes 
  14. for insert --插入觸發 
  15. as 
  16. --定義變量 
  17. declare @id int, @name varchar(20), @temp int
  18. --在inserted表中查詢已經插入記錄信息 
  19. select @id = id, @name = name from inserted; 
  20. set @name = @name + convert(varchar, @id); 
  21. set @temp = @id / 2;  
  22. insert into student values(@name, 18 + @id, @temp, @id); 
  23. print '添加學生成功!'
  24. go 
  25. --插入數據 
  26. insert into classes values('5班', getDate()); 
  27. --查詢數據 
  28. select * from classes; 
  29. select * from student order by id; 
  30. insert觸發器,會在inserted表中添加一條剛插入的記錄。 
  31. # 創建delete類型觸發器 
  32. --delete刪除類型觸發器 
  33. if (object_id('tgr_classes_delete''TR') is not null
  34. drop trigger tgr_classes_delete 
  35. go 
  36. create trigger tgr_classes_delete 
  37. on classes 
  38. for delete --刪除觸發 
  39. as 
  40. print '備份數據中……';  
  41. if (object_id('classesBackup''U') is not null
  42. --存在classesBackup,直接插入數據 
  43. insert into classesBackup select name, createDate from deleted; 
  44. else 
  45. --不存在classesBackup創建再插入 
  46. select * into classesBackup from deleted; 
  47. print '備份數據成功!'
  48. go 
  49. -- 
  50. --不顯示影響行數 
  51. --set nocount on; 
  52. delete classes where name = '5班'
  53. --查詢數據 
  54. select * from classes; 
  55. select * from classesBackup; 
  56. delete觸發器會在刪除數據的時候,將剛才刪除的數據保存在deleted表中。 
  57. # 創建update類型觸發器 
  58. --update更新類型觸發器 
  59. if (object_id('tgr_classes_update''TR') is not null
  60. drop trigger tgr_classes_update 
  61. go 
  62. create trigger tgr_classes_update 
  63. on classes 
  64. for update 
  65. as 
  66. declare @oldName varchar(20), @newName varchar(20); 
  67. --更新前的數據 
  68. select @oldName = name from deleted; 
  69. if (exists (select * from student where name like '%'+ @oldName + '%')) 
  70. begin 
  71. --更新后的數據 
  72. select @newName = name from inserted; 
  73. update student set name = replace(name, @oldName, @newName) where name like '%'+ @oldName + '%'
  74. print '級聯修改數據成功!'
  75. end 
  76. else 
  77. print '無需修改student表!'
  78. go 
  79. --查詢數據 
  80. select * from student order by id; 
  81. select * from classes; 
  82. update classes set name = '五班' where name = '5班'
  83. update觸發器會在更新數據后,將更新前的數據保存在deleted表中,更新后的數據保存在inserted表中。 
  84. # update更新列級觸發器 
  85. if (object_id('tgr_classes_update_column''TR') is not null
  86. drop trigger tgr_classes_update_column 
  87. go 
  88. create trigger tgr_classes_update_column 
  89. on classes 
  90. for update 
  91. as 
  92. --列級觸發器:是否更新了班級創建時間 
  93. if (update(createDate)) 
  94. begin 
  95. raisError('系統提示:班級創建時間不能修改!', 16, 11); 
  96. rollback tran; 
  97. end 
  98. go 
  99. --測試 
  100. select * from student order by id; 
  101. select * from classes; 
  102. update classes set createDate = getDate() where id = 3; 
  103. update classes set name = '四班' where id = 7; 
  104. 更新列級觸發器可以用update是否判斷更新列記錄; 
  105. # instead of類型觸發器 
  106. instead of觸發器表示并不執行其定義的操作(insert、update、delete)而僅是執行觸發器本身的內容。 
  107. 創建語法 
  108. create trigger tgr_name 
  109. on table_name 
  110. with encryption 
  111. instead of update... 
  112. as 
  113. T-SQL 
  114. # 創建instead of觸發器 
  115. if (object_id('tgr_classes_inteadOf''TR') is not null
  116. drop trigger tgr_classes_inteadOf 
  117. go 
  118. create trigger tgr_classes_inteadOf 
  119. on classes 
  120. instead of delete/*, update, insert*/ 
  121. as 
  122. declare @id int, @name varchar(20); 
  123. --查詢被刪除的信息,病賦值 
  124. select @id = id, @name = name from deleted; 
  125. print 'id: ' + convert(varchar, @id) + ', name: ' + @name; 
  126. --先刪除student的信息 
  127. delete student where cid = @id; 
  128. --再刪除classes的信息 
  129. delete classes where id = @id; 
  130. print '刪除[ id: ' + convert(varchar, @id) + ', name: ' + @name + ' ] 的信息成功!'
  131. go 
  132. --test 
  133. select * from student order by id; 
  134. select * from classes; 
  135. delete classes where id = 7; 
  136. # 顯示自定義消息raiserror 
  137. if (object_id('tgr_message''TR') is not null
  138. drop trigger tgr_message 
  139. go 
  140. create trigger tgr_message 
  141. on student 
  142. after insert, update 
  143. as raisError('tgr_message觸發器被觸發', 16, 10); 
  144. go 
  145. --test 
  146. insert into student values('lily', 22, 1, 7); 
  147. update student set sex = 0 where name = 'lucy'
  148. select * from student order by id; 
  149. # 修改觸發器 
  150. alter trigger tgr_message 
  151. on student 
  152. after delete 
  153. as raisError('tgr_message觸發器被觸發', 16, 10); 
  154. go 
  155. --test 
  156. delete from student where name = 'lucy'
  157. # 啟用、禁用觸發器 
  158. --禁用觸發器 
  159. disable trigger tgr_message on student; 
  160. --啟用觸發器 
  161. enable trigger tgr_message on student; 
  162. # 查詢創建的觸發器信息 
  163. --查詢已存在的觸發器 
  164. select * from sys.triggers; 
  165. select * from sys.objects where type = 'TR'
  166. --查看觸發器觸發事件 
  167. select te.* from sys.trigger_events te join sys.triggers t 
  168. on t.object_id = te.object_id 
  169. where t.parent_class = 0 and t.name = 'tgr_valid_data'
  170. --查看創建觸發器語句 
  171. exec sp_helptext 'tgr_message'
  172. # 示例,驗證插入數據 
  173. if ((object_id('tgr_valid_data''TR') is not null)) 
  174. drop trigger tgr_valid_data 
  175. go 
  176. create trigger tgr_valid_data 
  177. on student 
  178. after insert 
  179. as 
  180. declare @age int
  181. @name varchar(20); 
  182. select @name = s.name, @age = s.age from inserted s; 
  183. if (@age < 18) 
  184. begin 
  185. raisError('插入新數據的age有問題', 16, 1); 
  186. rollback tran; 
  187. end 
  188. go 
  189. --test 
  190. insert into student values('forest', 2, 0, 7); 
  191. insert into student values('forest', 22, 0, 7); 
  192. select * from student order by id; 
  193. # 示例,操作日志 
  194. if (object_id('log''U') is not null
  195. drop table log 
  196. go 
  197. create table log( 
  198. id int identity(1, 1) primary key, 
  199. action varchar(20), 
  200. createDate datetime default getDate() 
  201. go 
  202. if (exists (select * from sys.objects where name = 'tgr_student_log')) 
  203. drop trigger tgr_student_log 
  204. go 
  205. create trigger tgr_student_log 
  206. on student 
  207. after insert, update, delete 
  208. as 
  209. if ((exists (select 1 from inserted)) and (exists (select 1 from deleted))) 
  210. begin 
  211. insert into log(action) values('updated'); 
  212. end 
  213. else if (exists (select 1 from inserted) and not exists (select 1 from deleted)) 
  214. begin 
  215. insert into log(action) values('inserted'); 
  216. end 
  217. else if (not exists (select 1 from inserted) and exists (select 1 from deleted)) 
  218. begin 
  219. insert into log(action) values('deleted'); 
  220. end 
  221. go 
  222. --test 
  223. insert into student values('king', 22, 1, 7); 
  224. update student set sex = 0 where name = 'king'
  225. delete student where name = 'king'
  226. select * from log; 
  227. select * from student order by id; 

以上是本文給大家深入淺析sqlserver觸發器的全部內容,希望大家喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产主播欧美精品| 欧美日韩人人澡狠狠躁视频| 18久久久久久| 国产成人短视频| 欧美超级免费视 在线| 久久视频免费在线播放| 91社影院在线观看| 国产成人福利夜色影视| 91精品国产自产在线观看永久| 日韩欧美黄色动漫| 亚洲国产天堂网精品网站| 最近2019年中文视频免费在线观看| 国产成人一区二区三区电影| 欧美在线观看网站| 亚洲精品乱码久久久久久金桔影视| 国产不卡精品视男人的天堂| 国外色69视频在线观看| 午夜精品一区二区三区在线播放| 成人精品一区二区三区电影黑人| 国产精品自拍偷拍视频| 国产在线精品成人一区二区三区| 国产97在线|亚洲| 久久av中文字幕| 97人洗澡人人免费公开视频碰碰碰| 欧美成人午夜视频| 久久免费国产精品1| 亚洲a区在线视频| 91精品免费久久久久久久久| 欧美激情性做爰免费视频| 奇米一区二区三区四区久久| 亚洲国产一区自拍| 亚洲伊人第一页| 国产精品第一视频| 中文字幕精品一区二区精品| 性欧美办公室18xxxxhd| 亚洲影视中文字幕| 中文字幕精品www乱入免费视频| 久久久久久久999精品视频| 日本成人在线视频网址| 欧美理论片在线观看| 亚洲精品98久久久久久中文字幕| 亚洲欧美中文在线视频| 高清一区二区三区日本久| 国产免费一区二区三区在线能观看| 欧美视频在线视频| 欧美老女人xx| 亚洲国产成人精品久久| 国产欧美一区二区白浆黑人| 久久精品国产欧美亚洲人人爽| 国产99久久精品一区二区永久免费| 日韩av网站在线| 日韩欧美亚洲范冰冰与中字| 亚洲精品色婷婷福利天堂| 九九九久久国产免费| 精品国产一区av| 亚洲天堂av在线播放| 久久精品国产99国产精品澳门| 中文字幕国产精品| 欧美激情亚洲国产| 韩剧1988在线观看免费完整版| 精品毛片三在线观看| 色综合久综合久久综合久鬼88| 欧美激情一级欧美精品| 日韩av在线免费观看| 亚洲成人精品久久| 久久天堂av综合合色| 欧美精品激情在线| 在线播放国产一区中文字幕剧情欧美| 97精品久久久中文字幕免费| 日本免费一区二区三区视频观看| 亚洲精品久久久久中文字幕二区| 欧美激情极品视频| 日韩一区二区久久久| 欧美日韩一区免费| 国产精品偷伦视频免费观看国产| 日本亚洲欧美三级| 精品色蜜蜜精品视频在线观看| 国产精品视频精品视频| 精品无码久久久久久国产| 亚洲国产精品va在线看黑人动漫| 日韩在线中文视频| 欧美日韩国产在线播放| 久久久国产精品视频| 欧美在线视频播放| 国产精品国产福利国产秒拍| 欧美激情极品视频| 最近中文字幕日韩精品| 4p变态网欧美系列| 中文字幕精品久久| 欧美一级淫片丝袜脚交| 91福利视频网| 国产欧美va欧美va香蕉在线| 久久久久久久一区二区三区| 亚洲最大成人在线| 欧美日韩亚洲视频| 欧美日韩中文在线观看| 久久精品国产69国产精品亚洲| 国产精品永久免费在线| 亚洲剧情一区二区| 欧美精品久久久久久久久久| 韩国日本不卡在线| 欧美寡妇偷汉性猛交| 亚洲高清久久网| 亚洲欧美成人在线| 成人欧美一区二区三区在线湿哒哒| 亚洲第一区第一页| 亚洲人成在线一二| 国产精品第100页| 欧美激情视频网址| 中文字幕亚洲欧美在线| 欧美在线欧美在线| 精品久久久久久久久久国产| 欧美午夜精品在线| 一二美女精品欧洲| 这里只有精品视频在线| 亚洲人成亚洲人成在线观看| 亚洲天堂精品在线| 欧美日韩国产精品一区二区三区四区| 97碰在线观看| 91夜夜未满十八勿入爽爽影院| 欧美老肥婆性猛交视频| 国产精品国产三级国产aⅴ9色| 午夜精品蜜臀一区二区三区免费| 欧美成人精品一区二区三区| 欧美中在线观看| 欧美精品videosex性欧美| 亚洲国产精品系列| y97精品国产97久久久久久| 日韩二区三区在线| 国产男人精品视频| 久久天天躁狠狠躁夜夜爽蜜月| 国产成人91久久精品| 国产日韩精品在线观看| 欧美成人免费播放| 亚洲成人999| 久久亚洲电影天堂| 91在线免费观看网站| 国产日本欧美一区二区三区| 国内精品一区二区三区四区| 尤物yw午夜国产精品视频明星| 亚洲日本成人女熟在线观看| 97色在线观看免费视频| 欧美在线免费看| 在线观看免费高清视频97| 亚洲xxxx在线| 欧美一区二区三区图| 国产精品久久久久久久久影视| 欧美另类老女人| 精品中文视频在线| 国产欧美一区二区三区在线| 久久九九全国免费精品观看| 中文字幕一精品亚洲无线一区| 久久久亚洲精品视频| 久久精品在线视频| 久久影院中文字幕| 日韩亚洲欧美中文在线| 日韩欧亚中文在线| 日韩a**中文字幕| 色哟哟网站入口亚洲精品| 欧美亚洲另类在线| 91九色国产在线| 成人免费网站在线观看| 久久亚洲精品一区二区| 亚洲第一免费网站|