高水娟
摘要:SQL Server提供了两种主要机制来强制执行业务规则和数据完整性:约束和触发器。约束主要用于确保输入到列中的数据满足特定的条件。触发器是一种特殊类型的存储过程,当表中的数据发生更新时将自动调以响应insert、update、delete语句。
关键词:约束;触发器;数据完整性
中图分类号: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提供了两种主要机制来强制执行业务规则和数据完整性:约束和触发器。约束主要被用于强制数据的完整性,约束也能提供比触发器更好的性能。然而,在所能完成的操作,以及完成工作时所能使用约束是有限制的。触发器则常被用于验证业务规则,或是更复杂的数据验证,然后可以对数据库的其他地方的数据完成更深入的更新。约束只能对其所在表中的数据,或是在设计时输入的特定数据进行验证。这同触发器形成对比,触发器可以跨越数据库甚至服务器,可以对任何在设计时设置的数据,或从任何表上的其他行为所收集的数据进行检查。如果所需要的访问权限被给予所有包含的对象,就可以使用触发器的这些功能。
有时候当触发器要进行的是一项非常简单的验证任务时,在构建约束和触发器之间区别就很细微。在这种情况下,如果要处理的是有关数据完整性的内容,则使用约束,这比使用触发器可以提供更好的性能。如果该对象是针对业务规则而被构建,并且可能需要复杂的验证,需要处理多个数据库或服务器,或是要相关的错误处理,那么就应该构建触发器。例如,如果需要针对一个表上的操作(更新,删除等)结果,对另一个数据库中的表进行更改,则必须使用触发器。如果从生产数据库中,对另外的数据库保持审核捕获,就会遇到这种情况。如果要做的事情很简单,如对数据域进行验证,看看其中所包含的值是否在一个指定的范围内,这时使用约束就足够了。
约束本质上是SQL Server放置在列上的一种检查,用以确保输入到列中的数据满足特定的条件。这样可以防止输入错误的数据,从而避免数据不一致。如为学生信息表student中的性别字段sex添加检查约束,要求性别字段的值只能是男或女。程序如下:
--假定数据库sdb、学生信息表student已建立
use studb
go
alter table student
add constraint ck_sex check (sex=男or sex=女)
go
若在性别字段插入其他的值,即会发出警告,如图1所示。
触发器的应用以学生成绩管理系统为例,现假定该系统的数据设计需要两张表:学生信息表(student)存放学生的基本信息,学生成绩表(score)存放学生的成绩信息。现在所要求的功能为:当向学生成绩表中插入一条记录的时候,新记录的学生信息必须存放在学生信息表中。程序如下:
--假定数据库sdb已建立
use sdb
go
--创建学生信息表student
create table student
(sno char(8) not null, sname char(8) not null, sex char(2),birthday datetime, class char(5))
go
--创建学生成绩表score
create table score
(sno char(8) not null, sname char(8) not null, cname char(20) not null, score int not null)
go
--创建insert触发器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
--插入测试数据
use sdb
go
insert into score values(‘104051,王丽,计算机英语,98)
go
--查看两张表
select * from student
select * from score
如图2所示。
由此可以看出,触发器是在对表进行插入、更新或删除操作时自动执行的存储过程。当在某一个表格中插入记录、修改记录或者删除记录时,SQL Server就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合由这些SQL语句所定义的规则。在SQL Server中,将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果这次事务未获成功,SQL Server会自动返回该事务执行前的状态。和CHECK约束相比,触发器可以强制实现更加复杂的数据完整性,而且可以引用其他表中的字段。
参考文献:
[1]徐晓丽.巧妙应用SQL Server触发器[J].微型电脑应用,2010(4).
[2]张月.SQL Server中存储过程与触发器技术的研究与应用[J].科技创新导报,2008(23).
[3]张淑梅.SQL Server2005开发与管理[M].大连:大连理工大学出版社,2009.
[4]喻梅,汪洋.SQL Server2005基础教程[M].北京:清华大学出版社,2007.