? SQL Server自动创建管理的两个表(虚拟表/逻辑表)。临时驻留内存,用于系统自动测试某些数据修改(中间)效果及设置触发器操作条件。
? Deleted 表用于存储 Delete 和 Update 语句所影响的行的副本。执行 Delete 或 Update 命令时,符合条件的行从触发器表中删除并传输到 deleted 表中。
? Inserted 表用于存储 Insert 和 Update 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。
? Update事务视为先删除后插入;首先旧行被复制到 deleted 表中,而后新行被复制到触发器表和 inserted 表中。
? 只能在触发器中使用,否则会导致“对象名无效”错误。
测试:对northwind数据库shippers表创建After触发器,检验在执行Insert、Update和Delete命令时deleted和Inserted表的变化。 Create trigger ship_chage on shippers
For insert, update, delete
As
Select * from deleted
Select * from inserted
验证:
select * from shippers
Insert into shippers values('feiniao','0335-12345679')
Update shippers set companyname='kuaima' where shipperid=3 Delete from shippers where shipperid=4
触发器的嵌套
一个触发器执行操作时引发了另一个触发器,称为~。
触发器的应用
例(P.184)对Orders表填写订单信息时,只填写客户、货主号,人为插入记录后,触发器自动填充订单日期和交货日期。
Create trigger orders_insert
On Orders
For insert
As
Update orders
set orderdate=getdate(), --自动填订单日期(当前日期)
requireddate= getdate()+7 --自动填交货日期
where orderid in (
select orderid from inserted )
Go
测试:
Insert into orders (customerID, EmployeeID)
Values(?LiLAS?,?1?) --没有填写订单日期和交货日期
Go
Select * from orders
where orderid=@@identity
Go
@@IDENTITY函数可返回最后插入的标识值。
P.184 Update触发器 :
说明:未到交货期(requiredDate)之前通过和客户协商可以延迟交货(重新修改交货日期),超过交货期仍不能按时交货的不能修改订单。(执行结果与系统日期设置、orderid值有关)
(sql实例P184update触发器.sql)
--修改如下
Create trigger Orders_update
On Orders
After Update
As
Declare @T Datetime
Select @T=Requireddate From Deleted
If @T<Getdate()
Begin
Raiserror('需求日期在当前日期之后才可修改', 16, 1)
Rollback transaction --事务回滚
End
测试 update orders set requireddate ='2009/10/31' where orderid=11066
例3 P.185自动进行级联删除:如果某订单号在订单明细表order Details全部删除,则自动在订单表orders删除对应订单。
(sql实例P185delete触发器.sql)
---修改后的触发器
Create trigger Orders_delete
On [Order Details]
After delete
As
Delete from orders Where orderID = (select distinct orderid from deleted)
测试:Select * from orders Where orderid=11011
Delete from [order details] Where orderid=11011
Select * from orders Where orderid=11011
该示例可通过参照完整性控制实现。
练习 在订单表Tab0创建一个触发器,在人为添加一个订单时(货名为name,数量为quantity),系统自动减少库存表tab01相应货品记录中的库存量(storage)(货名为goodsname)。
分析:两个表数据都必须修改;利用inserted表。
Create trigger orderinsert2
On tab0
After insert
As
Update tab01 set storage = storage - inserted.quantity