• 在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代码的复杂处理逻辑。无论是对于维护数据库表间的一致性。保持数据的相关完整性,还是执行强制实施业务规则,触发器都能帮助用户实现。掌握开发触发器的技术。编写出高效率的触发器。将会使数据库的设计变得简洁和高效。

  • 相关阅读:
    UI涂鸦板设计代码
    UI简单计算器设计代码
    用户需求、己、竞争对手的关系
    总结一下,以软件开发生命周期来说明不同的测试的使用情况
    谈软件工程和计算机科学的区别
    有人认为,”中文编程“是解决中国程序员编程效率的秘密武器,请问它是一个“银弹”吗?
    安装Eclipse SVN插件
    UI中横屏竖屏切换的一些方法(转)
    Object-C总结
    js备忘录
  • 原文地址:https://www.cnblogs.com/xiaxianfei/p/5340984.html
Copyright © 2020-2023  润新知