SQL Server用触发器强制执行业务规则

作者:sheyuan 时间:2009-01-20 16:05:00 

Microsoft? SQL Server? 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。触发器可以查询其它表,并可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到严重错误(例如,磁盘空间不足),则整个事务即自动回滚。

触发器的优点如下:

触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。

触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。

比较触发器与约束

约束和触发器在特殊情况下各有优势。触发器的主要好处在于它们可以包含使用 Transact-SQL 代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但它在所给出的功能上并不总是最好的方法。

实体完整性总应在最低级别上通过索引进行强制,这些索引或是 PRIMARY KEY 和 UNIQUE 约束的一部分,或是在约束之外独立创建的。假设功能可以满足应用程序的功能需求,域完整性应通过 CHECK 约束进行强制,而引用完整性 (RI) 则应通过 FOREIGN KEY 约束进行强制。

在约束所支持的功能无法满足应用程序的功能要求时,触发器就极为有用。例如:

除非 REFERENCES 子句定义了级联引用操作,否则 FOREIGN KEY 约束只能以与另一列中的值完全匹配的值来验证列值。

CHECK 约束只能根据逻辑表达式或同一表中的另一列来验证列值。如果应用程序要求根据另一个表中的列验证列值,则必须使用触发器。

约束只能通过标准的系统错误信息传递错误信息。如果应用程序要求使用(或能从中获益)自定义信息和较为复杂的错误处理,则必须使用触发器。

触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。

触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。当更改外键且新值与主键不匹配时,此类触发器就可能发生作用。例如,可以在 titleauthor.title_id 上创建一个插入触发器,使它在新值与 titles.title_id 中的某个值不匹配时回滚一个插入。不过,通常使用 FOREIGN KEY 来达到这个目的。

如果触发器表上存在约束,则在 INSTEAD OF 触发器执行后但在 AFTER 触发器执行前检查这些约束。如果约束破坏,则回滚 INSTEAD OF 触发器操作并且不执行 AFTER 触发器。

标签:
0
投稿

猜你喜欢

  • 30个最常用css选择器解析

    2011-06-16 20:36:37
  • js模拟抽奖代码

    2008-07-20 12:38:00
  • 用Dreamweaver MX设计各种网页鼠标样式

    2008-10-04 10:18:00
  • js实现(层,表格)元素圆角的函数

    2008-01-01 16:40:00
  • 如何修改Linux的下MySQL 5.0的默认连接数

    2012-01-29 18:07:04
  • 如何用Frontpage下载别人的网站模板

    2008-03-03 12:58:00
  • 教程:mysql申明变量以及赋值

    2009-10-26 10:31:00
  • 解决MySQL 5数据库连接超时问题

    2009-03-25 15:24:00
  • 简单的文本内容处理工具

    2010-01-28 12:31:00
  • asp如何在网站上提供音乐下载?

    2010-06-22 21:14:00
  • 一个输入框提示列表效果

    2008-03-09 18:53:00
  • jQuery.sheet – 创建Excel界面风格的jQuery在线应用

    2010-01-27 13:03:00
  • js金额浮点格式化控件

    2008-08-01 16:52:00
  • DHTML+XML+ASP+CSS的树形目录

    2008-10-24 14:29:00
  • Dreamweaver给你的网页盖个章

    2008-02-03 11:35:00
  • 一个20行左右的强$代码

    2009-12-25 15:22:00
  • SQL建立数据库及删除数据库命令

    2011-12-01 10:23:21
  • ASP实现数据输入、查询的实例

    2010-05-03 10:48:00
  • SQL SERVER 与ACCESS、EXCEL的数据转换方法分享

    2012-02-25 20:17:22
  • Asp 操作Access数据库时出现死锁.ldb的解决方法

    2011-03-29 10:49:00
  • asp之家 网络编程 m.aspxhome.com