设为首页 加入收藏

TOP

数据库 触发器(一)
2019-09-17 18:49:37 】 浏览:59
Tags:数据库 触发器

触发器时为执行业务规则和保持数据完整性而提供的一种机制,它可以在执行插入、更新,删除等操作的前后自动触发。触发器与存储过程类似,但是让不接收输入\输出参数没也不能被显式调用,只能有服务器事件自动触发,根据一起执行触发器语言的不同,可将其分为DML触发器和DDL触发器

1、DML触发器

      根据DML触发器发生的时间,编写触发器所使用的语言,可以分为After触发器、instead of触发器和clr触发器。Alter触发器在执行insert、update或者delete语句操作之后,instead of 触发器和约束之后触发,instead of在处理约束前激发,因此可以再instead of 中使用其他语句来替代激发触发器的insert、update等语句,并且,还可以为基于一个或者多个基表的视图定义instead of 触发器,从而扩展视图可支持的更新类型,CLR触发器可以是After触发器或者是instead of 触发器,也可以是DDL触发器,需要注意的是,在创建dml触发器时,不能使用一下语句:

Alter database; create database;drop database;

Load database load log; reconfigure

Restore database restore log

(1)    after触发器

一个表中可以有多个after触发器,只要他们的名称不同即可。每个触发器只能应用于一个表,但是一个触发器可以应用于一个表的三个用户操作(update、insert、delete)

 下面的雨季创建了一个priTrigger,和一个Detailtable,其中priTrigger表用于存放销售订单的编号和金额,DetailTable表用于存放每笔订单的产品信息。为priTrigger表中的delete操作创建了一个名为priTrigger的触发器,当删除priTrigger表中的订单信息时,该触发器将删除DetailTable表中该订单的产品信息

--创建主表,存放订单编号和金额

create table priTrigger

( OrderId int identity(1,1),OrderTotal money)

--明细表 存放订单中的产品信息

create table Detailtable

( OrderId int,

productId int,

productCount int,

Price money)

 

insert into priTrigger values(100)

insert into priTrigger values(200)

insert into Detailtable values(1,1,10,110)

insert into Detailtable values(1,2,10,1000)

insert into Detailtable values(2,2,10,1000)

 

create trigger priTrigger1

on priTrigger

after delete

as

              delete from Detailtable

              where orderId in(

   select OrderId from deleted

  )

          在定义触发器时,触发器名称在create trigger关键字之后,on字句指定要创建触发器的基表,after字句(也可以使用for来代替after关键字,二者功能相同)指定激活触发器的操作语句,可以同时指定多个操作语句。例如“after delete,insert”标示在对表执行delete、insert 语句时激活触发器。As关键字指定触发器执行什么样的操作、注意where条件中in字句中的deleted关键字。当从priTrigger表中删除行时,被删除的行会复制到一个名为deleted的临时内存表中,如果为表指定了一个insert语句时的触发器,则在想表中插入行时,新行将同时被添加到一个名为inserted的临时内存表中。如果为表指定了一个执行update语句时的触发器。由于更新事务类似于在删除操作之后执行插入操作。因此,旧的数据行被复制到deleted表中,然后新行复制到触发器表和inserted表中

Deleted表和inserted表都是由数据库引擎自动创建和管理的,这些表的结构与定义触发器的基表的结构相同

(2)    instead of 触发器

  SqlServer服务器在执行after触发器的sql代码后,先建立临时的inserted表和deleted表,然后执行代码中对数据库操作,最后才激活触发器中的代码。而对于替代(instead of)触发器,SqlServer服务器在执行触发instead of 触发器的代码时,先建立临时的inserted表和deleted表,然后直接触发instead of触发器,而拒绝执行用户输入的DML操作语句。

--创建instead of 触发器

create trigger trig_insteadOf

on student

instead of insert

as

begin

    declare @stuAge int;

    select @stuAge=(select stu_age from inserted)

if(@stuAge >120)

    select '插入年龄错误' as '失败原因'

end

(3)    嵌套触发器

 

 如果一个触发器在执行操作时调用了另外一个触发器,而这个触发器又接着调用了下一个触发器,那么就形成了嵌套触发器。嵌套触发器在安装时就被启用,但是可以使用系统存储过程sp_configure禁用和重新启用嵌套触发器。

  嵌套触发器不一定要形成一个环,它可以 T1->T2->T3...这样一直触发下去,最多允许嵌套 32 层。如果嵌套的次数超过限制,那么该触发器将被终止,并回滚整个事务,使用嵌套触发器需要注意以下几点:

默认情况下,嵌套触发器配置选项是开启的。

在同一个触发器事务中,一个嵌套触发器不能被触发两次。

由于触发器是一个事务,如果在一系列嵌套触发器的任意层次中发生错误,则整个事物都将取消,而且所有数据回滚。

嵌套是用来保持整个数据库的完整性的重要功能,但有时可能需要禁用嵌套,如果禁用了嵌套,那么修改一个触发器的实现不会再触发该表上的任何触发器。在下述

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇数据库设计-需求分析 下一篇一起来找茬(1)-开发写的神奇左连接

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目