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

在SQLServer使用触发器实现数据完整性的更多相关文章

  1. sqlserver数据库触发器调用外部exe

    sqlserver数据库触发器调用外部exe,同事可以选择参入参数! sqlserver使用 master..xp_cmdshell 进行外部exe的执行. 使用master..xp_cmdshell ...

  2. SqlServer添加触发器死锁的原因

    之前遇到过SqlServer添加触发器死锁的情况,纠结了很长时间 最近发现原来是因为我在建表的时候,把id设成主键后,系统默认了加一个聚集的索引 就是聚集索引把表锁住了

  3. SQLServer之触发器简介

    触发器定义 触发器是数据库服务器中发生事件时自动执行的一种特殊存储过程.SQLServer允许为任何特定语句创建多个触发器.它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对数据库进行操作 ...

  4. 知方可补不足~sqlserver中触发器的使用

    回到目录 触发器在过去的10年中,即存储过程和ado.net称霸江湖期间是那么的重要,而现在,trigger显得不是那么必要的,我们很少将复杂的业务写在SQL里,当然也会没有机会写到trigger里了 ...

  5. [转帖]SQLSERVER 使用触发器实现 禁用sa用户 在非本机登录

    原贴地址: https://blog.csdn.net/reblue520/article/details/51580102 具体的方法为: 创建一个触发器 CREATE TRIGGER forbid ...

  6. sqlserver数据库触发器和存储过程案例学习

      --创建表 create table zhuangzhan ( name ), code ) ); --往表添加一列 alter table zhuangzhan add descition in ...

  7. Sqlserver的触发器的简单使用

    1,触发器有两种 (1)After触发器(之后触发) 触发器有个好处:就是你之前有过什么操作他会将你的操作的数据信息完整的保存下来,比如你删过什么信息,如果用触发器,那么删除后就会显示两行受影响,那么 ...

  8. SqlServer之触发器

    1.触发器之理论: 触发器(Trigger)是一种特殊类型的存储过程,是在用户对某一种表的数据进行UPDATE.INSERT 和 DELETE 操作时被触发执行的一段程序.触发器有助于强制引用完整性, ...

  9. sqlserver的触发器练习实例

    触发器的概念:它是由事件驱动的,就像java中的监听,当某个事件发生了,就会做一些工作. 下面直接上干货,创建insert触发器.delete触发器.DDL触发器和如何查看触发器定义 1.创建三个表学 ...

随机推荐

  1. POJ1228:Grandpa's Estate(给定一些点,问是否可以确定一个凸包)

    Being the only living descendant of his grandfather, Kamran the Believer inherited all of the grandp ...

  2. 【前端】CentOS 7 系列教程之一: 安装 node 最新版

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/linux_1.html 此系列教程从零开始,安装node.mysql.git,nginx.并且设置git自动部署. ...

  3. linux的僵尸进程和孤儿进程

    1 僵尸进程: 子进程已经退出勒 但是还没有回收资源的进程为僵尸进程 代码验证 #include <stdio.h> #include <stdlib.h> #include ...

  4. c++中.c_str和.c_data

    1 关于.c_str的用法: const char *c_str(); 这个数组的数据是临时的,当有一个改变这些数据的成员函数被调用后,其中的数据就会失效.因此要么现用先转换,要么把它的数据复制到用户 ...

  5. 左耳朵耗子:我对 GitLab 误删除数据库事件的几点思考

    参考链接:https://www.infoq.cn/article/some-thoughts-on-gitlab-accidentally-deleting-database 太平洋时间 2017 ...

  6. python 中site-packages 和 dist-packages的区别

    dist-packages is a Debian-specific convention that is also present in its derivatives, like Ubuntu. ...

  7. Linux下tcp服务器创建的步骤

    创建一个socket,使用函数socket() socket(套接字)实质上提供了进程通信的端点,进程通信之前,双方首先必须建立各自的一个端点,否则没有办法通信.通过socket将IP地址和端口绑定之 ...

  8. UIImageView 使图片圆形的方法

    UIImageView 圆形的两种方法 1.cornerRadius (tableView,collectionView尽量避免使用,影响性能) //想要圆角 cornerRadius必须是 imag ...

  9. elasticsearch接口开发(新)

    此文在上一篇文章的基础上稍做了些许修改,主要在springboot整合ES后的包路径上,如下是新的目录结构 下面贴出代码 MyConfig.java package com.ylht.config; ...

  10. hdu3038 How Many Answers Are Wrong 种类并查集

    #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int ...