SQL Server:触发器详解

SQL Server:触发器详解

1. 概述

触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。 所以触发器可以用来实现对表实施复杂的完整性约束。

2. 触发器的分类

SQL Server2000提供了两种触发器:“Instead of” 和“After” 触发器。

一个表或视图的每一个修改动作(Insert、Update和Delete)都可以有一个“Instead of” 触发器,一个表的每个修改动作都可以有多个“After”触发器。

2.1 “Instead of”触发器

  • “Instead of”触发器在执行真正“插入”之前被执行。除表之外,“Instead of” 触发器也可以用于视图,用来扩展视图可以支持的更新操作。
  • “Instead of”触发器会替代所要执行的SQL语句,言下之意就是所要执行SQL并不会“真正执行”

1

2

3

4

5

6

7

8

9

alter trigger trigger_学生_Delete

on 学生

instead of Delete

as

begin

    select 学号, 姓名 from deleted

end

delete from 学生 where 学号 = 4

上例中定义了“trigger学生_Delete”触发器,该触发器从“delete”表中打印出所要删除的学生.在执行“delete”操作后,会发现“学号 = 4”的学生并未被删除, 原因在于“trigger学生Delete”替代了所要执行的“delete from 学生 where 学号 = 4”语句,而在“trigger学生_Delete”中并未真正删除学生。

2.2 “After”触发器

  • “After”触发器在Insert、Update或Deleted语句执行之后被触发。“After”触发器只能用于表。
  • “After”触发器主要用于表在修改后(insert、update或delete操作之后),来修改其他表

3. Inserted和Deleted表

SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。

  • 这两个表由系统来维护,它们存在于内存中而不是在数据库中,可以理解为一个虚拟的表。
  • 这两个表的结构总是与被该触发器作用的表的结构相同。
  • 触发器执行完成后,与该触发器相关的这两个表也被删除。
  • Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。
  • Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。
对表的操作 Inserted逻辑表 Deleted逻辑表
增加记录(insert) 存放增加的记录
删除记录(delete) 存放被删除的记录
修改记录(update) 存放更新后的记录 存放更新前的记录

4. 触发器的执行过程

  • 如果一个Insert﹑update或者delete语句违反了约束,那么这条SQL语句就没有执行成功,因此“After”触发器也不会被激活。
  • “Instead of” 触发器可以取代激发它的操作来执行。它在Inserted表和Deleted表刚刚建立,其它任何操作还没有发生时被执行。因为“Instead of” 触发器在约束之前执行,所以它可以对约束进行一些预处理。

5. 创建触发器


1

2

3

4

create trigger trigger_name

on  {table_name|view_name}

{After|Instead of} {insert|update|delete}

as 相应T-SQL语句

6. 修改触发器:


1

2

3

4

alter trigger trigger_name

on  {table_name|view_name}

{After|Instead of} {insert|update|delete}

as 相应T-SQL语句

7. 删除触发器:


1

drop trigger trigger_name

8. 查看数据库中已有触发器:

8.1 查看数据库中所有触发器


1

select * from sysobjects where xtype=‘TR‘

8.2 查看单个触发器


1

exec sp_helptext ‘触发器名‘

9. “Instead of”相关示例:

两张表:学生(学号 int, 姓名 varchar)、借书记录(学号 int, 图书编号 int)

实现功能:在删除学生表时,如果该学生仍有借书记录(未还)则不能删除


1

2

3

4

5

6

7

8

alter trigger trigger_学生_Delete

on 学生

instead of Delete

as

begin

    if not exists(select * from 借书记录, deleted where 借书记录.学号 = deleted.学号)

        delete from 学生 where 学生.学号 in (select 学号 from deleted)

end

10. “After”触发器

10.1 在“订单”表中建立触发器,当向“订单”表中插入一条订单记录时,检查“商品”表的货品状态“状态”是否为1(正在整理),则不能往“订单”表加入该订单。


1

2

3

4

5

6

7

8

9

10

create trigger trigger_订单_insert

on 订单

after insert

as

    if (select 状态 from 商品, inserted where 商品.pid = inserted.pid)=1

    begin

        print ‘the goods is being processed‘

        print ‘the order cannot be committed‘

        rollback transaction --回滚,避免加入

    end

  • 该示例中“pid”为商品编码
  • 该示例的if判断严格来讲是不准确的,因为“订单”表如果每次插入一条记录,该判断没有问题;如果一次插入多条记录,则“select 状态”返回的是多行。

10.2 在“订单”表建立一个插入触发器,在添加一条订单时,减少“商品”表相应的货品记录中的库存。


1

2

3

4

5

6

7

create trigger trigger_订单_insert2

on 订单

after insert

as

    update 商品 set 数量 = 数量 - inserted.数量

    from 商品, inserted

    where 商品.pid = inserted.pid

10.3 在“商品”表建立删除触发器,实现“商品”表和“订单”表的级联删除。


1

2

3

4

5

create trigger goodsdelete trigger_商品_delete

on 商品

after delete

as

    delete from 订单 where 订单.pid in (select pid from deleted)

10.4 在“订单”表建立一个更新触发器,监视“订单”表的“订单日期”列,使其不能被“update”.


1

2

3

4

5

6

7

8

9

create trigger trigger_订单_update

