您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

SQLServerDML触发器之AFTER触发器

2024/6/10 8:57:55发布38次查看
根据dml触发器发生的时间、编写触发器所使用的语言,可以分为after触发器、instead of触发器和clr触发器。after触发器在执行insert、update或delete语句操作之后、instead of触发器和约束之后激发。instead of在处理约束前激发,因此可以在instead of中使用
根据dml触发器发生的时间、编写触发器所使用的语言,可以分为after触发器、instead of触发器和clr触发器。after触发器在执行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
14.1.1 after触发器
一个表中可以具有多个after触发器,只要它们的名称不相同即可。每个触发器只能应用于一个表,但是一个触发器可以同时应用于一个表的三个用户操作(update、insert和delete)。
下面的语句创建了一个pritrigger表和一个detailtable,其中pritrigger表用于存放销售订单的编号和金额,detailtable表用于存放每笔订单中的产品信息。为pritrigger表的delete操作创建了一个名为pritrigger的触发器,当删除pritrigger表中的订单信息时,该触发器将删除detailtable表中该笔订单的产品信息。
use adventureworks;
go
-- 创建主表,存放销售订单编号和金额
create table pritable
(orderid int identity(1,1), ordertotal money);
go
-- 创建明细表,,存放每笔订单中的产品信息
create table detailtable
(orderid int, productid int, productcount int not null, price money);
go
-- 向主表中插入订单信息
insert into pritable values (2100.00);
insert into pritable values (1000.00);
-- 向明细表中插入订单的产品信息
insert into detailtable values (1,1,10,110.00);
insert into detailtable values (1,2,10,100.00);
insert into detailtable values (2,2,10,100.00);
go
-- 为pritrigger表创建触发器
create trigger pritrigger
on pritable
after delete
as
delete from detailtable
where orderid in (select orderid
from deleted);
print n'已经删除了detailtable表中的相关数据' -- 此句仅为演示需要,在触发器中不应当使用这样的信息语句
在定义触发器时,触发器名称在create trigger关键字之后,on子句指定要创建触发器的基表。after子句(也可以使用for来代替after关键字,二者功能相同)指定激活触发器的操作语句,可以同时指定多个操作语句。例如,“after delete, insert”表示在对表执行delete、insert语句时激活触发器。as关键字后指定触发器执行什么样的操作。
注意where条件中in子句中的deleted关键字。当从pritrigger表中删除行时,被删除的行会被复制到一个名为deleted的临时内存表中。如果为表指定了一个执行insert语句时的触发器,则在向表中插入行时,新行将同时被添加到一个名为inserted的临时内存表中。如果为表指定了一个执行update语句时的触发器,由于更新事务类似于在删除操作之后执行插入操作。因此,旧行被复制到deleted表中,然后,新行被复制到触发器表和inserted表中。
deleted表和inserted表都是由sql server自动创建和管理的,这些表的结构与定义触发器的基表的结构相同。
执行下面的语句从pritable表中删除orderid为1的行,这时触发器会自动删除detailtable表中的相关行,得到的结果和消息如图14-1所示。
delete from pritable where orderid = 1;
select * from pritable;
select * from detailtable;
图14-1 删除pritable表中orderid为1的行时得到的结果和消息
如果执行下面的语句,准备从pritable表中删除orderid为3的行。由于pritable表中并不存在这样的行,所以并不会删除成功。虽然没有删除成功,但是在消息窗口中仍然可以看到由触发器的print语句发回的信息。这说明即使语句没有影响到表中的行,也会激活触发器。在没有删除成功的情况下,deleted表是一个空表。
delete from pritable where orderid = 3;
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product