触发器
触发器是实施数据库完整性控制的一种手段,它是一种特殊类型的存储过程。
它是在用户对表中的数据进行修改、插入或删除时,由系统自动调用,而不允许用户或程序通过名称调用。
触发器是基于一个表创建的,但是可以针对多个表进行操作。
在一个表中存在三种不同操作的触发器(insert、update、delete)
SQL server 2000按触发器激活的时机可以分为两种类型:after触发器和instead of触发器
after触发器又称为后触发器,该类触发器是在引起触发器执行的修改语句成功执行后被触发执行,如果修改语句执行失败,触发器将不会执行,此类触发器只能定义在表上,且可以为每个触发操作创建多个after触发器。注:该类触发器不能创建在视图上
instead of触发器又称为替代触发器,表示不执行引起触发器执行的修改语句,而只执行触发器本身。该类触发器既可在表上定义也可在视图上定义,但对于每个触发操作,只能定义一个instead of 触发器
Deleted表和Inserted表
在触发器执行过程中,SQL server 建立并管理两个临时表:Deleted表和Inserted表。这两个特殊表用户只能查询,而不能直接修改。
在执行insert语句时被添加的记录将存储在Inserted表中
在执行delete操作时,表中被删除的记录将存储在Deleted表中
在执行update时SQL server先将要进行修改的记录存储在Deleted表中,然后将修改后的记录存储在Inserted表中
eg.有如下两个表
表一:borrower
cardID studentName studentMajor
10010 李雷 计科
10011 韩梅梅 通信
10012 林涛 网络
表二:loan
cardID bookID borrowTime
10010 1 2009-12-7 9:45
10010 2 2009-12-10 10:10
10011 3 2009-12-20 14:56
要求:对表一创建一个instead of 触发器,当删除表一中的一行时,查看该卡号在表二中是否存在,若存在就不删除,若不存在则删除
create TRIGGER [dbo].[delete_trigger]
ON [dbo].[borrower] instead of delete
AS
BEGIN
declare @cardid int
select @cardid=cardID from deleted
delete borrower where cardID=@cardid and (select count(*) from loan where cardID=@cardid)=0