高水娟
摘要:SQL Server提供了兩種主要機制來強制執(zhí)行業(yè)務(wù)規(guī)則和數(shù)據(jù)完整性:約束和觸發(fā)器。約束主要用于確保輸入到列中的數(shù)據(jù)滿足特定的條件。觸發(fā)器是一種特殊類型的存儲過程,當表中的數(shù)據(jù)發(fā)生更新時將自動調(diào)以響應(yīng)insert、update、delete語句。
關(guān)鍵詞:約束;觸發(fā)器;數(shù)據(jù)完整性
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2012)01-0003-02
SQL Server Triggers and Constraints in the Application of Comparison
GAO Shui-juan
Abstract: SQL Server provides two main mechanisms to enforce business rules and data integrity: constraint and trigger. Tie main is used to ensure that the input to the data in the column satisfy certain conditions. Trigger is a special procedure, when the data in the table is updated automatically adjusted in response to insert, update, delete statement.
Key words: constraint; trigger; data integrity
SQL Server提供了兩種主要機制來強制執(zhí)行業(yè)務(wù)規(guī)則和數(shù)據(jù)完整性:約束和觸發(fā)器。約束主要被用于強制數(shù)據(jù)的完整性,約束也能提供比觸發(fā)器更好的性能。然而,在所能完成的操作,以及完成工作時所能使用約束是有限制的。觸發(fā)器則常被用于驗證業(yè)務(wù)規(guī)則,或是更復(fù)雜的數(shù)據(jù)驗證,然后可以對數(shù)據(jù)庫的其他地方的數(shù)據(jù)完成更深入的更新。約束只能對其所在表中的數(shù)據(jù),或是在設(shè)計時輸入的特定數(shù)據(jù)進行驗證。這同觸發(fā)器形成對比,觸發(fā)器可以跨越數(shù)據(jù)庫甚至服務(wù)器,可以對任何在設(shè)計時設(shè)置的數(shù)據(jù),或從任何表上的其他行為所收集的數(shù)據(jù)進行檢查。如果所需要的訪問權(quán)限被給予所有包含的對象,就可以使用觸發(fā)器的這些功能。
有時候當觸發(fā)器要進行的是一項非常簡單的驗證任務(wù)時,在構(gòu)建約束和觸發(fā)器之間區(qū)別就很細微。在這種情況下,如果要處理的是有關(guān)數(shù)據(jù)完整性的內(nèi)容,則使用約束,這比使用觸發(fā)器可以提供更好的性能。如果該對象是針對業(yè)務(wù)規(guī)則而被構(gòu)建,并且可能需要復(fù)雜的驗證,需要處理多個數(shù)據(jù)庫或服務(wù)器,或是要相關(guān)的錯誤處理,那么就應(yīng)該構(gòu)建觸發(fā)器。例如,如果需要針對一個表上的操作(更新,刪除等)結(jié)果,對另一個數(shù)據(jù)庫中的表進行更改,則必須使用觸發(fā)器。如果從生產(chǎn)數(shù)據(jù)庫中,對另外的數(shù)據(jù)庫保持審核捕獲,就會遇到這種情況。如果要做的事情很簡單,如對數(shù)據(jù)域進行驗證,看看其中所包含的值是否在一個指定的范圍內(nèi),這時使用約束就足夠了。
約束本質(zhì)上是SQL Server放置在列上的一種檢查,用以確保輸入到列中的數(shù)據(jù)滿足特定的條件。這樣可以防止輸入錯誤的數(shù)據(jù),從而避免數(shù)據(jù)不一致。如為學(xué)生信息表student中的性別字段sex添加檢查約束,要求性別字段的值只能是男或女。程序如下:
--假定數(shù)據(jù)庫sdb、學(xué)生信息表student已建立
use studb
go
alter table student
add constraint ck_sex check (sex=男or sex=女)
go
若在性別字段插入其他的值,即會發(fā)出警告,如圖1所示。
觸發(fā)器的應(yīng)用以學(xué)生成績管理系統(tǒng)為例,現(xiàn)假定該系統(tǒng)的數(shù)據(jù)設(shè)計需要兩張表:學(xué)生信息表(student)存放學(xué)生的基本信息,學(xué)生成績表(score)存放學(xué)生的成績信息?,F(xiàn)在所要求的功能為:當向?qū)W生成績表中插入一條記錄的時候,新記錄的學(xué)生信息必須存放在學(xué)生信息表中。程序如下:
--假定數(shù)據(jù)庫sdb已建立
use sdb
go
--創(chuàng)建學(xué)生信息表student
create table student
(sno char(8) not null, sname char(8) not null, sex char(2),birthday datetime, class char(5))
go
--創(chuàng)建學(xué)生成績表score
create table score
(sno char(8) not null, sname char(8) not null, cname char(20) not null, score int not null)
go
--創(chuàng)建insert觸發(fā)器trig_score
create trig_score on score for insert
as
declare @sno char(8), @sname char(8)
select @sno=sno,@sname=sname from inserted
insert into student(sno,sname) values(@sno,@sname)
go
--插入測試數(shù)據(jù)
use sdb
go
insert into score values(‘104051,王麗,計算機英語,98)
go
--查看兩張表
select * from student
select * from score
如圖2所示。
由此可以看出,觸發(fā)器是在對表進行插入、更新或刪除操作時自動執(zhí)行的存儲過程。當在某一個表格中插入記錄、修改記錄或者刪除記錄時,SQL Server就會自動執(zhí)行觸發(fā)器所定義的SQL語句,從而確保對數(shù)據(jù)的處理必須符合由這些SQL語句所定義的規(guī)則。在SQL Server中,將觸發(fā)器和觸發(fā)它的語句作為可在觸發(fā)器內(nèi)回滾的單個事務(wù)對待。如果這次事務(wù)未獲成功,SQL Server會自動返回該事務(wù)執(zhí)行前的狀態(tài)。和CHECK約束相比,觸發(fā)器可以強制實現(xiàn)更加復(fù)雜的數(shù)據(jù)完整性,而且可以引用其他表中的字段。
參考文獻:
[1]徐曉麗.巧妙應(yīng)用SQL Server觸發(fā)器[J].微型電腦應(yīng)用,2010(4).
[2]張月.SQL Server中存儲過程與觸發(fā)器技術(shù)的研究與應(yīng)用[J].科技創(chuàng)新導(dǎo)報,2008(23).
[3]張淑梅.SQL Server2005開發(fā)與管理[M].大連:大連理工大學(xué)出版社,2009.
[4]喻梅,汪洋.SQL Server2005基礎(chǔ)教程[M].北京:清華大學(xué)出版社,2007.