觸發器是一種特殊類型的存儲過程,它不一樣於以前的咱們介紹的存儲過程。觸發器主要是經過事件進行觸發被自動調用執行的。而存儲過程能夠經過存儲過程的名稱被調用。html
Ø 什麼是觸發器數據庫
觸發器對錶進行插入、更新、刪除的時候會自動執行的特殊存儲過程。觸發器通常用在check約束更加複雜的約束上面。觸發器和普通的存儲過程的區別是:觸發器是當對某一個表進行操做。諸如:update、insert、delete這些操做的時候,系統會自動調用執行該表上對應的觸發器。SQL Server 2005中觸發器能夠分爲兩類:DML觸發器和DDL觸發器,其中DDL觸發器它們會影響多種數據定義語言語句而激發,這些語句有create、alter、drop語句。測試
DML觸發器分爲:加密
一、 after觸發器(以後觸發)spa
a、 insert觸發器日誌
b、 update觸發器code
c、 delete觸發器htm
二、 instead of 觸發器 (以前觸發)blog
其中after觸發器要求只有執行某一操做insert、update、delete以後觸發器才被觸發,且只能定義在表上。而instead of觸發器表示並不執行其定義的操做(insert、update、delete)而僅是執行觸發器自己。既能夠在表上定義instead of觸發器,也能夠在視圖上定義。事件
觸發器有兩個特殊的表:插入表(inserted表)和刪除表(deleted表)。這兩張是邏輯表也是虛表。有系統在內存中建立者兩張表,不會存儲在數據庫中。並且兩張表的都是隻讀的,只能讀取數據而不能修改數據。這兩張表的結果老是與被改觸發器應用的表的結構相同。當觸發器完成工做後,這兩張表就會被刪除。Inserted表的數據是插入或是修改後的數據,而deleted表的數據是更新前的或是刪除的數據。
對錶的操做 |
Inserted邏輯表 |
Deleted邏輯表 |
增長記錄(insert) |
存放增長的記錄 |
無 |
刪除記錄(delete) |
無 |
存放被刪除的記錄 |
修改記錄(update) |
存放更新後的記錄 |
存放更新前的記錄 |
Update數據的時候就是先刪除表記錄,而後增長一條記錄。這樣在inserted和deleted表就都有update後的數據記錄了。注意的是:觸發器自己就是一個事務,因此在觸發器裏面能夠對修改數據進行一些特殊的檢查。若是不知足能夠利用事務回滾,撤銷操做。
Ø 建立觸發器
語法
tgr_name table_name encrypion –加密觸發器 ... Transact-SQL
# 建立insert類型觸發器
--建立insert插入類型觸發器 (object_id(, ) ) tgr_classes_insert tgr_classes_insert classes insert --插入觸發 --定義變量 @id , @name (20), @temp ; --在inserted表中查詢已經插入記錄信息 @id = id, @name = name inserted; @name = @name + (, @id); @temp = @id / 2; insert student (@name, 18 + @id, @temp, @id); ; --插入數據 insert classes (, getDate()); --查詢數據 * classes; * student id;
insert觸發器,會在inserted表中添加一條剛插入的記錄。
# 建立delete類型觸發器
--delete刪除類型觸發器 (object_id(, ) ) tgr_classes_delete tgr_classes_delete classes --刪除觸發 ; (object_id(, ) ) --存在classesBackup,直接插入數據 insert classesBackup name, createDate deleted; --不存在classesBackup建立再插入 * classesBackup deleted; ; -- nocount ; classes name = ; --查詢數據 * classes; * classesBackup;
delete觸發器會在刪除數據的時候,將剛纔刪除的數據保存在deleted表中。
# 建立update類型觸發器
--update更新類型觸發器 (object_id(, ) ) tgr_classes_update tgr_classes_update classes @oldName (20), @newName (20); --更新前的數據 @oldName = name deleted; ( ( * student name + @oldName + )) --更新後的數據 @newName = name inserted; student name = replace(name, @oldName, @newName) name + @oldName + ; ; ; --查詢數據 * student id; * classes; classes name = name = ;
update觸發器會在更新數據後,將更新前的數據保存在deleted表中,更新後的數據保存在inserted表中。
# update更新列級觸發器
(object_id(, ) ) tgr_classes_update_column tgr_classes_update_column classes --列級觸發器:是否更新了班級建立時間 ((createDate)) (, 16, 11); ; --測試 * student id; * classes; classes createDate = getDate() id = 3; classes name = id = 7;
更新列級觸發器能夠用update是否判斷更新列記錄;
# instead of類型觸發器
instead of觸發器表示並不執行其定義的操做(insert、update、delete)而僅是執行觸發器自己的內容。
建立語法
tgr_name table_name encryption instead ... T-SQL
# 建立instead of觸發器
(object_id(, ) ) tgr_classes_inteadOf tgr_classes_inteadOf classes instead @id , @name (20); --查詢被刪除的信息,病賦值 @id = id, @name = name deleted; + (, @id) + + @name; --先刪除student的信息 student cid = @id; --再刪除classes的信息 classes id = @id; + (, @id) + + @name + ; --test * student id; * classes; classes id = 7;
# 顯示自定義消息raiserror
(object_id(, ) ) tgr_message tgr_message student insert, (, 16, 10); --test insert student (, 22, 1, 7); student sex = 0 name = ; * student id;
# 修改觸發器
tgr_message student (, 16, 10); --test student name = ;
# 啓用、禁用觸發器
--禁用觸發器 disable tgr_message student; --啓用觸發器 enable tgr_message student;
# 查詢建立的觸發器信息
--查詢已存在的觸發器 * sys.triggers; * sys.objects type = ; --查看觸發器觸發事件 te.* sys.trigger_events te sys.triggers t t.object_id = te.object_id t.parent_class = 0 t.name = ; --查看建立觸發器語句 sp_helptext ;
# 示例,驗證插入數據
((object_id(, ) )) tgr_valid_data tgr_valid_data student insert @age , @name (20); @name = s.name, @age = s.age inserted s; (@age < 18) (, 16, 1); ; --test insert student (, 2, 0, 7); insert student (, 22, 0, 7); * student id;
# 示例,操做日誌
(object_id(, ) ) log log( id (1, 1) , (20), createDate datetime getDate() ) ( ( * sys.objects name = )) tgr_student_log tgr_student_log student insert, , (( ( 1 inserted)) ( ( 1 deleted))) insert log() (); ( ( 1 inserted) ( 1 deleted)) insert log() (); ( ( 1 inserted) ( 1 deleted)) insert log() (); --test insert student (, 22, 1, 7); student sex = 0 name = ; student name = ; * log; * student id;
版權全部,轉載請註明出處 本文出自: http://www.cnblogs.com/hoojo/archive/2011/07/20/2111316.html