联系我们 |
 |
合作经济与科技杂志社
地址:石家庄市建设南大街21号
邮编:050011
电话:0311-86049879 |
|
|
经济/产业 |
[提要] 本文简述触发器的概念、分类和工作原理,并以“高校工资管理系统”为例,介绍触发器在保证数据的完整性、自定义错误信息、数据跟踪等三个方面的应用。
关键词:SQL Server;触发器;高校工资管理;完整性
中图分类号:F49 文献标识码:A
收录日期:2011年12月26日
一、引言
随着数据库技术在各个领域的广泛应用,保证数据库完整性和安全性的工作也越来越重要。在SQL Server2005中可以通过约束和触发器保证数据的完整性、一致性和有效性。约束直接设置于数据表中,可以实现一些简单的数据完整性操作,而对于一些复杂的完整性操作使用触发器是最佳的选择,如自定义错误、数据的跟踪等。
二、触发器概述
触发器是一种特殊的存储过程,其特殊性在于它的执行不需要用户手动调用,而是当在触发表或触发视图上运行某些事件时自动被激活执行。在SQL Server2005中,根据触发事件不同分为DML触发器和DDL触发器两类。
1、DML触发器。DML触发器是在数据库中发生数据操作语言(DML)事件时被自动执行。根据触发器语句执行的时机,DML触发器分为AFTER触发器和INSTEAD OF触发器。AFTER触发器先执行INSERT、UPDATE或DELETE操作,之后执行触发器语句;INSTEAD OF触发器在INSERT、UPDATE或DELETE语句运行时使用触发器语句代替。
2、DDL触发器。DDL触发器是SQL Server2005的新增功能,当服务器或数据库中发生数据定义语言(DDL)事件时将自动执行该触发器,一般用于执行数据库中的管理任务。
当DML触发器执行时,会产生两个存储在服务器内存中的特殊表:inserted表和deleted表。执行INSERT事件时产生inserted表,用来保存插入记录的副本;执行DELETE事件时产生deleted表,用来保存删除记录的副本;执行UPDATE事件时两个表都产生,deleted表保存更新前记录的副本,inserted表保存更新后记录的副本。这两张表都是临时表,只有当触发器运行时存在,运行完自动删除。用户可以使用这两张表获取插入和删除的记录信息,但不能对其进行修改。
三、触发器的应用
下面以“高校工资管理系统”为例介绍触发器在保证数据的完整性、自定义错误信息、数据跟踪方面的应用。“高校工资管理系统”中主要包含TblTeacher表和TblSalary表,表结构(在此只列出了表的主要字段)如表1、表2所示。(表1、表2)
1、保证数据完整性和一致性
任务:在高校中,教师的岗位工资由职称决定。当教师的职称修改时,该教师的岗位工资应该修改为其职称对应的岗位工资,以保证数据的一致性。
分析:此任务涉及到两个表中的字段,使用约束无法实现。我们可以在TblTeacher表中建立一个更新触发器,当Title(职称)列被更新时,对应职工的BasicSalary(岗位工资)值被一起更新。其中,初级对应的BasicSalary为1000,中级1200,高级1400,其他800。
我们可以在TblTeacher表上创建以下触发器:
CREATE TRIGGER Tri_Upd_Title
ON TblTeacher
AFTER UPDATE
AS
IF UPDATE(Title)
BEGIN
DECLARE @TeaTitle char(4),@Tid char(8)
SELECT @TeaTitle =Title FROM INSERTED
SELECT @Tid=TeacherID FROM INSERTED
UPDATE TblSalary
SET BasicSalary=case @TeaTitle
WHEN'初级'THEN 1000
WHEN'中级'THEN 1200
WHEN'高级'THEN 1400
ELSE 800
END
WHERE TeacherID=@Tid
END
2、自定义错误信息
任务:教师的岗位工资字段值要求只能是1000、1200、1400、800。我们可以为BasicSalary字段添加CHECK约束来强制用户只能输入1000、1200、1400、800。这样,当我们输入的值超出这个范围时,系统就会给出如下提示:
该提示是系统给出,用户较难理解。现希望能在发生错误时,给出一个用户自定义、交互性好的提示。
分析:我们可以在TblSalary表上创建一个触发器,当表上执行插入和更新语句时检查输入值是否正确,不正确给出自定义的提示。
在TblSalary表上创建以下触发器:
CREATE TRIGGER Tri_Upd_BasicSalary
ON TblSalary
AFTER UPDATE,INSERT
AS
DECLARE @S money
SELECT @S=BasicSalary FROM INSERTED
if (@S NOT IN(1000,1200,1400,800))
BEGIN
ROLLBACK
RAISERROR('你输入的值只能是1000、1200、1400、800,请重输!',16,10)
END创建完触发器,再输入正确数据时,就会显示如下提示:
3、数据跟踪
任务:Tblsalary表中数据是很重要的,为了帮助管理员掌握BasicSalary表数据的修改情况,我们希望记录下Tblsalary表中数据的修改情况。现要求当Tblsalary表中数据被被修改时,将修改的用户、修改的时间等信息记录下来保存在TblLogInfo表中。(表3)
下面我们以Tblsalary表中OverSalary列修改情况记录为例介绍触发器的创建:
CREATE TRIGGER Tri_Upd_salary
ON TblSalary
FOR UPDATE
AS
IF UPDATE(OverSalary)
INSERT TblLogInfo
SELECT user_name(),getdate(),@@servername,d.OverSalary,i.OverSalary
FROM deleted AS d join inserted AS i ON d.TeacherID=i.TeacherID
四、总结
本文以“高校工资管理系统”为例,介绍了触发器在完整性设置、自定义错误、数据跟踪方面的应用,其实触发器的应用还有很多,如数据的级联删除和级联更新等。触发器可以实现一些复杂的完整性约束,但在数据库设计的过程中过多的使用触发器会导致数据库系统维护困难,因此在数据库系统的开发过程中应结合约束、规则、存储过程合理地使用触发器。
(作者单位:1.安徽国防科技职业学院;2.电子科技大学数学科学学院)
主要参考文献:
[1]黄存东.数据库原理及应用.中国水利水电出版社,2011.
[2]邓友林.SQL Server 2005中用触发器实现数据库的数据完整性研究.湖南工业职业技术学院学报,2011.11.4.
[3]徐友武.SQL Server 2005触发器应用研究.计算机与信息. |
|
|
|