觸發器:
觸發器為特殊類型的存儲過程,可在執行語言事件時自動生效。SQL Server 包括三種常規類型的觸發器:DML 觸發器、DDL 觸發器和登錄觸發器。
當服務器或數據庫中發生數據定義語言 (DDL) 事件時將調用 DDL 觸發器。登錄觸發器將為響應 LOGON 事件而激發存儲過程。與 SQL Server 實例建立用戶會話時將引發此事件。
當數據庫中發生數據操作語言 (DML) 事件時將調用 DML 觸發器。DML 事件包括在指定表或視圖中修改數據的 INSERT 語句、UPDATE 語句或 DELETE 語句。DML 觸發器可以查詢其他表,還可以包含復雜的 Transact-SQL 語句。將觸發器和觸發它的語句作為可在觸發器內回滾的單個事務對待。如果檢測到錯誤(例如,磁盤空間不足),則整個事務即自動回滾。
主要講述DML觸發器,DML觸發器有兩種:AFTER(FOR),INSTEAD OF觸發器,同時DML 觸發器使用 deleted 和 inserted 邏輯(概念)表。 它們在結構上類似於定義了觸發器的表,即對其嘗試執行了用戶操作的表。 在 deleted 和 inserted 表保存了可能會被用戶更改的行的舊值或新值。
對於INSERT 操作,inserted保留新增的記錄,deleted無記錄
對於DELETE 操作,inserted無記錄,deleted保留被刪除的記錄
對於UPDATE操作,inserted保留修改后的記錄,deleted保留修改前的記錄
示例一:DELETE觸發器的創建和執行,用的Instead Of

示例二:執行刪除一條數據,用deleted來表示被刪除的那條數據,從中獲取

示例三:insert添加一條數據,inserted表示新添加的數據,從中獲取教師編號,並且根據教師編號來查看是男是女,調換男女。

示例四:在忘記觸發器的名字時,可以通過下面的語句來進行禁用或啟用觸發器。

數據庫事務:
數據庫事務(Database Transaction) 是指作為單個邏輯工作單元執行的一系列操作。
事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。
設想網上購物的一次交易,其付款過程至少包括以下幾步數據庫操作:
更新客戶所購商品的庫存信息
保存客戶付款信息--可能包括與銀行系統的交互
生成訂單並且保存到數據庫中 · 更新用戶相關信息,例如購物數量等等 正常的情況下,這些操作將順利進行,最終交易成功,與交易相關的所有數據庫信息也成功地更新。但是,如果在這一系列過程中任何一個環節出了差錯,例如在更新商品庫存信息時發生異常、該顧客銀行帳戶存款不足等,都將導致交易失敗。一旦交易失敗,數據庫中所有信息都必須保持交易前的狀態不變,比如最后一步更新用戶信息時失敗而導致交易失敗,那么必須保證這筆失敗的交易不影響數據庫的狀態--庫存信息沒有被更新、用戶也沒有付款,訂單也沒有生成。否則,數據庫的信息將會一片混亂而不可預測。
數據庫事務正是用來保證這種情況下交易的平穩性和可預測性的技術。
begin tran (或transaction) --開始事務
commit --提交事務
rollback --回滾事務
事務特性:
A原子性(atomicity)
C一致性(consistency)
I隔離性(isolation)
D持久性(durability)
@@ERROR 是判斷事務有沒有錯的條件,無錯時值為0,有錯時值不為0。
事務創建以及使用示例:

select * from cangku begin tran --開始事務 insert into cangku values(10008,'Boxster',70,10,1004)--沒有錯 if @@ERROR >0 begin--每一個執行語句后面寫這句話是為了如果上一句有錯誤, --下面不管有多少執行語句,都不會執行,直接到tranrollback goto tranrollback--到最后一個執行語句的tranrollback end insert into cangku values(10002,'極光',66.50,10,1002)--主鍵約束 if @@ERROR>0 goto tranrollback insert into cangku values(10009,'XF',40,10,1003)--沒有錯 if @@ERROR>0 begin tranrollback: --需要加上冒號 rollback tran --回滾所有事務中執行過的命令(撤銷所有執行語句) end else begin commit tran --提交事務(只有真正的走到了commit才是真正的更改數據庫的數據) end
