当前位置: 首页 > news >正文

在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

相关文章:

  • 软件测试学习日志3 ————软件测试作业之控制流图
  • 【bzoj1046】[HAOI2007]上升序列
  • 关于网站优化
  • 全球78707个主要城市数据库,包含经纬度坐标值、国家、省份
  • java 二进制数字符串转换工具类
  • 逻辑数据库设计 - 单纯的树(递归关系数据)
  • web storage 之留言板
  • tablib.Dataset()操作exl类型数据之“类方法”研究
  • 用自己的机器人和ubuntu PC实现通信和控制--26
  • Ubuntu计算文件md5值命令
  • Maven Dependency Scope用法
  • 结对编写四则运算
  • Appium 一个测试套件多次启动android应用
  • zookeeper 配置
  • JAVA基础知识总结
  • Angular 4.x 动态创建组件
  • Date型的使用
  • ES6 ...操作符
  • Flannel解读
  • Fundebug计费标准解释:事件数是如何定义的?
  • HTML5新特性总结
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • PHP 的 SAPI 是个什么东西
  • storm drpc实例
  • Vim Clutch | 面向脚踏板编程……
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 京东美团研发面经
  • 手机端车牌号码键盘的vue组件
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 学习使用ExpressJS 4.0中的新Router
  • 与 ConTeXt MkIV 官方文档的接驳
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • Prometheus VS InfluxDB
  • #Linux(权限管理)
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (三分钟)速览传统边缘检测算子
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)c52学习之旅-流水LED灯
  • (转)Windows2003安全设置/维护
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET 使用配置文件
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .Net中ListT 泛型转成DataTable、DataSet
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • [ 数据结构 - C++] AVL树原理及实现
  • [2]十道算法题【Java实现】
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [asp.net core]project.json(2)