触发器概述
触发器是一个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是当某一事件发生时触发,例如当表执行deletet insert update时就会被执行。触发器是用来维护表数据的完整性
触发器分为:
-
after触发器(之后触发)
-
instead of 触发器 (之前触发)
触发器里有两章特殊的表插入表(instered表)和删除表(deleted表),这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。
对表的操作 | Inserted逻辑表 | Deleted逻辑表 |
---|---|---|
增加记录(insert) | 存放增加的记录 | 无 |
删除记录(delete) | 无 | 存放被删除的记录 |
修改记录(update) | 存放更新后的记录 | 存放更新前的记录 |
准备好两张表作为练习列子
Books表
字段 | 字段含义 | 字段类型 |
---|---|---|
ID | 书籍编号,自增 | int |
Name | 书名 | nvarchar(50) |
TypeID | 书籍类型ID | int |
BookTypes表
字段 | 字段含义 | 字段类型 |
---|---|---|
ID | 类型编号,自增 | int |
Name | 类型名 | nvarchar(50) |
Nums | 该类型下书籍数量 | int |
after触发器
创建after触发器
after触发器是在对表进行操作之后触发的。创建新增触发器语句
需求:在新增书籍的时候,对应的类型表数据要更新
--创建触发器语法
--create trigger 触发器名称
-- on 表名
-- for 操作
--as 需要执行的sql语句
create trigger tgr_bookInsert
on [dbo].[Books]
for insert
as
--定义变量,存储新增书籍的类型ID
declare @typeID int
--定义变量存储书籍类型的数量
declare @typeNums int
--找到存储新增书籍的类型ID
select @typeID=typeID from inserted
--计算出对应书籍类型的数量
select @typeNums=count(*) from [dbo].[Books] where typeID=@typeID
--更新BookTypes表
update [dbo].[BookTypes] set Nums=@typeNums
手动新增一个书籍分类,并且Nums为0
然后新增一本书
这个时候书籍分类的数量就会自动更新
instead of 触发器
instead of是在对表操作之前触发的
模拟需求:删除BookTypes表其Books表的对应的书籍类型也要删除
创建instead of触发器
create trigger tgr_deleteBookType
on [dbo].[BookTypes]
instead of delete
as
--定义变量,存储删除类型ID
declare @typeID int
select @typeID = id from deleted
--删除类型之前删除对应的书籍
delete from [dbo].[Books] where TypeID=@typeID
--删除书籍后再删除类型
delete from [dbo].[BookTypes] where id=@typeID
执行sql语句删除我们刚刚新增的书籍类型及书籍
delete from [dbo].[BookTypes] where id=4
对应的书籍类型记录已被删除
书籍类型下的书籍也被删除了