在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代码的复杂处理逻辑。无论是对于维护数据库表间的一致性。保持数据的相关完整性,还是执行强制实施业务规则,触发器都能帮助用户实现。掌握开发触发器的技术。编写出高效率的触发器。将会使数据库的设计变得简洁和高效。
在SQLServer使用触发器实现数据完整性的更多相关文章
- sqlserver数据库触发器调用外部exe
sqlserver数据库触发器调用外部exe,同事可以选择参入参数! sqlserver使用 master..xp_cmdshell 进行外部exe的执行. 使用master..xp_cmdshell ...
- SqlServer添加触发器死锁的原因
之前遇到过SqlServer添加触发器死锁的情况,纠结了很长时间 最近发现原来是因为我在建表的时候,把id设成主键后,系统默认了加一个聚集的索引 就是聚集索引把表锁住了
- SQLServer之触发器简介
触发器定义 触发器是数据库服务器中发生事件时自动执行的一种特殊存储过程.SQLServer允许为任何特定语句创建多个触发器.它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对数据库进行操作 ...
- 知方可补不足~sqlserver中触发器的使用
回到目录 触发器在过去的10年中,即存储过程和ado.net称霸江湖期间是那么的重要,而现在,trigger显得不是那么必要的,我们很少将复杂的业务写在SQL里,当然也会没有机会写到trigger里了 ...
- [转帖]SQLSERVER 使用触发器实现 禁用sa用户 在非本机登录
原贴地址: https://blog.csdn.net/reblue520/article/details/51580102 具体的方法为: 创建一个触发器 CREATE TRIGGER forbid ...
- sqlserver数据库触发器和存储过程案例学习
--创建表 create table zhuangzhan ( name ), code ) ); --往表添加一列 alter table zhuangzhan add descition in ...
- Sqlserver的触发器的简单使用
1,触发器有两种 (1)After触发器(之后触发) 触发器有个好处:就是你之前有过什么操作他会将你的操作的数据信息完整的保存下来,比如你删过什么信息,如果用触发器,那么删除后就会显示两行受影响,那么 ...
- SqlServer之触发器
1.触发器之理论: 触发器(Trigger)是一种特殊类型的存储过程,是在用户对某一种表的数据进行UPDATE.INSERT 和 DELETE 操作时被触发执行的一段程序.触发器有助于强制引用完整性, ...
- sqlserver的触发器练习实例
触发器的概念:它是由事件驱动的,就像java中的监听,当某个事件发生了,就会做一些工作. 下面直接上干货,创建insert触发器.delete触发器.DDL触发器和如何查看触发器定义 1.创建三个表学 ...
随机推荐
- hdu 4022 Bombing(map,multiset)
题意:n个基地放在2维平面,然后m个炸弹人,每个炸弹人可以炸一行或者一列,输出每个炸弹人炸掉的基地个数. 思路:用map<int,multiset<int> >对应起来一行或者 ...
- 通用异步 Windows Socket TCP 客户端组件的设计与实现
编写 Windows Socket TCP 客户端其实并不困难,Windows 提供了6种 I/O 通信模型供大家选择.但本座看过很多客户端程序都把 Socket 通信和业务逻辑混在一起,剪不断理还乱 ...
- Codeforces Round #419 (Div. 1) 补题 CF 815 A-E
A-C传送门 D Karen and Cards 技巧性很强的一道二分优化题 题意很简单 给定n个三元组,和三个维度的上限,问存在多少三元组,使得对于给定的n个三元组中的每一个,必有两个维度严格小于. ...
- bzoj2384
树状数组+KMP 匹配问题上KMP 但是问题在于如何判断两个位置相等,我们认为如果一个位置之前比他小的数数量相同那么就是相等. 那么我们用树状数组动态维护这个东西,每次跳nxt的时候用树状数组删除数. ...
- Android webkit 事件传递流程通道分析
前言:基于android webview 上定制自己使用的可移植浏览器apk,遇到好多按键处理的问题.所以索性研究了一下keyevent 事件的传递流程. frameworks 层 keyevent ...
- k8s-网络插件flannel-十八
一.kubernetes的网络模式 (1)Kubernetes网络需要解决的问题 集群内: 容器与容器之间的通信 Pod和Pod之间的通信 Pod和服务之间的通信 集群外: 外部应用与服务之间的通信 ...
- 博客图片失效?使用npm工具一次下载/替换所有失效的外链图片
前言 大约一个月前,微博的图片外链失效了,以及掘金因为盗链问题也于2019/06/06决定开启防盗链,造成的影响是:个人博客网站的引用了这些图片外链都不能显示. 目前微博和掘金的屏蔽,在CSDN和se ...
- Androidstudio中添加jar包的方法
在Androidstudio中添加一个jar包进去,怎么添加? 以下纯个人使用Androidstudio过程中的经验积累,要是有不足,望提出建议. 方法一: 先点击Androidstudio中的Pro ...
- 洛谷P2564 [SCOI2009]生日礼物(单调队列)
传送门 准确的来说这个应该叫尺取法? 先对所有的点按$x$坐标进行排序 我们维护两个指针$l,r$,每一次令$r$不断右移直到所有颜色齐全,再不断右移$l$直到颜色数不足,那么此时$[l-1,r]$这 ...
- 洛谷P2515 [HAOI2010]软件安装(tarjan缩点+树形dp)
传送门 我们可以把每一个$d$看做它的父亲,这样这个东西就构成了一个树形结构 问题是他有可能形成环,所以我们还需要一遍tarjan缩点 缩完点后从0向所有入度为零的点连边 然后再跑一下树形dp就行了 ...