上期咱們介紹了SqlServer的視圖和存儲過程建立與使用,這期咱們介紹一下觸發器。html
有須要回顧的能夠電梯直達看一下:sql
觸發器(Trigger)是針對某個表或視圖所編寫的特殊存儲過程,它不能被顯式地調用,微信
而是當該表或視圖中的數據發生添加INSERT、更新UPDATE或刪除DELETE等事件時自動被執行。架構
主要做用是實現由主鍵和外鍵所不能保證的複雜的參照完整性和數據一致性。post
觸發器的主要做用就是其可以實現由主鍵和外鍵所不能保證的複雜參照完整性和數據的一致性,性能
它可以對數據庫中的相關表進行級聯修改,提升比CHECK約束更復雜的的數據完整性,並自定義錯誤消息。學習
觸發器的主要做用主要有如下接個方面:測試
- 強制數據庫間的引用完整性;
- 級聯修改數據庫中全部相關的表,自動觸發其它與之相關的操做;
- 跟蹤變化,撤銷或回滾違法操做,防止非法修改數據;
- 返回自定義的錯誤消息,約束沒法返回信息,而觸發器能夠;
- 觸發器能夠調用更多的存儲過程;
- 觸發器是自動的。當對錶中的數據作了任何修改以後當即被激活。
- 觸發器能夠經過數據庫中的相關表進行層疊修改。
- 觸發器能夠強制限制。這些限制比用CHECK約束所定義的更復雜。與CHECK約束不一樣的是,觸發器能夠引用其餘表中的列。
- 增長了系統的複雜性。
- 嵌套觸發器容易出現死鎖現象。
- 觸發器並無提高多少性能。
- 可移植性差。
- 佔用服務器資源,給服務器形成壓力。
- 複雜的觸發器維護困難。
SqlServer包括三種常規類型的觸發器:DML觸發器、DDL觸發器和登陸觸發器。
若是用戶要經過數據操做語言 (DML) 事件編輯數據,則執行 DML 觸發器。
DML 事件是針對表或視圖的 INSERT、UPDATE 或 DELETE 語句。
在激發任何有效的事件時,將會激發這些觸發器,而不管是否會影響任何錶行。
當數據庫服務器中發生數據操做語言事件時執行這些操做。
SqlServer中的DML觸發器有三種:
- insert觸發器:向表中插入數據時被觸發;
- delete觸發器:從表中刪除數據時被觸發;
- update觸發器:修改表中數據時被觸發。
當遇到下列情形時,應考慮使用DML觸發器:
1. 經過數據庫中的相關表實現級聯更改
2. 防止惡意或者錯誤的insert、update和delete操做,並強制執行check約束定義的限制更爲複雜的其餘限制。
3. 評估數據修改先後表的狀態,並根據該差別纔去措施。
DDL觸發器是當服務器或者數據庫中發生數據定義語言(主要是以create,drop,alter開頭的語句)事件時被激活使用,
使用DDL觸發器能夠防止對數據架構進行的某些更改或記錄數據中的更改或事件操做。
登陸觸發器將爲響應 LOGIN 事件而激發存儲過程。
與 SQL Server 實例創建用戶會話時將引起此事件。登陸觸發器將在登陸的身份驗證階段完成以後且用戶會話實際創建以前激發。
所以,來自觸發器內部且一般將到達用戶的全部消息(例如錯誤消息和來自 PRINT 語句的消息)會傳送到 SQL Server 錯誤日誌。
若是身份驗證失敗,將不激發登陸觸發器。
在執行 INSERT、UPDATE、MERGE 或 DELETE 語句的操做以後執行 AFTER 觸發器。
若是違反了約束,則永遠不會執行 AFTER 觸發器;所以,這些觸發器不能用於任何可能防止違反約束的處理。
對於在 MERGE 語句中指定的每一個 INSERT、UPDATE 或 DELETE 操做,將爲每一個 DML 操做觸發相應的觸發器。
INSTEAD OF觸發器替代下列觸發語句的標準操做。
所以,觸發器可用於對一個或多個列執行錯誤或值檢查,而後在插入、更新或刪除行以前執行其餘操做。
INSTEAD OF觸發器的主要優勢是可使不能更新的視圖支持更新。
INSTEAD OF觸發器的另外一個優勢是使您得以編寫這樣的邏輯代碼:在容許批處理的其餘部分紅功的同時拒絕批處理中的某些部分。
下表對 AFTER 觸發器和 INSTEAD OF 觸發器的功能進行了比較。
用於執行一個或多個 Transact-SQL 語句以響應服務器範圍或數據庫範圍事件的一種特殊類型的 Transact-SQL 存儲過程。
例如,若是執行某個語句(如 ALTER SERVER CONFIGURATION)或者使用 DROP TABLE 刪除某個表,則激發 DDL 觸發器。
CLR 觸發器將執行在託管代碼(在 .NET Framework 中建立並在 Transact-SQL 中上載的程序集的成員)中編寫的方法,而不用執行 SQL Server存儲過程。
--建立一個觸發器 --檢測到表數據有update時,更新CreateTime時間爲當前時間 create trigger trigger_a_Students --觸發器名稱 on a_Students for update as begin update a_Students SET CreateTime=GETDATE() --觸發器須要執行的sql end --測試 --執行一個修改語句 update a_Students set Name='孫悟空1' where Number=100001 --查看數據 select * from a_Students
--刪除觸發器 drop trigger trigger_a_Students --觸發器名稱
--查看全部觸發器 select * from sysobjects where xtype='TR' -- 查看單個觸發器 exec sp_helptext 'trigger_a_Students' --觸發器名稱
--修改一個觸發器 --檢測到表數據有update,insert時,更新CreateTime時間爲當前時間 alter trigger trigger_a_Students --觸發器名稱 on a_Students for update,insert as begin update a_Students SET CreateTime=GETDATE() --觸發器須要執行的sql end --測試 --執行一個插入語句 INSERT INTO a_Students(Number,Name,ClassId) VALUES('100016','李靖',3) --查看數據 select * from a_Students
好了,咱們就介紹到這裏吧,
拜拜,咱們下次不見不散。
歡迎關注訂閱微信公衆號【熊澤有話說】,更多好玩易學知識等你來取
做者:熊澤-學習中的苦與樂 公衆號:熊澤有話說 出處: https://www.cnblogs.com/xiongze520/p/14606862.html 創做不易,任何人或團體、機構所有轉載或者部分轉載、摘錄,請在文章明顯位置註明做者和原文連接。 |