on 订单

after update

as

    if update(订单日期)

    begin

        raiserror(‘订单日期不能手动修改‘,10,1)

        rollback transaction

    end

10.5 在“订单”表建立一个插入触发器,保证向“订单”表插入的货品必须要在“商品”表中一定存在。


1

2

3

4

5

6

7

8

9

create trigger trigger_订单_insert3

on 订单

after insert

as

    if (select count(*) from 商品, inserted where 商品.pid = inserted.pid)=0

    begin

        print ‘商品不存在‘

        rollback transaction

    end

10.6 “订单”表建立一个插入触发器,保证向“订单”表插入的货品信息要在“订单日志”表中添加


1

2

3

4

5

alter trigger trigger_订单_insert

on 订单

for insert

as

    insert into 订单日志 select inserted.Id, inserted.pid,inserted.数量 from inserted

时间: 2024-10-26 12:22:15

SQL Server:触发器详解的相关文章

如何编写sql server 触发器详解

在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程.常见的触发器有三种:分别应用于Insert , Update , Delete 事件. 编写之前要了解一个关键知识.触发器用到的两个临表:Deleted , Inserted . Deleted 和 Inserted 分别存储触发事件表的"旧的一条记录"和"新的一条记录". 一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧

PHP连接 SQL Server步骤详解

php 连接sql server时遇到了不少问题,这里把详细步骤记录下来,供大家参考: 首先我的是phpstudy-5.4,如下图; 第一步:下载SQLSRV 地址:http://www.microsoft.com/en-us/download/details.aspx?id=20098  下载的是一个自解压的文件,解压后会有一堆dll文件 第二步:将对应PHP版本的dll文件copy到php ext目录下 版本是php5.4,将php_sqlsrv_54_ts.dll复制到ext目录下 第三步

SQL Server分区详解

一.SQL Server分区介绍 在SQL Server中,数据库的所有表和索引都视为已分区表和索引,默认这些表和索引值包含一个分区:也就是说表或索引至少包含一个分区.SQL Server中数据是按水平方式分区,是多行数据映射到单个分区.已经分区的表或者索引,在执行查询或者更新时,将被看作为单个逻辑实体,简单说来利用分区将一个表数据分多个表来存储,对于大数据量的表,将表分成多块查询,若只查询某个分区数据将降低消耗提高效率.需要注意的是单个索引或者表的分区必须位于一个数据库中. 在使用大量数据管理

SQL Server分区详解Partition

一.SQL Server分区介绍 在SQL Server中,数据库的所有表和索引都视为已分区表和索引,默认这些表和索引值包含一个分区:也就是说表或索引至少包含一个分区. SQL Server中数据是按水平方式分区,是多行数据映射到单个分区.已经分区的表或者索引,在执行查询或者更新时,将被看作为单个逻辑实体: 简单说来利用分区将一个表数据分多个表来存储,对于大数据量的表,将表分成多块查询,若只查询某个分区数据将降低消耗提高效率.需要注意的是单个索引或者表的分区必须位于一个数据库中. 在使用大量数据

SQL SERVER 数据类型详解(SQL Server 2008)

数据类型类别 SQL Server 中的数据类型归纳为下列类别: 数字类型 1.精确数字 2.近似数字 3.日期和时间 字符串类型 4.非Unicode字符串 4.Unicode字符串 5.二进制字符串 6.其他数据类型 7.CLR 在 SQL Server 中,根据其存储特征,某些数据类型被指定为属于下列各组: 大值数据类型:varchar(max).nvarchar(max) 和 varbinary(max) 大型对象数据类型:text.ntext.image.varchar(max).nv

Unity3D连接Sql Server数据库详解

转自:http://unity.jb51.net/chengxukaifa/shujukubiancheng/1078.html 最近一些朋友问我u3d PC端 连接数据库的问题.现在抽出一点时间,为大家写一个连接数据库以及打印出数据表中的数据案例   首先,我们需要添加一个外部引用        然后在VS 中添加引用   数据库Test的表以及数据表中的数据为大家贴上图: 好了!准备工作我们已经做好啦~~   (最后我们会提供源码文件下载地址)   接下来我们来试着连接数据库.   我就直接

问题:Oracle出发器;结果:1、Oracle触发器详解,2、Oracle触发器示例

ORACLE触发器详解 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2.3 创建替代(INSTEAD OF)触发器 8.2.3 创建系统事件触发器 8.2.4 系统触发器事件属性 8.2.5 使用触发器谓词 8.2.6 重新编译触发器 8.3 删除和使能触发器 8.4 触发器和数据字典 8.5   数据库触发器的应用举例 触发器是许多关系数据库系

SQL Server触发器

触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删除的时候会自动执行的特殊存储过程.触发器一般用在check约束更加复杂的约束上面.触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作.诸如:update.insert.delete这些操作的时候,系统会自动调用执行该表上对应的触发器.SQL Server 2005中触发器可以分为两类:DM

Tomcat主配置文件Server.xml详解

Tomcat主配置文件Server.xml详解 1.软件版本 [[email protected] META-INF]# java -version java version "1.8.0_60" Java(TM) SE Runtime Environment (build 1.8.0_60-b27) Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode) 2.server.xml组件类别 顶级组件:位于整个配置的