【SQL觸發器、事務、鎖的概念和應用】
1.觸發器
(一)觸發器概述
1.觸發器的定義
觸發器(Trigger)是一種特殊的存儲過程,它與表緊密相連,可以是表定義的一部分。當預定義的事件(如用戶修改指定表或者視圖中的數據)發生時,觸發器會自動執行。
觸發器基于一個表創建,但是可以對多個表進行操作。因此觸發器可以用來對表實施復雜的完整性約束,當觸發器保存的數據改變時,觸發器被自動激活,從而防止對數據的不正確修改。觸發器的優點如下。
(1)觸發器自動執行,在對表的數據做了任何修改(如手工輸入或者使用程序采集的操作)之后立即激活。
(2)觸發器可以通過數據庫中的相關表進行層疊更改。這比直接把代碼寫在前臺的做法更安全合理。
(3)觸發器可以強制限制,這些限制比用CHECK約束定義的更復雜。與CHECK約束不同的是,觸發器可以引用其他表中的列。
2.觸發器的分類
在SQL Server系統中,按照觸發事件的不同,可以把提供的觸發器分成兩大類型,即DDL觸發器和DML觸發器。
(1)DML觸發器
DML 觸發器為特殊類型的存儲過程,可在發生數據操作語言(DML)事件時自動生效,以便影響觸發器中定義的表或視圖。DML事件包括 INSERT、UPDATE或DELETE語句。DML觸發器可用于強制業務規則和數據完整性、查詢其他表并包括復雜的 Transact-SQL語句。將觸發器和觸發它的語句作為可在觸發器內回滾的單個事務對待。如果檢測到錯誤(如磁盤空間不足),則整個事務自動回滾。
(2)DDL觸發器
DDL觸發器將激發響應各種數據定義語言(DDL)事件。這些事件主要與以關鍵字CREATE、ALTER、DROP、GRANT、DENY、REVOKE或UPDATE STATISTICS開頭的Transact-SQL語句對應。
(二)創建觸發器
1.DML觸發器
因為DML觸發器是一種特殊的存儲過程,所以DML觸發器的創建和存儲過程的創建方式有很多相似之處,創建DML觸發器的基本語法如下。
CREATE TRIGGER trigger_name
ON {table|view}
{{{FOR|AFTER|INSTEAD OF}{[UPDATE [[,][INSERT][,][DELETE] ]ASsql_statement}
}
CREATETRIGGER語句中,主要參數的含義如下。
trigger_name:是要創建的觸發器的名稱。
table|view:是在其上執行觸發器的表或者視圖,有時稱為觸發器表或者觸發器視圖。可以選擇是否指定表或者視圖的所有者。
FOR、AFTER、INSTEAD OF:指定觸發器觸發的時機。
AFTER:指定觸發器只有在SQL語句中指定的所有操作都已成功執行后才觸發,只有在所有的引用級聯操作和約束檢查成功完成后,才能執行此觸發器。如果僅指定FOR關鍵字,則AFTER是默認設置。
INSTEAD OF:指定執行觸發器而不是執行觸發的SQL語句,從而替代觸發語句的操作。在表或視圖上,每個INSERT、UPDATE或DELETE語句最多可以定義一個INSTEAD OF觸發器。
DELETE、INSERT、UPDATE:指定在表或視圖上執行哪些語句時將觸發觸發器的關鍵字。必須至少指定一個選項。在觸發器定義中允許使用以任意順序組合的這些關鍵字。如果指定的選項多于一個,需用逗號分隔這些選項。
sql_statement:指定觸發器執行的Transact-SQL語句。
【例1】 創建一個觸發器,當class表中的班級編號變更時,同時更新student表中的相應班級編號信息。
USE grademanager
GO
CREATETRIGGERtrig_班級信息更新
ON class
FOR UPDATE
AS
IF UPDATE(classno)
BEGIN
UPDATE student SET classno=(SELECT classno FROM inserted)
WHERE classnoIN(SELECT classno FROM deleted)
END
【例2】 創建一個觸發器,用于在grademanager數據庫中刪除student表的一個學生信息時,級聯刪除該學生對應sc表中的成績信息。
默認時,由于student表和sc表在sno列上存在外鍵約束,因此不允許直接刪除student表中