`

【转】SQLServer 触发器保持数据库完整性的实际应用

    博客分类:
  • DB
阅读更多
1.触发器概述

触发器是SQL Server数据库应用中一个重要工具,是一种特殊类型的存储过程,应用非常广泛。一般存储过程主要通过存储过程名而被直接调用,触发器则是通过事件触发执行。触发器基于一个表来创建并和一个或多个数据修改操作(插入、更新或删除)相关联,可视作表的一部分。触发器与数据库中的表紧密相关,比如当对表执行Insert、Update或Delete操作时,触发器就会自动执行。

SQL Server 包括两大类触发器:DML 触发器和 DDL 触发器。其中DDL 触发器是 SQL Server 2005 的新增功能,当服务器或数据库中发生数据定义语言 (DDL) 事件时将调用该触发器;DML 触发器是指当数据库中发生数据操作语言 (DML) 事件时被调用。DML 事件包括在指定表或视图中修改数据的 Insert、Update或 Delete 语句。DML 触发器可以查询其他表,还可以包含复杂的 Transact-SQL 语句。DML 触发器用于在数据被修改时强制执行业务规则,以及扩展 Microsoft SQL Server 2005 约束、默认值和规则的完整性检查逻辑。本文中所讲述的触发器主要是指DML 触发器。

DML触发器包括三种类型:AFTER 触发器、INSTEAD OF 触发器、CLR 触发器。在执行了 Insert、Update 或 Delete 语句操作之后将会执行 AFTER 触发器,本文将以AFTER触发器为例来讲述触发器在保持数据完整性中的应用。其创建语法如下:

Create TRIGGER trigger_name

ON table_name

AFTER {[Insert][,][Update][,][Delete]}}

AS

Sql_statements

[RETURN]

在触发器的应用中,我们通常会用到两个特殊的表:inserted表和deleted表。它们都是针对当前触发器的局部表。这两个表与触发器所在表的结构完全相同,而且总是存储在高速缓存中。当触发Delete触发器后,从受影响的表中删除的行的副本将被放置到deleted表中。同理当触发Insert触发器后,inserted表中保存的是刚被插入的数据行的一个副本。

当一个触发器执行激发另一个触发器的操作,而另一个触发器又激发第三个触发器,如此等等,这时就发生了触发器的嵌套。也就是下文中用到的嵌套触发器。DML 触发器和 DDL 触发器最多可以嵌套 32 层。

2.1.触发器的应用

我们以BBS论坛数据库中多个关联表的操作为例,阐述触发器在保持数据完整性、一致性中的应用。

在BBS的程序设计中,我们经常会碰到对一个数据表操作的同时,还要自动对另外几个相关联的数据表进行操作,以保证各数据表之间数据的完整性与一致性。BBS论坛中常用的数据表有:

BBS_User表(存储用户信息):用于存储用户信息。字段有用户名、密码、积分、发帖数、等级ID、最后一次发帖、qq、Email、头像、注册时间等;

BBS_Type表:用于存储大版块信息。字段有版块ID、版块名称等;

BBS_LanMu表:存储分论坛信息。字段有分论坛ID、名称、所属大版块ID、主题总数、回复总数、版主等;

BBS_Topic表:存储帖子信息。字段有帖子ID、标题、内容、发帖人、所属分论坛ID、回复总数、点击总数、最后一次回贴时间、回帖人等;

BBS_Reply表:存储回复信息。字段有回复内容、回复人、回复的帖子ID、回复时间等。

在BBS论坛中,触发器主要应用于以下几种情况:

当用户在分论坛里发表帖子时,对BBS_Topic表进行操作,但同时要自动对分论坛表BBS_LanMu里面的论坛主题总数增1,还要更新BBS_User表给该用户增加相应的积分,当用户积分达到一定分数时,自动更新该用户的等级ID,表示该用户已经升了一个等级。

当用户回复帖子时,对BBS_Reply表操作的同时,也需要对分论坛表BBS_LanMu里的回复总数增1、对BBS_Topic表的回复总数增1并更新该表里的最后回帖标题和时间,还要将BBS_User表里的该用户的发帖数增1、自动增加相应积分、更新最后发帖标题和时间等;

在论坛的后台管理中,管理员有时需要添加或者删除一个大版块。当我们要删除BBS_Type表一个大版块时,为了保证数据库各表中数据的完整性与一致性,要同时对BBS_LanMu表、BBS_Topic表、BBS_Reply表中相关联的数据记录一并删除。

下面将以后台管理中对论坛大版块进行删除操作时应用触发器为例来进行具体介绍。

(1) 需求分析

在一个论坛中有许多个大版块,每个版块又对应多个分论坛。每个论坛又对应多个帖子,每个帖子又对应多个回复信息。因此需要4个相关联的表来存储相应的信息:BBS_Type表(存储大版块信息)、BBS_LanMu表(存储分论坛信息)、BBS_Topic表(存储帖子信息)、BBS_Reply表(存储回复信息)。BBS_Type与BBS_LanMu、BBS_LanMu与BBS_Topic、BBS_Topic与BBS_Reply之间都是一对多的关系。

当我们要删除BBS_Type表一个大版块时,为了保证数据库各表中数据的完整性与一致性,需要同时对BBS_LanMu表、BBS_Topic表、BBS_Reply表中相关联的数据记录一并删除。因为这里面存在3对一对多的关系,如果在程序中或者存储过程实现,显然是很困难也是不合理的。根据触发器的作用以及这4个表之间的关系,采用嵌套触发器来实现这个删除功能。为BBS_Type表、BBS_LanMu表、BBS_Topic表分别建立一个AFTER触发器,该触发器由Delete事件触发。采用嵌套触发器可以在数据库里自动完成这多个表中相关记录的删除,大大简化了业务逻辑。这样即保证了数据的完整性与一致性,又保证程序设计的合理性与方便性。

(2)创建触发器

根据需求分析,为BBS_Type表、BBS_LanMu表、BBS_Topic表分别建立AFTER触发器,该触发器由Delete事件触发。建立在这3个表之上的触发器之间是嵌套触发的关系,即BBS_Type表上的触发器触发BBS_LanMu表上的触发器,BBS_LanMu表上的触发器再触发BBS_Topic表上的触发器。本文中使用的数据库为Microsoft SQL Server 2005。要让触发器能嵌套触发必须在数据库“属性”中,将“递归触发器已启用”设置为TRUE。

1.为BBS_Type表(存储大版块信息)建立触发器DelType。该触发器功能是删除BBS_LanMu表中属于刚删除的大版块的所有分论坛信息。

Create trigger [DelType] on [dbo]。[BBS_Type]

after delete

as

begin

declare @typeid int

select @typeid=TypeID from deleted --获得要被删除的版块ID

delete from dbo.BBS_LanMu where Typeid=@typeid

end

2.为BBS_LanMu表(存储分论坛信息)建立触发器DelLanmu。该触发器功能是删除BBS_Topic表中属于刚删除分论坛的所有帖子信息。

Create trigger [DelLanmu] on [dbo]。[BBS_LanMu]

AFTER Delete

as

BEGIN

declare @lmid int

select @lmid=LMID from deleted --获得要被删除的分论坛ID

delete from dbo.BBS_Topic where LMID=@lmid

END

3.为BBS_Topic表(存储帖子信息)建立触发器DelTopic。该触发器功能是删除BBS_Reply表中属于刚删除帖子的所有回复信息。

Create trigger [DelTopic] on [dbo]。[BBS_Topic]

after delete

as

BEGIN

declare @tid int

select @tid=TID from deleted --获得要被删除的帖子ID

delete from dbo.BBS_Reply where TID=@tid

END

执行过程

当数据操作层对数据表BBS_Type发出Delete一条记录的时候,触发器DelType被触发,此触发器将删除BBS_LanMu表中属于刚删除的大版块的所有分论坛信息。

当DelType触发器对数据表BBS_LanMu删除一条记录时,又触发BBS_LanMu表上的触发器DelLanmu,此触发器将删除BBS_Topic表中属于刚删除分论坛的所有帖子信息。

当DelLanmu触发器对数据表BBS_Topic删除一条记录时,又触发触发器DelTopic,此触发器将删除BBS_Reply表中属于刚删除帖子的所有回复信息。

至此数据库中与BBS_Type中删除记录相关联的所有记录全部删除,保证了数据库各表数据的完整性与一致性。这个过程是在数据库中自动进行的,因此速度非常快,用户只需要对BBS_Type表发出删除一条记录的命令,其他表中相关的记录会自动删除。

3.1.总结:

触发器能保持数据的完整性与一致性,它可以方便地基于一个表的修改,自动更新其他相关表的记录,以保证数据的完整性。在数据库的应用中,触发器扮演着很重要的角色。无论是作为提供高级参照完整性功能的途径,还是执行自动维护非正规化数据的任务,触发器都能帮助用户实现满足实际需要的规则,简化业务逻辑,并使系统更方便更有效。

原文地址:http://chinaz.com/Program/MSSQL/101c51352009.html



以上内容转摘自(CNode.CN)详细出处请参考:http://www.cnode.cn/article.asp?id=361
分享到:
评论

相关推荐

    SQL Server触发器在保持数据库完整性中的应用.pdf

    触发器的自动执行特性使得它成为维护数据库完整性的关键工具。 在SQL Server中,触发器分为两大类:数据操纵语言(DML)触发器和数据定义语言(DDL)触发器。DML触发器主要在表或视图的数据被修改时触发,而DDL...

    SQL Server触发器在数据库系统开发中的应用研究.pdf

    总而言之,SQL Server触发器是数据库系统开发中一个强大的工具,它提供了一种机制来增强数据库的完整性和安全性。触发器的设计和实现需要在充分理解业务规则和数据库架构的前提下,进行精细的规划和谨慎的编码。通过...

    SQL数据库触发器 SQL数据库触发器

    SQL数据库触发器的实际应用 触发器是一种特殊类型的存储过程,不由用户直接调用。当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSERT 或DELETE。触发器可以查询其它表,...

    SQL Server触发器在数据库综合性实验中的应用.pdf

    在数据库综合性实验中,SQL Server触发器的应用是一个重要的研究课题,它在确保数据完整性方面发挥着至关重要的作用。触发器是一类特殊的存储过程,它们是为响应特定的数据库事件而自动执行的。在“学生成绩管理系统...

    巧用SQL Server触发器保持数据完整性.pdf

    总的来说,巧妙使用SQL Server触发器可以帮助我们有效地保持数据完整性,但同时也需要谨慎,避免过度依赖和不当使用,以免带来不必要的性能问题。正确理解和运用触发器,是每个数据库管理员和开发人员必备的技能之一...

    SQL Server触发器在数据库设计中的应用.pdf

    作者胡鹤年,作为一名工程师,通过对SQL Server 2000触发器的应用分析,为数据库设计者和使用者提供了一种深入理解和掌握触发器的方式,指出了触发器在数据库设计中的重要性和实用性,并通过具体实例,向数据库设计...

    SQLSERVER触发器插入数据

    ### SQL Server 触发器知识点解析 ...通过以上内容的解析,我们可以了解到SQL Server触发器的基本使用方法及其在实际开发中的应用场景。触发器作为一种强大的工具,能够帮助开发者轻松地维护数据库的完整性和一致性。

    sql server触发器.rar

    SQL Server触发器是数据库管理系统中一种非常重要的特性,它允许开发者在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时执行自定义的SQL代码。这些操作被称为触发事件,而触发器则是对这些事件的响应。理解并...

    SQLServer触发器语法.pdf

    触发器可以帮助维护数据的一致性和完整性,提高数据库的安全性和可靠性。本文将详细介绍 SQL Server 触发器的语法和使用方法。 一、Create TRIGGER 语句 Create TRIGGER 语句是用于创建触发器的语句。其基本语法...

    基于SQL Server触发器的数据完整性应用.pdf

    在探讨数据库管理系统SQL Server中数据完整性的实现时,文章首先定义了数据完整性为数据在逻辑上的一致性和正确性。具体到SQL Server中,数据完整性分为四大类:实体完整性、域完整性、参照完整性和用户定义的完整性...

    SqlServer触发器写法案例

    ### SqlServer触发器详解与案例分析 #### 一、触发器概述 触发器是一种特殊类型的存储过程,它被定义为当特定的事件(如数据的插入、更新或删除)发生时自动执行。Sql Server 中的触发器可以用来强制业务规则或者...

    SQL server 触发器实例

    常见的SQL Server触发器分为三类: 1. INSERT触发器:当向表中插入新记录时激活。它允许在新记录插入后执行额外的处理,例如验证数据或更新相关表。 2. UPDATE触发器:在对表进行更新操作时触发。这有助于在更新...

    SQL Server 2005触发器在数据库开发中的应用.pdf

    SQL Server 2005中的触发器是一种特殊类型的存储过程,它在数据库设计中扮演着至关重要的角色,尤其是在维护数据完整性和一致性方面。触发器是基于特定的表创建,并与一个或多个数据修改操作(INSERT、UPDATE、...

    SQL Server触发器在数据完整性和安全方面的应用.pdf

    总之,SQL Server触发器是一种强大的数据库对象,它通过在特定事件发生时自动执行SQL语句来实现数据完整性维护和数据库安全保护。熟练掌握触发器的创建和管理对于数据库管理员和开发人员来说是十分重要的,能够帮助...

    SQL SERVER 触发器视频讲解

    在SQL Server中,触发器是一种特殊的存储过程,它在数据库中的特定事件发生时自动执行,如数据插入、更新或删除操作。本视频讲解将深入探讨触发器的创建、编辑、修改及其功能,帮助用户更好地理解和应用这些技术。 ...

    使用SQL Server触发器实现数据表的级联更新.pdf

    "使用SQL Server触发器实现数据表的级联更新" ...使用SQL Server触发器可以实现数据库的级联更新,提高数据的完整性和一致性。同时,触发器也可以应用于其他场景,例如数据的自动存档、数据的实时监控等。

    用触发器实现数据库的完整性

    ### 用触发器实现数据库的完整性 在数据库管理系统中,确保数据的完整性是至关重要的任务之一。这不仅关乎数据的质量,还直接影响到基于这些数据作出的决策的有效性和可靠性。为了达到这一目标,数据库管理系统...

    SQL Server数据库实验_存储过程与触发器设计.docx

    存储过程提供了封装和重用代码的能力,提高了性能和安全性,而触发器则允许我们实现复杂的业务逻辑和数据完整性约束,两者结合使用可以构建更健壮、高效的数据库系统。通过实验的方式,我们可以更好地理解这些概念,...

    sqlserver触发器例子

    ### SQL Server 触发器详解 #### 一、触发器概念 触发器是SQL Server中一种特殊的存储过程,其特点在于不能被显式地调用,而是当对特定表进行数据操作(如插入、更新或删除)时自动激活。通过这种方式,触发器能够...

    SQL Server触发器

    SQL Server触发器是数据库管理系统中的一种特殊类型的存储过程,它在特定的数据操作事件(如INSERT、UPDATE或DELETE)发生时自动执行。触发器的主要作用是扩展SQL语句的功能,用于实现复杂的业务规则,确保数据的...

Global site tag (gtag.js) - Google Analytics