在SQLServer使用触发器实现数据完整性

1、实现数据完整性的手段

  在sqlserver中,在服务器端实现数据完整性主要有两种手段:一种是在创建表时定义数据完整性,主要分为:实体完整性、域完整性、和级联参照完整性;实现的手段是创建主键约束、唯一键约束、检查约束、默认值约束和各种级联完整性约束。另一种是通过编写触发器语句来实现,通过定义触发条件和编写触发后执行语句,来实现对数据表操作的各种约束。

2、触发器的概念

  触发器是一种特殊的存储过程。通常用于实现强制业务规则和数据完整性。触发器是通过事件触发而由系统自动执行。主要体现在它在插入、删除或修改指定表中的数据时自动触发执行,以保持数据完整性、检查数据有效性、实现数据库管理任务和相关功能。

3、 触发器的工作原理

  SQLServer为每个触发器都创建了两个专用的临时表:INSERTED表和DELETED表。这两个表的结构与激发触发器的表的结构相同。这两个表为只读表,用户不能对它们进行修改,只能在创建触发器的程序中查询表中的内容。

  当执行INSERT语句时,INSERTED语句表存放着将要向表中插入的所有行。当执行DELETE语句时,DELETED表存放要将要从表中删除的所有行。当执行UPDATE语句时,相当于先执行一个DELETE操作,再执行一个INSERT操作,所以旧的行被移动到DELETED表中,而新的行插入到INSERTED表中。

  这两个表会随着触发器的执行完毕而删除。

  触发器分为两种触发方式:INSTEAD OF触发和AFTER触发。

  其中,INSTEAD OF触发是替代触发:是指如果有SQL语句触发了某一个触发器,则会执行触发器中事先定义好的语句,而不执行该SQL语句。AFTER触发是后触发:是指如果有一段SQL语句触发了某一个触发器,则并不立刻执行该触发器中事先定义好的语句,而是等待该SQL语句中所有指定的操作都已成功执行后,才激发该触发器。

4、触发器与数据表约束的区别

  1)可以引用其它表的字段。触发器可以引用其他表,可以包含复杂的SQL语句。当对一个表进行修改时,通过触发器按照相关业务规则去修改其他的表,一旦发现修改过程中出现违背业务规则的情况,可以通过回滚语句,将数据恢复到修改前的状态。

  2)可及时对比数据修改前后的差别。因为触发器中INSERTED和DELETED临时表的存在,用户可以对操作前后的数据进行比较,从而更加明确数据表更新前后的变化状况。

5、 创建SQL触发器语句

  使用CREATE TRIGGER命令创建触发器的基本语法格式如下。

  CREATE TRIGGER 触发器名 ON 表名| 视图名

  FOR INSERT | UPDATE |DELETED

  AFTER | INSTEAD OF

  AS

  SQL语句

6、使用触发器实现数据完整性的实例

  现有销售管理数据库“Marketing”,有以下主要数据表。

  订单信息(订单号,销售工号,货品编码,客户编号,数量,总金额)

  货品信息(编码,名称,库存量,供应商编码,状态,售价,成本价)

  销售人员(工号,部门号,姓名,性别,电话地址)

       (1)创建插入触发器实例

  在“销售人员” 表中,建立一个插入触发器:check_部门号,当用户向销售人员表中插入一个新的销售人员时,如果该销售人员的部门号在部门信息表中根本不存在,则无法完成操作。语句如下:

  Create trigger check_部门号 on 销售人员

  for insert

  as

  declare @bmh int

  select @bmh=部门号 from inserted

  if @bmh not in(select 编号 from 部门信息)

  begin   raiserror(‘没有此部门!’,7,1)

  rollback transaction

  End

  建立触发器后,当用户输入一个错误销售人员的信息(该职员的部门号不存在),则无法完成插入功能。

    (2)创建删除触发器实例

  当用户从“订单信息”表中删除一个订单时,表示用户退单,即不再订购该货品。在这种情况下,我们应该将“货品信息”中的库存量及时补上,用删除触发器完成此操作。

  Create trigger add_库存量 on 订单信息

  for delete

  as

  declare @sl int,@hpbm int

  select @sl=数量,@hpbm=货品编码 from deleted

  update 货品信息 set 库存量=库存量+@sl where 编码=@hpbm

     (3)创建更新触发器

  对‘销售人员’表继续建立一个 更新触发器:update_姓名,当销售人员的名字发生改动时,其改动的名字可以在“培训”表中体现出来。

  Create trigger check_姓名

  on 销售人员

  for update

  as

  if update(姓名)

  begin

  declare @xm char(8),@gh int

  select @xm=姓名,@gh=工号 from inserted

  update 培训 set 姓名=@xm where 工号=@gh

  end

  go

7、 结束语

  综上所述,触发器是由对数据的操作自动引发执行的代码。触发器可以完成约束所无法实现的。触发器的主要好处在于它可以包含使用SOL代码的复杂处理逻辑。无论是对于维护数据库表间的一致性。保持数据的相关完整性,还是执行强制实施业务规则,触发器都能帮助用户实现。掌握开发触发器的技术。编写出高效率的触发器。将会使数据库的设计变得简洁和高效。

原文地址:https://www.cnblogs.com/xiaxianfei/p/5340984.html