好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

触发器在保证数据库完整性和一致性中的应用

1. 触发器 概述 触发器 是SQL Server 数据库 应用 中一个重要工具,是一种特殊类型的存储过程, 应用 非常广泛。一般存储过程主要通过存储过程名而被直接调用, 触发器 则是通过事件触发执行。 触发器 基于一个表来创建并和一个或多个数据修改操作(插入、更

  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) 需求分析

  在一个BBS中常见的论坛结构如图Pic-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

  执行过程

   触发器 执行过程如图Pic-2。

  当数据操作层对数据表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.总结:

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

查看更多关于触发器在保证数据库完整性和一致性中的应用的详细内容...

  阅读:32次