在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 库存量=库存量[email protected] where 编码[email protected]

(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 姓名[email protected] where 工号[email protected]

  end

  go

7、 结束语

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

时间: 2024-10-15 01:12:25

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

存储过程、触发器、数据完整性

存储过程.触发器.数据完整性 By TreeDream 存储过程.触发器.数据完整性存储过程创建存储过程修改存储过程删除存储过程触发器创建触发器数据完整性约束默认值创建默认值绑定默认值解除默认规则创建规则绑定和解除规则,删除 存储过程 将需要多次调用以实现某个特定任务的代码段编成一个过程 创建存储过程 create procedure exp1 as select * from Stock Go ? exec exp1 带参数的存储过程 if exists (select name from s

SQLServer创建触发器,更新表

在SQLServer,触发器,插入.更新.删除状态: CREATE TRIGGER t_inms_alarms ON [PHS].[dbo].[AlarmCurrent] FOR INSERT, DELETE AS DECLARE @rows int SELECT @rows = @@rowcount IF @rows = 0 return --如果表是插入,则同步更新AlarmsMiddleTbl IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS

SqlServer的触发器

触发器是Sqlserver响应以下任意语句而自动执行的一天T-SQL语句.delete,insert,update.表和视图支持触发器.(但是临时表不支持). 我们在哪些业务场景需要用到触发器呢? 1.每当订购一个产品时,都从库存数量中减去订购的数量. 2.每当增加一个顾客到某个数据库表时,都检查其电话号码格式是否正确,州的缩写是否为大写. 1.首先,创建触发器.触发器用create trigger语句创建.下面是一个简单的例子: create trigger newproduct_trigge

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

原贴地址: https://blog.csdn.net/reblue520/article/details/51580102 具体的方法为: 创建一个触发器 CREATE TRIGGER forbiddensa ON ALL SERVER WITH EXECUTE AS 'sa' FOR LOGON AS BEGIN --选择sa用户进行限制: IF ORIGINAL_LOGIN()= 'sa' --允许sa在本机登录"" AND (SELECT EVENTDATA().value('

sqlserver的触发器练习实例

触发器的概念:它是由事件驱动的,就像java中的监听,当某个事件发生了,就会做一些工作. 下面直接上干货,创建insert触发器.delete触发器.DDL触发器和如何查看触发器定义 1.创建三个表学生表.班级表.课程表 create database student_score GO --在数据库中创建三个表学生表.班级表.课程表的结构 use student_score GO create table student ( stu_id char(8) primary key, stu_nam

SqlServer之触发器

1.触发器之理论: 触发器(Trigger)是一种特殊类型的存储过程,是在用户对某一种表的数据进行UPDATE.INSERT 和 DELETE 操作时被触发执行的一段程序.触发器有助于强制引用完整性,以便在添加.更新或删除表中的行时保留表之间已定义的关系. 2.触发器工作原理: ① 触发器的名称.② 触发器中进行的操作.③ 触发器操作的执行过程. 3.创建触发器: 可以通过 CREATE TRIGGER 语句建立触发器,其语法格式为: CREATE TRIGGER trigger_name ON

sql server触发器实现插入时操作另一张表

以前都是也得mysql,现在写sqlserver的触发器,感觉改动还是蛮大的 1.定义变量 #在mysql中变量直接这么定义就可以了 SET @VALUE = "111"; #在sql server中 declare @count int; #并赋值 set @count =0; #如果是查询,必须这么些 select @count = count(*) from WQ_MNINF_D_REAL where [email protected]; 2.判断 在mysql中,if判断的格式

MYSQL,DB2,SQLSERVER数据库不同点浅探(一)

简单地比较一下MYSQL,DB2,SQLSERVER数据库设计不同点,为日后看MYSQL源代码先打打底,今天先比较数据库对象吧: 1.DB2上关于表有一个表空间的概念,简单地说, 表空间是数据库系统中数据库逻辑结构与操作系统物理结构之间建立映射的重要存储结构,一般来说一个表空间对应一个表.DB2在表空间上分配表空间对应表的一切物理属性,比如首次分配大小,扩展大小,页面每页初始空闲空间,空闲页面占总页面百分比等.因此,DB2上的系统DBA对表的操作更多是基于表空间上.比如因为表上的删改查不可避免地

mysql触发器(trigger)

一,触发器的优点 1,触发器的"自动性"对程序员来说,触发器是看不到的,但是他的确做事情了,如果不用触发器的话,你更新了user表的name字段时,你还要写代码去更新其他表里面的冗余字段,我举例子,只是一张表,如果是几张表都有冗余字段呢,你的代码是不是要写很多呢,看上去是不是很不爽呢.2,触发器的数据完整性触发器有回滚性,举个例子,我发现我很喜欢举子,就是你要更新五张表的数据,不会出现更新了二个张表,而另外三张表没有更新.但是如果是用php代码去写的话,就有可能出现这种情况的,比如你更