触发器摘录
2019獨角獸企業重金招聘Python工程師標準>>>
INSTEAD?OF?觸發器用來代替通常的觸發動作,即當對表進行INSERT、UPDATE?或?DELETE?操作時,系統不是直接對表執行這些操作,而是把操作內容交給觸發器,讓觸發器檢查所進行的操作是否正確。如正確才進行相應的操作。因此,INSTEAD?OF?觸發器的動作要早于表的約束處理。INSTEAD?OF?觸發器的操作有點類似于完整性約束。在對數據庫的操縱時,有些情況下使用約束可以達到更好的效果,而如果采用觸發器,則能定義比完整性約束更加復雜的約束。有關觸發器與約束的比較,請參見聯機叢書。
INSTEAD?OF?觸發器不僅可在表上定義,還可在帶有一個或多個基表的視圖上定義,但在作為級聯引用完整性約束目標的表上限制應用。
AFTER?觸發器定義了對表執行了?INSERT、UPDATE?或?DELETE?語句操作之后再執行的操作。比如對某個表中的數據進行了更新操作后,要求立即對相關的表進行指定的操作,這時就可以采用?AFTER?觸發器。AFTER?觸發器只能在表上指定,且動作晚于約束處理。
每一個表上只能創建一個?INSTEAD?OF?觸發器,但可以創建多個?AFTER?觸發器。
實例:
INSTEAD?OF?觸發器:
向表“計0261”插入數據時,檢查學號是否存在于表“計026”中,如存在則進行插入操作,否則就不插入。
SQL code ?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | CREATE?TRIGGER?[checkid]?ON?[dbo].[計0261]? INSTEAD?OF?insert AS IF?NOT?EXISTS(SELECT?*?FROM?計026?WHERE?學號=(SELECT?學號?FROM?INSERTED)) BEGIN ROLLBACK?TRANSACTION PRINT?'要處理記錄的學號不存在!' END ELSE BEGIN INSERT?INTO?計0261?select?*?from?inserted PRINT?'已經成功處理記錄!' END |
AFTER?觸發器:
對訂貨表設置?AFTER(FOR)?類型的?INSERT?觸發器,用來在插入記錄時自動將統計值計算到訂貨統計表中。
SQL code ?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | CREATE?TRIGGER?[orderinsert]?ON?[dbo].[訂貨表] AFTER?INSERT AS DECLARE?@bookid?int,?@ordernum?int,?@num?int SELECT?@bookid?=?書籍編號,?@ordernum?=?數量?FROM?INSERTED SELECT?@num?=?count(書籍編號)?FROM?訂貨統計表?WHERE?書籍編號=@bookid IF?@num?=?0 --未找到該書,插入記錄 INSERT?INTO?訂貨統計表?VALUES(@bookid,?@ordernum) ELSE --找到該書,更新記錄 UPDATE?訂貨統計表 SET?總訂貨量?=?總訂貨量?+?@ordernum?WHERE?書籍編號?=?@bookid |
轉載于:https://my.oschina.net/u/1753645/blog/599014
總結
- 上一篇: 10 个非常有用的 AngularJS
- 下一篇: 大数据时代的技术hive:hive介绍