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