麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > 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在线1 | a视频在线播放 | 91精品国产综合久久久动漫日韩 | 亚洲视频网 | 久久91亚洲精品久久91综合 | 日韩视频一区二区在线观看 | 午夜久久视频 | 成人毛片在线 | 国产免费高清在线视频 | 广州毛片| 国产羞羞视频在线观看免费应用 | 自拍偷拍亚洲图片 | 99爱在线免费观看 | 亚洲啪啪 | 91精品久久久久久久 | 亚洲成人久久精品 | 97超视频在线观看 | chinese军人gay呻吟 | 日韩欧美综合在线 | 日韩欧美综合在线 | 国产xxxx岁13xxxxhd | 国产精品久久久久久久久岛 | 国产亚洲精品综合一区91 | 欧洲精品色 | 色七七亚洲 | 精品亚洲夜色av98在线观看 | 久久人人97超碰国产公开结果 | 国产成人精品二区 | 久久免费视频精品 | 黄色av一区二区三区 | 婷婷中文字幕一区二区三区 | 成人福利视频网站 | 久久亚洲精选 | 污黄视频在线播放 | 午夜视频久久 | 噜噜噜躁狠狠躁狠狠精品视频 | 久久一本日日摸夜夜添 | 草b视频在线观看 | 久久久久久亚洲综合影院红桃 | 久久tv免费国产高清 |