首页 > 数据库 > SQL Server > 正文

SQL Server中触发器简介

2023-05-29 12:05:29
字体:
来源:转载
供稿:网友

在前面的文章中,我们曾经介绍过触发器的作用,但那篇文章内容过于简单,可能大家还是不明白触发器到底是什么,其作用到底是什么,本文将较为详细地介绍一下SQL Server中触发器的相关知识。

首先,我们介绍一下什么是触发器:

触发器(trigger)是种特殊的存储过程,它的执行不是由程序调用,也不需要手动操作,它是由事件来触发,即当我们对个某个表执行增删改操作时所触发的。当对一个数据库或表进行增删改( Insert,Delete,Update)的时就会激活触发器。

从SQL2005开始,根据SQL语句的不同将触发器分成了两类,一类是DML触发器,一类是DLL触发器。其中DML触发器又分为两类:After触发器和Instead Of触发器。

其次,我们说一下SQL Server中触发器的种类:

SQL Server中的触发器,可以分为DML触发器和DDL触发器。

(1)DML(Data Manipulation Language)触发器是当数据库服务器中发生数据操作语言事件时执行的存储过程。DML触发器又分为两类:After触发器和Instead Of触发器

1)After触发器:从其名字中,我们可以知道这类触发器是在记录已经改变完之后(after),才会被激活执行,它主要是用于记录变更后的处理或检查,一旦发现错误,也可以用Rollback Transaction语句来回滚本次的操作。

2)Instead Of触发器:这类触发器一般是用来取代原本的操作,在记录变更之前发生的,它并不去执行原来SQL语句里的操作(Insert、Update、Delete),而去执行触发器本身所定义的操作。

(2)DDL触发器(Data Definition Language):DDL触发器是在响应数据定义语言事件时执行的存储过程。DDL触发器一般用于执行数据库中管理任务。如审核和规范数据库操作、防止数据库表结构被修改等。

然后,我们再说一下触发器相关的两个系统表Inserted表和Deleted表

在SQL Server里,每个DML触发器都分配有两个特殊的表,一个是Inserted表,一个是Deleted表。它们两个存在于数据库服务器的内存中,是由系统管理的逻辑表,是两个临时表,而不是真正存储在数据库中的物理表。用户对这两个表只有读取的权限,没有修改的权限。

这两个表的结构(主外键、字段、数据类型等)与触发器所在数据表的结构是完全一致的,当触发器的工作完成之后,这两个表也将会从内存中删除。

(1)Inserted表:对于插入记录操作来说,插入表里存放的是要插入的数据;对于更新记录操作来说,插入表里存放的是要更新的记录。

(2)Deleted表:对于更新记录操作来说,删除表里存放的是被更新记录;对于删除记录操作来说,删除表里存入的是被删除的旧记录。

最后,我们再说一下After触发器和Instead of触发器的的工作原理:

(1)After触发器的工作原理:

After触发器是在SQL语句执行之后才被激活的。以删除记录为例:当SQL Server接收到一条删除操作的SQL语句时,SQL Server先将要删除的记录存放在Deleted表里,然后把数据表里的记录删除,再激活After触发器,执行After触发器里的SQL语句。执行完毕之后, 删除内存中的Deleted表,操作结束。

如:在学生选课表中删除学生的某个选课记录时,触发器可以更新学生表中的选课门数,将选课门数自动减1。其执行过程如下:

1)删除时,触发该触发器,将要删除的选课记录放在删除表Deleted表里;

2)从选课表中删除该选课记录;

3)从删除表Deleted中读出该选课记录的学号,根据学号更新学生表中的选课记录。

(2)Instead Of 触发器的工作原理:

Instead Of触发器与After触发器不同。After触发器是在Insert、Update和Delete操作完成后才激活的,而Instead Of触发器,是在这些操作进行之前就激活了,并且不再去执行原来的SQL操作,而是用触发器本身的SQL语句代替原来的语句去执行。

如,我们要删除学生表中的某条记录,可能该学生有选课记录,为了避免造成选课表中产生冗余的记录,我们需要首先检查该学生是否有选课记录,如有选课记录,则首先删除该学生的选课记录,然后再删除该生信息,则可以使用Instead O触发器来实现。当然,你可能会问,为什么不使用After触发器来进行了,如果学生表和选课表之间没有建立关联关系的话,可以使用After触发器来执行操作,但是,如果两个表之间建立了关联关系,使用After触发器是不行的,原因是SQL server不允许删除一个具有被参照关系表中的记录。所以使用Instead Of触发器进行。其原理流程如下:

1)当触发器被触发时,删除操作先不进行,而是执行Instead Of中的SQL语句;

2)根据传入的学生学号,将选课记录中,所有该生的选课信息删除;

3)然后再删除该学生的信息。

好了,到此,关于触发器的基本知识讲完,下面推荐本站中的其它关于触发器知识的两篇文章:

Oracle触发器主键自动增长

Delphi”程序级触发器”功能的实现

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表