Sql Server觸發器使用原理的描述
以下的文章主要向大家講述的是Sql Server觸發器的使用原理,以及對Sql Server觸發器的實際操作功能還有對觸發器三種實際操作的具體分析,以下就是文章的主要內容的詳細描述,希望會給你帶來一些幫助在此方面。
Sql Server觸發器:
1、觸發器的 '本質':
觸發器是一種特殊的存儲過程,它不能被顯式地調用,
而是在往表中插入記錄、更改記錄或者刪除記錄時,當事件發生時,才被
自動地激活。
2、這樣做帶來的 '功能':
觸發器可以用來對表實施復雜的完整性約束,保持數
據的一致性,當觸發器所保護的數據發生改變時,Sql Server觸發器會自動被激活,
響應同時執行一定的操作(對其它相關表的操作),從而保證對數據的不完整
性約束或不正確的修改。
觸發器可以查詢其它表,同時也可以執行復雜的T-SQL語句。觸發器和引
發觸發器執行的命令被當作一次事務處理,因此就具備了事務的所有特征。
注意: '事務具備什么特征?在觸發器中的作用?'
如果發現引起觸發器執行的T-SQL語句執行了一個非法操作,比如關于其它表的
相關性操作,發現數據丟失或需調用的數據不存在,那么就回滾到該事件執行
前的SQL SERVER數據庫狀態。
3、觸發器的作用:
Sql Server觸發器可以對數據庫進行級聯修改,這一點剛才已經說過了。
需要說明的是: '觸發器和約束的關系和區別'
(1)一般來說,使用約束比使用觸發器效率更高。
(2)同時,觸發器可以完成比CHECK約束更復雜的限制。
說明:
2.1 與CHECK約束不同,在觸發器中可以引用其它的表。
2.2 觸發器可以發現改變前后表中數據的不一致,并根據這些不同來進行相應
的操作。
2.3 對于一個表不同的操作(INSERT、UPDATE、DELETE)可以采用不同的觸
發器,即使是對相同的語句也可以調用不同的觸發器來完成不同的操作。
舉例1:在簽訂一份訂單時,貨物的庫存量應減少。
問?這應用了觸發器的什么特征?CHECK約束能解決嗎?
舉例2:正在進行整理的貨物不能下訂單。
問?這應用了觸發器的什么特征?CHECK約束能解決嗎?
4、對觸發器3種操作的分析:
在SQL SERVER為每個Sql Server觸發器都創建了兩個專用表:inserted表和deleted表。
這是兩個邏輯表,由系統來維護,在觸發執行時存在,在觸發結束時消失。
這樣有什么用途?
帶著問題看,具體操作步驟和過程:
(1)deleted表存放由于執行delete或update語句而要從表中刪除的所有行。
在執行delete或update操作時,被刪除的行從激活觸發器的表中被移動(move)到deleted
表,這兩個表不會有共同的行。
(2)inserted表存放由于執行insert或update語句而要向表中插入的所有行。
在執行insert或update事物時,新的行同時添加到激活觸發器的表中和inserted表中,
inserted表的內容是激活觸發器的表中新行的拷貝。
說明:update事務可以看作是先執行一個delete操作,再執行一個insert操作,舊的行首先
被移動到deleted表,讓后新行同時添加到激活觸發器的表中和inserted表中。
11.1.3 instead of 和 after 觸發器
主要包括定義和應用范圍條件,操作執行時機;
11.2 創建觸發器
1、考慮為什么要設計出發器,為解決什么問題而設計?
2、應制定的內容:為什么,大家思考一下?不知道,看下面的例子,全看完!
T-SQL語句創建Sql Server觸發器
語法結構:
create trigger 觸發器名 on 表或視圖 for|after|instead of --操作時機 insert,update,delete as sql語句
作業:
(要求:在northwind表中建立2個表:cust_test和order_test)
cust_test: CustomerID char(5) PK order_test: CustomerID char(5)--對應關系 Custcity Orderid PK Custname OrderNames CStatus int OStatus int --狀態 Cstorage int Orders int --定購量和庫存量 Cdate date Odate date--日期
作業1:
在cust_test表中建立刪除觸發器,實現上述2表的級聯刪除。
作業2:
在order_test表建立insert觸發器,當向order_test表插入一行,如果cust_test表中對應
記錄status值為1,說明處于準備狀態不能寫入該數據。
答案1:
use northwind go create trigger cust_orders_del1 on Cust_test after delete as delete from order_test where CustomerID in (select CustomerID from deleted) go 答案2: use northwind go create trigger cust_orders_ins2 on order_test after insert as if (select cstatus from cust_test,inserted where cust_test.customerid=inserted.customerid)=1 begin print 'The Goods is being processed' rollback transaction end go
以上的相關內容就是對Sql Server觸發器的介紹,望你能有所收獲。
【編輯推薦】
- SQL Server 2000優化SELECT 語句的方案介紹
- SQL Server 2000文件損壞的修復方案
- 改善SQL Server安全規劃的6步驟
- SQL Server 2000重建索引的實際操作流程
- SQL Server備份文件中對現存數據庫的導入